Merge "Setting to bypass lock screen upon face unlock"
diff --git a/Android.bp b/Android.bp
index fb6ff0f..5e03982 100644
--- a/Android.bp
+++ b/Android.bp
@@ -225,6 +225,7 @@
"core/java/android/net/INetworkScoreService.aidl",
"core/java/android/net/INetworkStatsService.aidl",
"core/java/android/net/INetworkStatsSession.aidl",
+ "core/java/android/net/ITetheringEventCallback.aidl",
"core/java/android/net/ITetheringStatsProvider.aidl",
"core/java/android/net/nsd/INsdManager.aidl",
"core/java/android/nfc/IAppCallback.aidl",
diff --git a/api/current.txt b/api/current.txt
index b660b4f..a291a10 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1204,6 +1204,7 @@
field public static final int secondaryProgress = 16843064; // 0x1010138
field public static final int secondaryProgressTint = 16843879; // 0x1010467
field public static final int secondaryProgressTintMode = 16843880; // 0x1010468
+ field public static final int secureElementName = 16844200; // 0x10105a8
field public static final int seekBarStyle = 16842875; // 0x101007b
field public static final int segmentedButtonStyle = 16843568; // 0x1010330
field public static final int selectAllOnFocus = 16843102; // 0x101015e
@@ -3946,7 +3947,7 @@
method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException;
method @Deprecated public java.util.List<android.app.ActivityManager.RunningServiceInfo> getRunningServices(int) throws java.lang.SecurityException;
method @Deprecated public java.util.List<android.app.ActivityManager.RunningTaskInfo> getRunningTasks(int) throws java.lang.SecurityException;
- method public boolean isActivityStartAllowedOnDisplay(android.content.Context, int, android.content.Intent);
+ method public boolean isActivityStartAllowedOnDisplay(@NonNull android.content.Context, int, @NonNull android.content.Intent);
method public boolean isBackgroundRestricted();
method @Deprecated public boolean isInLockTaskMode();
method public boolean isLowRamDevice();
@@ -4453,7 +4454,7 @@
ctor public AutomaticZenRule(android.os.Parcel);
method public int describeContents();
method public android.net.Uri getConditionId();
- method public android.content.ComponentName getConfigurationActivity();
+ method @Nullable public android.content.ComponentName getConfigurationActivity();
method public long getCreationTime();
method public int getInterruptionFilter();
method public String getName();
@@ -4461,7 +4462,7 @@
method public android.service.notification.ZenPolicy getZenPolicy();
method public boolean isEnabled();
method public void setConditionId(android.net.Uri);
- method public void setConfigurationActivity(android.content.ComponentName);
+ method public void setConfigurationActivity(@Nullable android.content.ComponentName);
method public void setEnabled(boolean);
method public void setInterruptionFilter(int);
method public void setName(String);
@@ -5818,10 +5819,9 @@
method public void notify(String, int, android.app.Notification);
method public void notifyAsPackage(@NonNull String, @NonNull String, int, @NonNull android.app.Notification);
method public boolean removeAutomaticZenRule(String);
- method public void revokeNotificationDelegate();
method public void setAutomaticZenRuleState(@NonNull String, @NonNull android.service.notification.Condition);
method public final void setInterruptionFilter(int);
- method public void setNotificationDelegate(@NonNull String);
+ method public void setNotificationDelegate(@Nullable String);
method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy);
method public boolean shouldHideSilentStatusBarIcons();
method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule);
@@ -8643,9 +8643,9 @@
}
public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile {
- method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method public int getConnectionState(android.bluetooth.BluetoothDevice);
- method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
+ method @NonNull public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
+ method @NonNull public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(@NonNull int[]);
field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED";
}
@@ -9655,8 +9655,9 @@
public abstract class Context {
ctor public Context();
- method public boolean bindIsolatedService(@RequiresPermission @NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String);
+ method public boolean bindIsolatedService(@RequiresPermission @NonNull android.content.Intent, int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
method public abstract boolean bindService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int);
+ method public boolean bindService(@RequiresPermission @NonNull android.content.Intent, int, @NonNull java.util.concurrent.Executor, @NonNull android.content.ServiceConnection);
method @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)") public abstract int checkCallingOrSelfPermission(@NonNull String);
method @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)") public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
method @CheckResult(suggest="#enforceCallingPermission(String,String)") public abstract int checkCallingPermission(@NonNull String);
@@ -13779,7 +13780,7 @@
method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode);
method public void drawColor(@ColorLong long, @NonNull android.graphics.BlendMode);
method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint);
- method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint);
+ method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.RectF, @NonNull float[], @NonNull android.graphics.Paint);
method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint);
method public void drawLines(@Size(multiple=4) @NonNull float[], int, int, @NonNull android.graphics.Paint);
method public void drawLines(@Size(multiple=4) @NonNull float[], @NonNull android.graphics.Paint);
@@ -14127,8 +14128,9 @@
method public void setLightSourceGeometry(float, float, float, float);
method public void setName(@NonNull String);
method public void setOpaque(boolean);
- method public void setStopped(boolean);
method public void setSurface(@Nullable android.view.Surface);
+ method public void start();
+ method public void stop();
field public static final int SYNC_CONTEXT_IS_STOPPED = 4; // 0x4
field public static final int SYNC_FRAME_DROPPED = 8; // 0x8
field public static final int SYNC_LOST_SURFACE_REWARD_IF_FOUND = 2; // 0x2
@@ -25722,7 +25724,7 @@
public static class MediaPlayer2.TrackInfo {
method @Nullable public android.media.MediaFormat getFormat();
- method @Nullable public String getLanguage();
+ method @NonNull public String getLanguage();
method public int getTrackType();
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
@@ -25731,7 +25733,7 @@
field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
}
- public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting {
+ public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection {
ctor public MediaRecorder();
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method protected void finalize();
@@ -25761,6 +25763,8 @@
method public void setLocation(float, float);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
+ method public boolean setMicrophoneDirection(int);
+ method public boolean setMicrophoneFieldDimension(@FloatRange(from=-1.0, to=1.0) float);
method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
method public void setNextOutputFile(java.io.File) throws java.io.IOException;
method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
@@ -30085,7 +30089,7 @@
public static final class WifiNetworkSpecifier.Builder {
ctor public WifiNetworkSpecifier.Builder();
- method @NonNull public android.net.NetworkSpecifier build();
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier build();
method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress);
method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen();
@@ -30907,10 +30911,10 @@
method public boolean isDefaultServiceForCategory(android.content.ComponentName, String);
method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>);
method public boolean removeAidsForService(android.content.ComponentName, String);
- method public boolean setOffHostForService(android.content.ComponentName, String);
+ method public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String);
method public boolean setPreferredService(android.app.Activity, android.content.ComponentName);
method public boolean supportsAidPrefixRegistration();
- method public boolean unsetOffHostForService(android.content.ComponentName);
+ method public boolean unsetOffHostForService(@NonNull android.content.ComponentName);
method public boolean unsetPreferredService(android.app.Activity);
field public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT";
field public static final String CATEGORY_OTHER = "other";
@@ -41758,7 +41762,7 @@
method public int getId();
method public String getKey();
method public android.app.Notification getNotification();
- method public String getOpPkg();
+ method @NonNull public String getOpPkg();
method public String getOverrideGroupKey();
method public String getPackageName();
method public long getPostTime();
diff --git a/api/system-current.txt b/api/system-current.txt
index a15a8c5..ac2073f 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1561,23 +1561,25 @@
public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
method public boolean getAllocateAggressive();
- method public boolean getAllowDowngrade();
+ method @Deprecated public boolean getAllowDowngrade();
method public boolean getDontKillApp();
method @Nullable public String[] getGrantedRuntimePermissions();
method public boolean getInstallAsFullApp(boolean);
method public boolean getInstallAsInstantApp(boolean);
method public boolean getInstallAsVirtualPreload();
+ method public boolean getRequestDowngrade();
}
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
method @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public void setAllocateAggressive(boolean);
- method public void setAllowDowngrade(boolean);
+ method @Deprecated public void setAllowDowngrade(boolean);
method public void setDontKillApp(boolean);
method public void setEnableRollback();
method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex();
method public void setInstallAsInstantApp(boolean);
method public void setInstallAsVirtualPreload();
+ method public void setRequestDowngrade(boolean);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged();
}
@@ -1642,6 +1644,8 @@
field public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8
field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10
field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2
+ field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED = 512; // 0x200
+ field public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED = 256; // 0x100
field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1
field public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; // 0xffffffff
field public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; // 0xfffffff3
@@ -1687,7 +1691,7 @@
field public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED = 0; // 0x0
field public static final int INTENT_FILTER_VERIFICATION_FAILURE = -1; // 0xffffffff
field public static final int INTENT_FILTER_VERIFICATION_SUCCESS = 1; // 0x1
- field public static final int MASK_PERMISSION_FLAGS = 255; // 0xff
+ field @Deprecated public static final int MASK_PERMISSION_FLAGS = 255; // 0xff
field public static final int MATCH_ANY_USER = 4194304; // 0x400000
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
field public static final int MATCH_INSTANT = 8388608; // 0x800000
@@ -1705,7 +1709,7 @@
method public void onPermissionsChanged(int);
}
- @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
+ @IntDef(prefix={"FLAG_PERMISSION_"}, value={android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET, android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE, android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, android.content.pm.PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED, android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PackageManager.PermissionFlags {
}
public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -4036,11 +4040,13 @@
method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl();
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);
method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.net.Network, android.os.Bundle);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int);
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void unregisterTetheringEventCallback(@NonNull android.net.ConnectivityManager.OnTetheringEventCallback);
field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
field public static final int TETHERING_BLUETOOTH = 2; // 0x2
@@ -4061,6 +4067,11 @@
method public void onEntitlementResult(int);
}
+ public abstract static class ConnectivityManager.OnTetheringEventCallback {
+ ctor public ConnectivityManager.OnTetheringEventCallback();
+ method public void onUpstreamChanged(@Nullable android.net.Network);
+ }
+
public final class IpPrefix implements android.os.Parcelable {
ctor public IpPrefix(java.net.InetAddress, int);
ctor public IpPrefix(String);
@@ -4723,10 +4734,10 @@
public class WifiManager {
method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void addWifiUsabilityStatsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.WifiUsabilityStatsListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, android.net.wifi.WifiManager.ActionListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, android.net.wifi.WifiManager.ActionListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, @Nullable android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, @Nullable android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, @Nullable android.net.wifi.WifiManager.ActionListener);
method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(java.util.List<android.net.wifi.ScanResult>);
method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
@@ -4738,7 +4749,7 @@
method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled();
method public boolean isWifiScannerSupported();
method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void removeWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.WifiUsabilityStatsListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(android.net.wifi.WifiConfiguration, android.net.wifi.WifiManager.ActionListener);
+ method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
method @RequiresPermission("android.permission.WIFI_SET_DEVICE_MOBILITY_STATE") public void setDeviceMobilityState(int);
method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
@@ -6437,9 +6448,20 @@
package android.service.contentcapture {
+ public final class ActivityEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.content.ComponentName getComponentName();
+ method public int getEventType();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.ActivityEvent> CREATOR;
+ field public static final int TYPE_ACTIVITY_PAUSED = 2; // 0x2
+ field public static final int TYPE_ACTIVITY_RESUMED = 1; // 0x1
+ }
+
public abstract class ContentCaptureService extends android.app.Service {
ctor public ContentCaptureService();
method public final void disableContentCaptureServices();
+ method public void onActivityEvent(@NonNull android.service.contentcapture.ActivityEvent);
method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData);
method public void onConnected();
method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
@@ -9061,7 +9083,7 @@
public static class ProvisioningManager.Callback {
ctor public ProvisioningManager.Callback();
method public void onProvisioningIntChanged(int, int);
- method public void onProvisioningStringChanged(int, String);
+ method public void onProvisioningStringChanged(int, @NonNull String);
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 26c21d3..4d1d440 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -988,11 +988,29 @@
method public static boolean isEncodingLinearPcm(int);
}
+ public static final class AudioRecord.MetricsConstants {
+ field public static final String ATTRIBUTES = "android.media.audiorecord.attributes";
+ field public static final String CHANNEL_MASK = "android.media.audiorecord.channelMask";
+ field public static final String DURATION_MS = "android.media.audiorecord.durationMs";
+ field public static final String FRAME_COUNT = "android.media.audiorecord.frameCount";
+ field public static final String PORT_ID = "android.media.audiorecord.portId";
+ field public static final String START_COUNT = "android.media.audiorecord.startCount";
+ }
+
public final class AudioRecordingConfiguration implements android.os.Parcelable {
ctor public AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]);
ctor public AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String);
}
+ public static final class AudioTrack.MetricsConstants {
+ field public static final String ATTRIBUTES = "android.media.audiotrack.attributes";
+ field public static final String CHANNEL_MASK = "android.media.audiotrack.channelMask";
+ field public static final String ENCODING = "android.media.audiotrack.encoding";
+ field public static final String FRAME_COUNT = "android.media.audiotrack.frameCount";
+ field public static final String PORT_ID = "android.media.audiotrack.portId";
+ field public static final String SAMPLE_RATE = "android.media.audiotrack.sampleRate";
+ }
+
public final class BufferingParams implements android.os.Parcelable {
method public int describeContents();
method public int getInitialMarkMs();
@@ -2297,9 +2315,20 @@
package android.service.contentcapture {
+ public final class ActivityEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public android.content.ComponentName getComponentName();
+ method public int getEventType();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.ActivityEvent> CREATOR;
+ field public static final int TYPE_ACTIVITY_PAUSED = 2; // 0x2
+ field public static final int TYPE_ACTIVITY_RESUMED = 1; // 0x1
+ }
+
public abstract class ContentCaptureService extends android.app.Service {
ctor public ContentCaptureService();
method public final void disableContentCaptureServices();
+ method public void onActivityEvent(@NonNull android.service.contentcapture.ActivityEvent);
method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData);
method public void onConnected();
method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp
index f4c3e9c..889d731 100644
--- a/cmds/idmap2/libidmap2/Idmap.cpp
+++ b/cmds/idmap2/libidmap2/Idmap.cpp
@@ -55,7 +55,8 @@
map_[target_typeid].insert(std::make_pair(target_resid, overlay_resid));
}
- inline const std::map<TypeId, std::set<std::pair<ResourceId, ResourceId>>>& Map() const {
+ inline const std::map<TypeId, std::set<std::pair<ResourceId, ResourceId>>>& WARN_UNUSED
+ Map() const {
return map_;
}
@@ -287,20 +288,11 @@
bool CheckOverlayable(const LoadedPackage& target_package,
const utils::OverlayManifestInfo& overlay_info,
const PolicyBitmask& fulfilled_policies, const ResourceId& resid) {
- static constexpr const PolicyBitmask sDefaultPolicies =
- PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION |
- PolicyFlags::POLICY_PRODUCT_PARTITION | PolicyFlags::POLICY_SIGNATURE;
-
- // If the resource does not have an overlayable definition, allow the resource to be overlaid if
- // the overlay is preinstalled or signed with the same signature as the target.
- if (!target_package.DefinesOverlayable()) {
- return (sDefaultPolicies & fulfilled_policies) != 0;
- }
-
const OverlayableInfo* overlayable_info = target_package.GetOverlayableInfo(resid);
if (overlayable_info == nullptr) {
- // Do not allow non-overlayable resources to be overlaid.
- return false;
+ // If the resource does not have an overlayable definition, allow the resource to be overlaid.
+ // Once overlayable enforcement is turned on, this check will return false.
+ return !target_package.DefinesOverlayable();
}
if (overlay_info.target_name != overlayable_info->name) {
@@ -436,12 +428,6 @@
matching_resources.Add(target_resid, overlay_resid);
}
- if (matching_resources.Map().empty()) {
- out_error << "overlay \"" << overlay_apk_path << "\" does not successfully overlay any resource"
- << std::endl;
- return nullptr;
- }
-
// encode idmap data
std::unique_ptr<IdmapData> data(new IdmapData());
const auto types_end = matching_resources.Map().cend();
diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp
index 8d65428..bbfbad9 100644
--- a/cmds/idmap2/tests/IdmapTests.cpp
+++ b/cmds/idmap2/tests/IdmapTests.cpp
@@ -173,27 +173,20 @@
ASSERT_THAT(idmap, IsNull());
}
-void CreateIdmap(const StringPiece& target_apk_path, const StringPiece& overlay_apk_path,
- const PolicyBitmask& fulfilled_policies, bool enforce_overlayable,
- std::unique_ptr<const Idmap>* out_idmap) {
- std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path.to_string());
+TEST(IdmapTests, CreateIdmapFromApkAssets) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
ASSERT_THAT(target_apk, NotNull());
- std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path.to_string());
+ const std::string overlay_apk_path(GetTestDataPath() + "/overlay/overlay.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
ASSERT_THAT(overlay_apk, NotNull());
std::stringstream error;
- *out_idmap =
- Idmap::FromApkAssets(target_apk_path.to_string(), *target_apk, overlay_apk_path.to_string(),
- *overlay_apk, fulfilled_policies, enforce_overlayable, error);
-}
-
-TEST(IdmapTests, CreateIdmapFromApkAssets) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target.apk";
- std::string overlay_apk_path = GetTestDataPath() + "/overlay/overlay.apk";
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ true, &idmap);
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
+ ASSERT_THAT(idmap, NotNull());
ASSERT_THAT(idmap->GetHeader(), NotNull());
ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U);
@@ -233,12 +226,19 @@
// Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled.
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublic) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target.apk";
- std::string overlay_apk_path = GetTestDataPath() + "/system-overlay/system-overlay.apk";
- CreateIdmap(target_apk_path, overlay_apk_path,
- PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ true, &idmap);
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() + "/system-overlay/system-overlay.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
@@ -263,12 +263,21 @@
}
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target.apk";
- std::string overlay_apk_path = GetTestDataPath() + "/signature-overlay/signature-overlay.apk";
- CreateIdmap(target_apk_path, overlay_apk_path,
- PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_SIGNATURE,
- /* enforce_overlayable */ true, &idmap);
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/signature-overlay/signature-overlay.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ uint32_t policy_flags = PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_SIGNATURE;
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ policy_flags, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
@@ -289,15 +298,52 @@
ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature
}
+TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/signature-overlay/signature-overlay.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ uint32_t policy_flags = PolicyFlags::POLICY_PUBLIC;
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ policy_flags, /* enforce_overlayable */ true, error);
+ ASSERT_THAT(idmap, NotNull());
+
+ const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
+ ASSERT_EQ(dataBlocks.size(), 1U);
+
+ const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
+
+ ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
+ ASSERT_EQ(data->GetHeader()->GetTypeCount(), 0U);
+
+ const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
+ ASSERT_EQ(types.size(), 0U); // can't overlay, so contains nothing
+}
+
// Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled.
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target.apk";
- std::string overlay_apk_path =
- GetTestDataPath() + "/system-overlay-invalid/system-overlay-invalid.apk";
- CreateIdmap(target_apk_path, overlay_apk_path,
- PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ true, &idmap);
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/system-overlay-invalid/system-overlay-invalid.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
@@ -323,13 +369,20 @@
// Overlays should ignore all overlayable restrictions if enforcement of overlayable is disabled.
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalidIgnoreOverlayable) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target.apk";
- std::string overlay_apk_path =
- GetTestDataPath() + "/system-overlay-invalid/system-overlay-invalid.apk";
- CreateIdmap(target_apk_path, overlay_apk_path,
- PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ false, &idmap);
+ const std::string target_apk_path(GetTestDataPath() + "/target/target.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/system-overlay-invalid/system-overlay-invalid.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_PUBLIC,
+ /* enforce_overlayable */ false, error);
ASSERT_THAT(idmap, NotNull());
const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
@@ -356,13 +409,63 @@
ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_system_vendor
}
-// Overlays that do not specify a target <overlayable> can overlay resources defined as overlayable.
+// The resources of APKs that do not include an overlayable declaration should not restrict what
+// resources can be overlaid.
+TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsNoDefinedOverlayable) {
+ const std::string target_apk_path(GetTestDataPath() + "/target/target-no-overlayable.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() +
+ "/system-overlay-invalid/system-overlay-invalid.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
+ ASSERT_THAT(idmap, NotNull());
+
+ const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
+ ASSERT_EQ(dataBlocks.size(), 1U);
+
+ const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
+
+ ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
+ ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U);
+
+ const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
+ ASSERT_EQ(types.size(), 1U);
+
+ ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U);
+ ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
+ ASSERT_EQ(types[0]->GetEntryCount(), 7U);
+ ASSERT_EQ(types[0]->GetEntryOffset(), 3U);
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable
+ ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other
+ ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product
+ ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public
+ ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/string/policy_signature
+ ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system
+ ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_system_vendor
+}
+
+// The resources of APKs that do not include an overlayable declaration should not restrict what
+// resources can be overlaid.
TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsNoDefinedOverlayableAndNoTargetName) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target-no-overlayable.apk";
- std::string overlay_apk_path = GetTestDataPath() + "/overlay/overlay-no-name.apk";
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ false, &idmap);
+ const std::string target_apk_path(GetTestDataPath() + "/target/target-no-overlayable.apk");
+ std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path);
+ ASSERT_THAT(target_apk, NotNull());
+
+ const std::string overlay_apk_path(GetTestDataPath() + "/overlay/overlay-no-name.apk");
+ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path);
+ ASSERT_THAT(overlay_apk, NotNull());
+
+ std::stringstream error;
+ std::unique_ptr<const Idmap> idmap =
+ Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk,
+ PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error);
ASSERT_THAT(idmap, NotNull());
const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
@@ -380,81 +483,16 @@
ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
ASSERT_EQ(types[0]->GetEntryCount(), 1U);
ASSERT_EQ(types[0]->GetEntryOffset(), 0U);
- ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/int1
+ ASSERT_EQ(types[0]->GetEntry(0), 0x0000U);
ASSERT_EQ(types[1]->GetTargetTypeId(), 0x02U);
ASSERT_EQ(types[1]->GetOverlayTypeId(), 0x02U);
ASSERT_EQ(types[1]->GetEntryCount(), 4U);
ASSERT_EQ(types[1]->GetEntryOffset(), 10U);
- ASSERT_EQ(types[1]->GetEntry(0), 0x0000U); // string/str1
- ASSERT_EQ(types[1]->GetEntry(1), kNoEntry); // string/str2
- ASSERT_EQ(types[1]->GetEntry(2), 0x0001U); // string/str3
- ASSERT_EQ(types[1]->GetEntry(3), 0x0002U); // string/str4
-}
-
-// Overlays that are not pre-installed and are not signed with the same signature as the target
-// cannot overlay packages that have not defined overlayable resources.
-TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsDefaultPoliciesPublicFail) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target-no-overlayable.apk";
- std::string overlay_apk_path = GetTestDataPath() + "/overlay/overlay-no-name.apk";
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_PUBLIC,
- /* enforce_overlayable */ true, &idmap);
- ASSERT_THAT(idmap, IsNull());
-}
-
-// Overlays that are pre-installed or are signed with the same signature as the target can overlay
-// packages that have not defined overlayable resources.
-TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsDefaultPolicies) {
- std::unique_ptr<const Idmap> idmap;
- std::string target_apk_path = GetTestDataPath() + "/target/target-no-overlayable.apk";
- std::string overlay_apk_path =
- GetTestDataPath() + "/system-overlay-invalid/system-overlay-invalid.apk";
-
- auto CheckEntries = [&]() -> void {
- const std::vector<std::unique_ptr<const IdmapData>>& dataBlocks = idmap->GetData();
- ASSERT_EQ(dataBlocks.size(), 1U);
-
- const std::unique_ptr<const IdmapData>& data = dataBlocks[0];
-
- ASSERT_EQ(data->GetHeader()->GetTargetPackageId(), 0x7fU);
- ASSERT_EQ(data->GetHeader()->GetTypeCount(), 1U);
-
- const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries();
- ASSERT_EQ(types.size(), 1U);
-
- ASSERT_EQ(types[0]->GetTargetTypeId(), 0x02U);
- ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U);
- ASSERT_EQ(types[0]->GetEntryCount(), 7U);
- ASSERT_EQ(types[0]->GetEntryOffset(), 3U);
- ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/not_overlayable
- ASSERT_EQ(types[0]->GetEntry(1), 0x0001U); // string/other
- ASSERT_EQ(types[0]->GetEntry(2), 0x0002U); // string/policy_product
- ASSERT_EQ(types[0]->GetEntry(3), 0x0003U); // string/policy_public
- ASSERT_EQ(types[0]->GetEntry(4), 0x0004U); // string/string/policy_signature
- ASSERT_EQ(types[0]->GetEntry(5), 0x0005U); // string/policy_system
- ASSERT_EQ(types[0]->GetEntry(6), 0x0006U); // string/policy_system_vendor
- };
-
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_SIGNATURE,
- /* enforce_overlayable */ true, &idmap);
- ASSERT_THAT(idmap, NotNull());
- CheckEntries();
-
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_PRODUCT_PARTITION,
- /* enforce_overlayable */ true, &idmap);
- ASSERT_THAT(idmap, NotNull());
- CheckEntries();
-
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_SYSTEM_PARTITION,
- /* enforce_overlayable */ true, &idmap);
- ASSERT_THAT(idmap, NotNull());
- CheckEntries();
-
- CreateIdmap(target_apk_path, overlay_apk_path, PolicyFlags::POLICY_VENDOR_PARTITION,
- /* enforce_overlayable */ true, &idmap);
- ASSERT_THAT(idmap, NotNull());
- CheckEntries();
+ ASSERT_EQ(types[1]->GetEntry(0), 0x0000U);
+ ASSERT_EQ(types[1]->GetEntry(1), kNoEntry);
+ ASSERT_EQ(types[1]->GetEntry(2), 0x0001U);
+ ASSERT_EQ(types[1]->GetEntry(3), 0x0002U);
}
TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) {
diff --git a/cmds/idmap2/tests/data/overlay/build b/cmds/idmap2/tests/data/overlay/build
index 68b9f50..e879f44 100755
--- a/cmds/idmap2/tests/data/overlay/build
+++ b/cmds/idmap2/tests/data/overlay/build
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FRAMEWORK_RES_APK=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
+FRAMEWORK_RES_APK="${ANDROID_BUILD_TOP}/out/target/common/obj/APPS/framework-res_intermediates/package-export.apk"
aapt2 compile --dir res -o compiled.flata
diff --git a/cmds/idmap2/tests/data/overlay/overlay-no-name.apk b/cmds/idmap2/tests/data/overlay/overlay-no-name.apk
index 6425190..7d23c09 100644
--- a/cmds/idmap2/tests/data/overlay/overlay-no-name.apk
+++ b/cmds/idmap2/tests/data/overlay/overlay-no-name.apk
Binary files differ
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 4e540b1..b812c80 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -521,7 +521,7 @@
ADD_PSS_EXTERNAL_SLOW = 4;
}
optional Type type = 7;
- optional int64 duration = 8;
+ optional int64 duration_millis = 8;
}
/**
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index c067f9d..023371d 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2018,7 +2018,8 @@
* @return {@code true} if a call to start an activity on the target display is allowed for the
* provided context and no {@link SecurityException} will be thrown, {@code false} otherwise.
*/
- public boolean isActivityStartAllowedOnDisplay(Context context, int displayId, Intent intent) {
+ public boolean isActivityStartAllowedOnDisplay(@NonNull Context context, int displayId,
+ @NonNull Intent intent) {
try {
return getTaskService().isActivityStartAllowedOnDisplay(displayId, intent,
intent.resolveTypeIfNeeded(context.getContentResolver()), context.getUserId());
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index c0a702f..08239a1 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3115,6 +3115,10 @@
if (!r.stopped) {
throw new IllegalStateException("Can't start activity that is not stopped.");
}
+ if (r.activity.mFinished) {
+ // TODO(lifecycler): How can this happen?
+ return;
+ }
// Start
activity.performStart("handleStartActivity");
@@ -3237,8 +3241,6 @@
if (!r.activity.mFinished && pendingActions != null) {
pendingActions.setOldState(r.state);
pendingActions.setRestoreInstanceState(true);
- }
- if (pendingActions != null) {
pendingActions.setCallOnPostCreate(true);
}
} else {
@@ -3940,7 +3942,7 @@
if (localLOGV) {
Slog.v(TAG, "Performing resume of " + r + " finished=" + r.activity.mFinished);
}
- if (r == null) {
+ if (r == null || r.activity.mFinished) {
return null;
}
if (r.getLifecycleState() == ON_RESUME) {
@@ -4210,6 +4212,12 @@
private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason,
PendingTransactionActions pendingActions) {
if (r.paused) {
+ if (r.activity.mFinished) {
+ // If we are finishing, we won't call onResume() in certain cases.
+ // So here we likewise don't want to call onPause() if the activity
+ // isn't resumed.
+ return null;
+ }
RuntimeException e = new RuntimeException(
"Performing pause of activity that is not resumed: "
+ r.intent.getComponent().toShortString());
@@ -4329,13 +4337,20 @@
boolean saveState, boolean finalStateRequest, String reason) {
if (localLOGV) Slog.v(TAG, "Performing stop of " + r);
if (r != null) {
- if (!keepShown && r.stopped && !finalStateRequest) {
- // Double stop request is possible if activity receives 'sleep' followed by 'stop'.
- final RuntimeException e = new RuntimeException(
- "Performing stop of activity that is already stopped: "
- + r.intent.getComponent().toShortString());
- Slog.e(TAG, e.getMessage(), e);
- Slog.e(TAG, r.getStateString());
+ if (!keepShown && r.stopped) {
+ if (r.activity.mFinished) {
+ // If we are finishing, we won't call onResume() in certain
+ // cases. So here we likewise don't want to call onStop()
+ // if the activity isn't resumed.
+ return;
+ }
+ if (!finalStateRequest) {
+ final RuntimeException e = new RuntimeException(
+ "Performing stop of activity that is already stopped: "
+ + r.intent.getComponent().toShortString());
+ Slog.e(TAG, e.getMessage(), e);
+ Slog.e(TAG, r.getStateString());
+ }
}
// One must first be paused before stopped...
diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java
index 010a900..ec2825e 100644
--- a/core/java/android/app/AutomaticZenRule.java
+++ b/core/java/android/app/AutomaticZenRule.java
@@ -136,7 +136,7 @@
* Returns the {@link ComponentName} of the activity that shows configuration options
* for this rule.
*/
- public ComponentName getConfigurationActivity() {
+ public @Nullable ComponentName getConfigurationActivity() {
return configurationActivity;
}
@@ -237,9 +237,10 @@
/**
* Sets the configuration activity - an activity that handles
* {@link NotificationManager#ACTION_AUTOMATIC_ZEN_RULE} that shows the user more information
- * about this rule and/or allows them to configure it.
+ * about this rule and/or allows them to configure it. This is required to be non-null for rules
+ * that are not backed by {@link android.service.notification.ConditionProviderService}.
*/
- public void setConfigurationActivity(ComponentName componentName) {
+ public void setConfigurationActivity(@Nullable ComponentName componentName) {
this.configurationActivity = componentName;
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index daf2366..5945eef 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -145,10 +145,17 @@
}
@Override
- public boolean bindIsolatedService(Intent service, ServiceConnection conn, int flags,
- String instanceName) {
+ public boolean bindService(
+ Intent service, int flags, Executor executor, ServiceConnection conn) {
throw new ReceiverCallNotAllowedException(
- "BroadcastReceiver components are not allowed to bind to services");
+ "BroadcastReceiver components are not allowed to bind to services");
+ }
+
+ @Override
+ public boolean bindIsolatedService(Intent service, int flags, String instanceName,
+ Executor executor, ServiceConnection conn) {
+ throw new ReceiverCallNotAllowedException(
+ "BroadcastReceiver components are not allowed to bind to services");
}
}
@@ -1639,28 +1646,34 @@
}
@Override
- public boolean bindService(Intent service, ServiceConnection conn,
- int flags) {
+ public boolean bindService(Intent service, ServiceConnection conn, int flags) {
warnIfCallingFromSystemProcess();
- return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), getUser());
+ return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), null,
+ getUser());
}
@Override
- public boolean bindIsolatedService(Intent service, ServiceConnection conn,
- int flags, String instanceName) {
+ public boolean bindService(
+ Intent service, int flags, Executor executor, ServiceConnection conn) {
+ warnIfCallingFromSystemProcess();
+ return bindServiceCommon(service, conn, flags, null, null, executor, getUser());
+ }
+
+ @Override
+ public boolean bindIsolatedService(Intent service, int flags, String instanceName,
+ Executor executor, ServiceConnection conn) {
warnIfCallingFromSystemProcess();
if (instanceName == null) {
throw new NullPointerException("null instanceName");
}
- return bindServiceCommon(service, conn, flags, instanceName, mMainThread.getHandler(),
- getUser());
+ return bindServiceCommon(service, conn, flags, instanceName, null, executor, getUser());
}
/** @hide */
@Override
public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
UserHandle user) {
- return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), user);
+ return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), null, user);
}
/** @hide */
@@ -1670,7 +1683,7 @@
if (handler == null) {
throw new IllegalArgumentException("handler must not be null.");
}
- return bindServiceCommon(service, conn, flags, null, handler, user);
+ return bindServiceCommon(service, conn, flags, null, handler, null, user);
}
/** @hide */
@@ -1693,15 +1706,21 @@
}
private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
- String instanceName, Handler
- handler, UserHandle user) {
+ String instanceName, Handler handler, Executor executor, UserHandle user) {
// Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser.
IServiceConnection sd;
if (conn == null) {
throw new IllegalArgumentException("connection is null");
}
+ if (handler != null && executor != null) {
+ throw new IllegalArgumentException("Handler and Executor both supplied");
+ }
if (mPackageInfo != null) {
- sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
+ if (executor != null) {
+ sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), executor, flags);
+ } else {
+ sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
+ }
} else {
throw new RuntimeException("Not supported in system context");
}
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index e1da08b..29e6807 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -192,7 +192,6 @@
ParceledListSlice getAppActiveNotifications(String callingPkg, int userId);
void setNotificationDelegate(String callingPkg, String delegate);
- void revokeNotificationDelegate(String callingPkg);
String getNotificationDelegate(String callingPkg);
boolean canNotifyAsPackage(String callingPkg, String targetPkg);
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 5d186a2..db8c905 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -76,6 +76,7 @@
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.Executor;
final class IntentReceiverLeaked extends AndroidRuntimeException {
@UnsupportedAppUsage
@@ -1651,6 +1652,16 @@
@UnsupportedAppUsage
public final IServiceConnection getServiceDispatcher(ServiceConnection c,
Context context, Handler handler, int flags) {
+ return getServiceDispatcherCommon(c, context, handler, null, flags);
+ }
+
+ public final IServiceConnection getServiceDispatcher(ServiceConnection c,
+ Context context, Executor executor, int flags) {
+ return getServiceDispatcherCommon(c, context, null, executor, flags);
+ }
+
+ private IServiceConnection getServiceDispatcherCommon(ServiceConnection c,
+ Context context, Handler handler, Executor executor, int flags) {
synchronized (mServices) {
LoadedApk.ServiceDispatcher sd = null;
ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> map = mServices.get(context);
@@ -1659,7 +1670,11 @@
sd = map.get(c);
}
if (sd == null) {
- sd = new ServiceDispatcher(c, context, handler, flags);
+ if (executor != null) {
+ sd = new ServiceDispatcher(c, context, executor, flags);
+ } else {
+ sd = new ServiceDispatcher(c, context, handler, flags);
+ }
if (DEBUG) Slog.d(TAG, "Creating new dispatcher " + sd + " for conn " + c);
if (map == null) {
map = new ArrayMap<>();
@@ -1667,7 +1682,7 @@
}
map.put(c, sd);
} else {
- sd.validate(context, handler);
+ sd.validate(context, handler, executor);
}
return sd.getIServiceConnection();
}
@@ -1744,6 +1759,7 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
private final Context mContext;
private final Handler mActivityThread;
+ private final Executor mActivityExecutor;
private final ServiceConnectionLeaked mLocation;
private final int mFlags;
@@ -1783,12 +1799,25 @@
mConnection = conn;
mContext = context;
mActivityThread = activityThread;
+ mActivityExecutor = null;
mLocation = new ServiceConnectionLeaked(null);
mLocation.fillInStackTrace();
mFlags = flags;
}
- void validate(Context context, Handler activityThread) {
+ ServiceDispatcher(ServiceConnection conn,
+ Context context, Executor activityExecutor, int flags) {
+ mIServiceConnection = new InnerConnection(this);
+ mConnection = conn;
+ mContext = context;
+ mActivityThread = null;
+ mActivityExecutor = activityExecutor;
+ mLocation = new ServiceConnectionLeaked(null);
+ mLocation.fillInStackTrace();
+ mFlags = flags;
+ }
+
+ void validate(Context context, Handler activityThread, Executor activityExecutor) {
if (mContext != context) {
throw new RuntimeException(
"ServiceConnection " + mConnection +
@@ -1801,6 +1830,12 @@
" registered with differing handler (was " +
mActivityThread + " now " + activityThread + ")");
}
+ if (mActivityExecutor != activityExecutor) {
+ throw new RuntimeException(
+ "ServiceConnection " + mConnection +
+ " registered with differing executor (was " +
+ mActivityExecutor + " now " + activityExecutor + ")");
+ }
}
void doForget() {
@@ -1840,7 +1875,9 @@
}
public void connected(ComponentName name, IBinder service, boolean dead) {
- if (mActivityThread != null) {
+ if (mActivityExecutor != null) {
+ mActivityExecutor.execute(new RunConnection(name, service, 0, dead));
+ } else if (mActivityThread != null) {
mActivityThread.post(new RunConnection(name, service, 0, dead));
} else {
doConnected(name, service, dead);
@@ -1848,7 +1885,9 @@
}
public void death(ComponentName name, IBinder service) {
- if (mActivityThread != null) {
+ if (mActivityExecutor != null) {
+ mActivityExecutor.execute(new RunConnection(name, service, 1, false));
+ } else if (mActivityThread != null) {
mActivityThread.post(new RunConnection(name, service, 1, false));
} else {
doDeath(name, service);
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index edf86f9..ed7aa4a 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -589,11 +589,11 @@
* received on your behalf from the cloud, without your process having to wake up.
*
* You can check if you have an allowed delegate with {@link #getNotificationDelegate()} and
- * revoke your delegate with {@link #revokeNotificationDelegate()}.
+ * revoke your delegate by passing null to this method.
*
* @param delegate Package name of the app which can send notifications on your behalf.
*/
- public void setNotificationDelegate(@NonNull String delegate) {
+ public void setNotificationDelegate(@Nullable String delegate) {
INotificationManager service = getService();
String pkg = mContext.getPackageName();
if (localLOGV) Log.v(TAG, pkg + ": cancelAll()");
@@ -605,20 +605,6 @@
}
/**
- * Revokes permission for your {@link #setNotificationDelegate(String) notification delegate}
- * to post notifications on your behalf.
- */
- public void revokeNotificationDelegate() {
- INotificationManager service = getService();
- String pkg = mContext.getPackageName();
- try {
- service.revokeNotificationDelegate(pkg);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Returns the {@link #setNotificationDelegate(String) delegate} that can post notifications on
* your behalf, if there currently is one.
*/
diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java
index 82cc1bc..b4eaab2 100644
--- a/core/java/android/bluetooth/BluetoothHearingAid.java
+++ b/core/java/android/bluetooth/BluetoothHearingAid.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
@@ -303,7 +304,7 @@
* {@inheritDoc}
*/
@Override
- public List<BluetoothDevice> getConnectedDevices() {
+ public @NonNull List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
try {
mServiceLock.readLock().lock();
@@ -323,8 +324,8 @@
/**
* {@inheritDoc}
*/
- @Override
- public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
+ @Override public @NonNull List<BluetoothDevice> getDevicesMatchingConnectionStates(
+ @NonNull int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
try {
mServiceLock.readLock().lock();
@@ -345,7 +346,7 @@
* {@inheritDoc}
*/
@Override
- public int getConnectionState(BluetoothDevice device) {
+ public int getConnectionState(@NonNull BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
try {
mServiceLock.readLock().lock();
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 41995288..f28718c 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -17,6 +17,7 @@
package android.content;
import android.annotation.AttrRes;
+import android.annotation.CallbackExecutor;
import android.annotation.CheckResult;
import android.annotation.ColorInt;
import android.annotation.ColorRes;
@@ -2967,26 +2968,40 @@
@NonNull ServiceConnection conn, @BindServiceFlags int flags);
/**
+ * Same as {@link #bindService(Intent, ServiceConnection, int)} with executor to control
+ * ServiceConnection callbacks.
+ * @param executor Callbacks on ServiceConnection will be called on executor. Must use same
+ * instance for the same instance of ServiceConnection.
+ */
+ public boolean bindService(@RequiresPermission @NonNull Intent service,
+ @BindServiceFlags int flags, @NonNull @CallbackExecutor Executor executor,
+ @NonNull ServiceConnection conn) {
+ throw new RuntimeException("Not implemented. Must override in a subclass.");
+ }
+
+ /**
* Variation of {@link #bindService} that, in the specific case of isolated
* services, allows the caller to generate multiple instances of a service
* from a single component declaration.
*
* @param service Identifies the service to connect to. The Intent must
* specify an explicit component name.
- * @param conn Receives information as the service is started and stopped.
- * This must be a valid ServiceConnection object; it must not be null.
* @param flags Operation options for the binding as per {@link #bindService}.
* @param instanceName Unique identifier for the service instance. Each unique
* name here will result in a different service instance being created.
* @return Returns success of binding as per {@link #bindService}.
+ * @param executor Callbacks on ServiceConnection will be called on executor.
+ * Must use same instance for the same instance of ServiceConnection.
+ * @param conn Receives information as the service is started and stopped.
+ * This must be a valid ServiceConnection object; it must not be null.
*
* @throws SecurityException If the caller does not have permission to access the service
*
* @see #bindService
*/
public boolean bindIsolatedService(@RequiresPermission @NonNull Intent service,
- @NonNull ServiceConnection conn, @BindServiceFlags int flags,
- @NonNull String instanceName) {
+ @BindServiceFlags int flags, @NonNull String instanceName,
+ @NonNull @CallbackExecutor Executor executor, @NonNull ServiceConnection conn) {
throw new RuntimeException("Not implemented. Must override in a subclass.");
}
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 40559d3..0859f97 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -706,9 +706,15 @@
}
@Override
- public boolean bindIsolatedService(Intent service, ServiceConnection conn,
- int flags, String instanceName) {
- return mBase.bindIsolatedService(service, conn, flags, instanceName);
+ public boolean bindService(Intent service, int flags, Executor executor,
+ ServiceConnection conn) {
+ return mBase.bindService(service, flags, executor, conn);
+ }
+
+ @Override
+ public boolean bindIsolatedService(Intent service, int flags, String instanceName,
+ Executor executor, ServiceConnection conn) {
+ return mBase.bindIsolatedService(service, flags, instanceName, executor, conn);
}
/** @hide */
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 4f09d5a..706cbbf 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -43,6 +43,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.text.Collator;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
@@ -2028,6 +2029,27 @@
return this;
}
+ /**
+ * Return all the APK paths that may be required to load this application, including all
+ * splits, shared libraries, and resource overlays.
+ * @hide
+ */
+ public String[] getAllApkPaths() {
+ final String[][] inputLists = { splitSourceDirs, sharedLibraryFiles, resourceDirs };
+ final List<String> output = new ArrayList<>(10);
+ if (sourceDir != null) {
+ output.add(sourceDir);
+ }
+ for (String[] inputList : inputLists) {
+ if (inputList != null) {
+ for (String input : inputList) {
+ output.add(input);
+ }
+ }
+ }
+ return output.toArray(new String[output.size()]);
+ }
+
/** {@hide} */ public void setCodePath(String codePath) { scanSourceDir = codePath; }
/** {@hide} */ public void setBaseCodePath(String baseCodePath) { sourceDir = baseCodePath; }
/** {@hide} */ public void setSplitCodePaths(String[] splitCodePaths) { splitSourceDirs = splitCodePaths; }
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 7de8105..d758c4d 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1342,8 +1342,8 @@
* @hide
*/
public boolean areHiddenOptionsSet() {
- return (installFlags & (PackageManager.INSTALL_ALLOW_DOWNGRADE
- | PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE
+ return (installFlags & (PackageManager.INSTALL_REQUEST_DOWNGRADE
+ | PackageManager.INSTALL_ALLOW_DOWNGRADE
| PackageManager.INSTALL_DONT_KILL_APP
| PackageManager.INSTALL_INSTANT_APP
| PackageManager.INSTALL_FULL_APP
@@ -1455,13 +1455,23 @@
installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK;
}
+ /**
+ * @deprecated use {@link #setRequestDowngrade(boolean)}.
+ * {@hide}
+ */
+ @SystemApi
+ @Deprecated
+ public void setAllowDowngrade(boolean allowDowngrade) {
+ setRequestDowngrade(allowDowngrade);
+ }
+
/** {@hide} */
@SystemApi
- public void setAllowDowngrade(boolean allowDowngrade) {
- if (allowDowngrade) {
- installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ public void setRequestDowngrade(boolean requestDowngrade) {
+ if (requestDowngrade) {
+ installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE;
} else {
- installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ installFlags &= ~PackageManager.INSTALL_REQUEST_DOWNGRADE;
}
}
@@ -1982,11 +1992,23 @@
/**
* Get the value set in {@link SessionParams#setAllowDowngrade(boolean)}.
*
+ * @deprecated use {@link #getRequestDowngrade()}.
* @hide
*/
@SystemApi
+ @Deprecated
public boolean getAllowDowngrade() {
- return (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0;
+ return getRequestDowngrade();
+ }
+
+ /**
+ * Get the value set in {@link SessionParams#setRequestDowngrade(boolean)}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean getRequestDowngrade() {
+ return (installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0;
}
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index c133fba..7d05d50 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -710,7 +710,7 @@
INSTALL_INTERNAL,
INSTALL_FROM_ADB,
INSTALL_ALL_USERS,
- INSTALL_ALLOW_DOWNGRADE,
+ INSTALL_REQUEST_DOWNGRADE,
INSTALL_GRANT_RUNTIME_PERMISSIONS,
INSTALL_FORCE_VOLUME_UUID,
INSTALL_FORCE_PERMISSION_PROMPT,
@@ -721,7 +721,7 @@
INSTALL_VIRTUAL_PRELOAD,
INSTALL_APEX,
INSTALL_ENABLE_ROLLBACK,
- INSTALL_RESPECT_ALLOW_DOWNGRADE,
+ INSTALL_ALLOW_DOWNGRADE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface InstallFlags {}
@@ -768,14 +768,21 @@
public static final int INSTALL_ALL_USERS = 0x00000040;
/**
- * Flag parameter for {@link #installPackage} to indicate that it is okay
- * to install an update to an app where the newly installed app has a lower
- * version code than the currently installed app. This is permitted only if
- * the currently installed app is marked debuggable.
+ * Flag parameter for {@link #installPackage} to indicate that an upgrade to a lower version
+ * of a package than currently installed has been requested.
+ *
+ * <p>Note that this flag doesn't guarantee that downgrade will be performed. That decision
+ * depends
+ * on whenever:
+ * <ul>
+ * <li>An app is debuggable.
+ * <li>Or a build is debuggable.
+ * <li>Or {@link #INSTALL_ALLOW_DOWNGRADE} is set.
+ * </ul>
*
* @hide
*/
- public static final int INSTALL_ALLOW_DOWNGRADE = 0x00000080;
+ public static final int INSTALL_REQUEST_DOWNGRADE = 0x00000080;
/**
* Flag parameter for {@link #installPackage} to indicate that all runtime
@@ -868,12 +875,11 @@
/**
* Flag parameter for {@link #installPackage} to indicate that
- * {@link #INSTALL_ALLOW_DOWNGRADE} should be respected.
+ * {@link #INSTALL_REQUEST_DOWNGRADE} should be allowed.
*
* @hide
*/
- // TODO(b/127322579): rename
- public static final int INSTALL_RESPECT_ALLOW_DOWNGRADE = 0x00100000;
+ public static final int INSTALL_ALLOW_DOWNGRADE = 0x00100000;
/** @hide */
@IntDef(flag = true, prefix = { "DONT_KILL_APP" }, value = {
@@ -3041,14 +3047,44 @@
public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 1 << 7;
/**
- * Mask for all permission flags.
+ * Permission flag: The permission's usage should be made highly visible to the user
+ * when granted.
*
* @hide
*/
@SystemApi
+ public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED = 1 << 8;
+
+ /**
+ * Permission flag: The permission's usage should be made highly visible to the user
+ * when denied.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED = 1 << 9;
+
+ /**
+ * Mask for all permission flags present in Android P
+ *
+ * @deprecated This constant does not contain useful information and should never have been
+ * exposed. When checking permission flags always flag each flag explicitly and ignore all
+ * flags that do not matter for this particular code.
+ *
+ * @hide
+ */
+ @Deprecated
+ @SystemApi
public static final int MASK_PERMISSION_FLAGS = 0xFF;
/**
+ * Mask for all permission flags.
+ *
+ * @hide
+ */
+ public static final int MASK_PERMISSION_FLAGS_ALL = 0x3FF;
+
+ /**
* Injected activity in app that forwards user to setting activity of that app.
*
* @hide
@@ -3755,6 +3791,8 @@
FLAG_PERMISSION_REVOKE_ON_UPGRADE,
FLAG_PERMISSION_SYSTEM_FIXED,
FLAG_PERMISSION_GRANTED_BY_DEFAULT,
+ FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED,
+ FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED,
/*
FLAG_PERMISSION_REVOKE_WHEN_REQUESED
*/
@@ -6542,6 +6580,8 @@
case FLAG_PERMISSION_USER_FIXED: return "USER_FIXED";
case FLAG_PERMISSION_REVIEW_REQUIRED: return "REVIEW_REQUIRED";
case FLAG_PERMISSION_REVOKE_WHEN_REQUESTED: return "REVOKE_WHEN_REQUESTED";
+ case FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED: return "USER_SENSITIVE_WHEN_GRANTED";
+ case FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED: return "USER_SENSITIVE_WHEN_DENIED";
default: return Integer.toString(flag);
}
}
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index ac863b2..81abdea0 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -1174,6 +1174,7 @@
{
private final Camera mCamera;
+ @UnsupportedAppUsage
public EventHandler(Camera c, Looper looper) {
super(looper);
mCamera = c;
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 0497f8c..fb0821e 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -56,6 +56,7 @@
import android.util.Log;
import android.util.SparseIntArray;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.ITelephony;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.Preconditions;
@@ -2542,6 +2543,94 @@
}
/**
+ * Callback for use with {@link registerTetheringEventCallback} to find out tethering
+ * upstream status.
+ *
+ *@hide
+ */
+ @SystemApi
+ public abstract static class OnTetheringEventCallback {
+
+ /**
+ * Called when tethering upstream changed. This can be called multiple times and can be
+ * called any time.
+ *
+ * @param network the {@link Network} of tethering upstream. Null means tethering doesn't
+ * have any upstream.
+ */
+ public void onUpstreamChanged(@Nullable Network network) {}
+ }
+
+ @GuardedBy("mTetheringEventCallbacks")
+ private final ArrayMap<OnTetheringEventCallback, ITetheringEventCallback>
+ mTetheringEventCallbacks = new ArrayMap<>();
+
+ /**
+ * Start listening to tethering change events. Any new added callback will receive the last
+ * tethering status right away. If callback is registered when tethering loses its upstream or
+ * disabled, {@link OnTetheringEventCallback#onUpstreamChanged} will immediately be called
+ * with a null argument. The same callback object cannot be registered twice.
+ *
+ * @param executor the executor on which callback will be invoked.
+ * @param callback the callback to be called when tethering has change events.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
+ public void registerTetheringEventCallback(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull final OnTetheringEventCallback callback) {
+ Preconditions.checkNotNull(callback, "OnTetheringEventCallback cannot be null.");
+
+ synchronized (mTetheringEventCallbacks) {
+ Preconditions.checkArgument(!mTetheringEventCallbacks.containsKey(callback),
+ "callback was already registered.");
+ ITetheringEventCallback remoteCallback = new ITetheringEventCallback.Stub() {
+ @Override
+ public void onUpstreamChanged(Network network) throws RemoteException {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> {
+ callback.onUpstreamChanged(network);
+ }));
+ }
+ };
+ try {
+ String pkgName = mContext.getOpPackageName();
+ Log.i(TAG, "registerTetheringUpstreamCallback:" + pkgName);
+ mService.registerTetheringEventCallback(remoteCallback, pkgName);
+ mTetheringEventCallbacks.put(callback, remoteCallback);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Remove tethering event callback previously registered with
+ * {@link #registerTetheringEventCallback}.
+ *
+ * @param callback previously registered callback.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
+ public void unregisterTetheringEventCallback(
+ @NonNull final OnTetheringEventCallback callback) {
+ synchronized (mTetheringEventCallbacks) {
+ ITetheringEventCallback remoteCallback = mTetheringEventCallbacks.remove(callback);
+ Preconditions.checkNotNull(remoteCallback, "callback was not registered.");
+ try {
+ String pkgName = mContext.getOpPackageName();
+ Log.i(TAG, "unregisterTetheringEventCallback:" + pkgName);
+ mService.unregisterTetheringEventCallback(remoteCallback, pkgName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+
+ /**
* Get the list of regular expressions that define any tetherable
* USB network interfaces. If USB tethering is not supported by the
* device, this list should be empty.
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index fd44fc8..a425a91 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -19,6 +19,7 @@
import android.app.PendingIntent;
import android.net.ConnectionInfo;
import android.net.LinkProperties;
+import android.net.ITetheringEventCallback;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
@@ -214,4 +215,7 @@
void getLatestTetheringEntitlementResult(int type, in ResultReceiver receiver,
boolean showEntitlementUi, String callerPkg);
+
+ void registerTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);
+ void unregisterTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);
}
diff --git a/core/java/android/net/ITetheringEventCallback.aidl b/core/java/android/net/ITetheringEventCallback.aidl
new file mode 100644
index 0000000..d502088
--- /dev/null
+++ b/core/java/android/net/ITetheringEventCallback.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.net.Network;
+
+/**
+ * Callback class for receiving tethering changed events
+ * @hide
+ */
+oneway interface ITetheringEventCallback
+{
+ void onUpstreamChanged(in Network network);
+}
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
index 01932ab..f23dc2d 100644
--- a/core/java/android/nfc/cardemulation/CardEmulation.java
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -16,6 +16,7 @@
package android.nfc.cardemulation;
+import android.annotation.NonNull;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.Activity;
@@ -359,7 +360,7 @@
* @param service The component name of the service
* @return whether the registration was successful.
*/
- public boolean unsetOffHostForService(ComponentName service) {
+ public boolean unsetOffHostForService(@NonNull ComponentName service) {
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);
if (adapter == null) {
return false;
@@ -405,7 +406,8 @@
* @param offHostSecureElement Secure Element to register the AID to
* @return whether the registration was successful.
*/
- public boolean setOffHostForService(ComponentName service, String offHostSecureElement) {
+ public boolean setOffHostForService(@NonNull ComponentName service,
+ @NonNull String offHostSecureElement) {
boolean validSecureElement = false;
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 650d217..39e9138 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -16,6 +16,8 @@
package android.os;
+import android.app.Activity;
+import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@@ -65,6 +67,9 @@
private static final String ANGLE_RULES_FILE = "a4a_rules.json";
private static final String ANGLE_TEMP_RULES = "debug.angle.rules";
private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID";
+ private static final String ACTION_ANGLE_FOR_ANDROID_TOAST_MESSAGE =
+ "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE";
+ private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A Toast Message";
private static final String GAME_DRIVER_WHITELIST_ALL = "*";
private ClassLoader mClassLoader;
@@ -557,9 +562,20 @@
final String packageName = context.getPackageName();
if (shouldShowAngleInUseDialogBox(context) && shouldUseAngle(context, packageName)) {
- final String toastMsg = packageName + " is using ANGLE";
- final Toast toast = Toast.makeText(context, toastMsg, Toast.LENGTH_LONG);
- toast.show();
+ final Intent intent = new Intent(ACTION_ANGLE_FOR_ANDROID_TOAST_MESSAGE);
+ String anglePkg = getAnglePackageName(context.getPackageManager());
+ intent.setPackage(anglePkg);
+
+ context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Bundle results = getResultExtras(true);
+
+ String toastMsg = results.getString(INTENT_KEY_A4A_TOAST_MESSAGE);
+ final Toast toast = Toast.makeText(context, toastMsg, Toast.LENGTH_LONG);
+ toast.show();
+ }
+ }, null, Activity.RESULT_OK, null, null);
}
}
diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java
index 8880296..e656466 100644
--- a/core/java/android/preference/DialogPreference.java
+++ b/core/java/android/preference/DialogPreference.java
@@ -349,16 +349,31 @@
dialog.show();
}
+ /**
+ * Get the DecorView.
+ * @return the DecorView for the current dialog window, if it exists.
+ * If the window does not exist, null is returned.
+ */
+ private View getDecorView() {
+ if (mDialog != null && mDialog.getWindow() != null) {
+ return mDialog.getWindow().getDecorView();
+ }
+ return null;
+ }
+
void postDismiss() {
removeDismissCallbacks();
- View decorView = mDialog.getWindow().getDecorView();
- decorView.post(mDismissRunnable);
+ View decorView = getDecorView();
+ if (decorView != null) {
+ // If decorView is null, dialog was already dismissed
+ decorView.post(mDismissRunnable);
+ }
}
private void removeDismissCallbacks() {
- if (mDialog != null && mDialog.getWindow() != null
- && mDialog.getWindow().getDecorView() != null) {
- mDialog.getWindow().getDecorView().removeCallbacks(mDismissRunnable);
+ View decorView = getDecorView();
+ if (decorView != null) {
+ decorView.removeCallbacks(mDismissRunnable);
}
}
diff --git a/core/java/android/provider/TEST_MAPPING b/core/java/android/provider/TEST_MAPPING
new file mode 100644
index 0000000..7486f7f
--- /dev/null
+++ b/core/java/android/provider/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "android.provider.SettingsBackupTest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/core/java/android/service/contentcapture/ActivityEvent.aidl b/core/java/android/service/contentcapture/ActivityEvent.aidl
new file mode 100644
index 0000000..558cac4
--- /dev/null
+++ b/core/java/android/service/contentcapture/ActivityEvent.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2019, 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.service.contentcapture;
+
+parcelable ActivityEvent;
diff --git a/core/java/android/service/contentcapture/ActivityEvent.java b/core/java/android/service/contentcapture/ActivityEvent.java
new file mode 100644
index 0000000..7ac380d
--- /dev/null
+++ b/core/java/android/service/contentcapture/ActivityEvent.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2019 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.service.contentcapture;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
+import android.app.usage.UsageEvents.Event;
+import android.content.ComponentName;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Represents an activity-level event that is not associated with a session.
+ *
+ * @hide
+ */
+@SystemApi
+@TestApi
+public final class ActivityEvent implements Parcelable {
+
+ /**
+ * The activity resumed.
+ */
+ public static final int TYPE_ACTIVITY_RESUMED = Event.ACTIVITY_RESUMED;
+
+ /**
+ * The activity paused.
+ */
+ public static final int TYPE_ACTIVITY_PAUSED = Event.ACTIVITY_PAUSED;
+
+ /** @hide */
+ @IntDef(prefix = { "TYPE_" }, value = {
+ TYPE_ACTIVITY_RESUMED,
+ TYPE_ACTIVITY_PAUSED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ActivityEventType{}
+
+ private final @NonNull ComponentName mComponentName;
+ private final @ActivityEventType int mType;
+
+ /** @hide */
+ public ActivityEvent(@NonNull ComponentName componentName, @ActivityEventType int type) {
+ mComponentName = componentName;
+ mType = type;
+ }
+
+ /**
+ * Gests the {@link ComponentName} of the activity associated with the event.
+ */
+ @NonNull
+ public ComponentName getComponentName() {
+ return mComponentName;
+ }
+
+ /**
+ * Gets the event type.
+ *
+ * @return either {@link #TYPE_ACTIVITY_RESUMED} or {@value #TYPE_ACTIVITY_PAUSED}.
+ */
+ @ActivityEventType
+ public int getEventType() {
+ return mType;
+ }
+
+ /** @hide */
+ public static String getTypeAsString(@ActivityEventType int type) {
+ switch (type) {
+ case TYPE_ACTIVITY_RESUMED:
+ return "ACTIVITY_RESUMED";
+ case TYPE_ACTIVITY_PAUSED:
+ return "ACTIVITY_PAUSED";
+ default:
+ return "UKNOWN_TYPE: " + type;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder("ActivityEvent[").append(mComponentName.toShortString())
+ .append("]:").append(getTypeAsString(mType)).toString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeParcelable(mComponentName, flags);
+ parcel.writeInt(mType);
+ }
+
+ public static final @android.annotation.NonNull Creator<ActivityEvent> CREATOR =
+ new Creator<ActivityEvent>() {
+
+ @Override
+ @NonNull
+ public ActivityEvent createFromParcel(@NonNull Parcel parcel) {
+ final ComponentName componentName = parcel.readParcelable(null);
+ final int eventType = parcel.readInt();
+ return new ActivityEvent(componentName, eventType);
+ }
+
+ @Override
+ @NonNull
+ public ActivityEvent[] newArray(int size) {
+ return new ActivityEvent[size];
+ }
+ };
+}
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index 4afd204..192abd5 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -126,6 +126,13 @@
obtainMessage(ContentCaptureService::handleOnUserDataRemovalRequest,
ContentCaptureService.this, request));
}
+
+ @Override
+ public void onActivityEvent(ActivityEvent event) {
+ mHandler.sendMessage(obtainMessage(ContentCaptureService::handleOnActivityEvent,
+ ContentCaptureService.this, event));
+
+ }
};
/**
@@ -247,7 +254,21 @@
* @param snapshotData the data
*/
public void onActivitySnapshot(@NonNull ContentCaptureSessionId sessionId,
- @NonNull SnapshotData snapshotData) {}
+ @NonNull SnapshotData snapshotData) {
+ if (sVerbose) Log.v(TAG, "onActivitySnapshot(id=" + sessionId + ")");
+ }
+
+ /**
+ * Notifies the service of an activity-level event that is not associated with a session.
+ *
+ * <p>This method can be used to track some high-level events for all activities, even those
+ * that are not whitelisted for Content Capture.
+ *
+ * @param event high-level activity event
+ */
+ public void onActivityEvent(@NonNull ActivityEvent event) {
+ if (sVerbose) Log.v(TAG, "onActivityEvent(): " + event);
+ }
/**
* Destroys the content capture session.
@@ -383,6 +404,10 @@
onUserDataRemovalRequest(request);
}
+ private void handleOnActivityEvent(@NonNull ActivityEvent event) {
+ onActivityEvent(event);
+ }
+
/**
* Checks if the given {@code uid} owns the session associated with the event.
*/
diff --git a/core/java/android/service/contentcapture/IContentCaptureService.aidl b/core/java/android/service/contentcapture/IContentCaptureService.aidl
index eb65032..f32432f 100644
--- a/core/java/android/service/contentcapture/IContentCaptureService.aidl
+++ b/core/java/android/service/contentcapture/IContentCaptureService.aidl
@@ -16,7 +16,9 @@
package android.service.contentcapture;
+import android.content.ComponentName;
import android.os.IBinder;
+import android.service.contentcapture.ActivityEvent;
import android.service.contentcapture.SnapshotData;
import android.view.contentcapture.ContentCaptureContext;
import android.view.contentcapture.UserDataRemovalRequest;
@@ -38,4 +40,5 @@
void onSessionFinished(String sessionId);
void onActivitySnapshot(String sessionId, in SnapshotData snapshotData);
void onUserDataRemovalRequest(in UserDataRemovalRequest request);
+ void onActivityEvent(in ActivityEvent event);
}
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index 0836327..4315100 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -16,6 +16,7 @@
package android.service.notification;
+import android.annotation.NonNull;
import android.annotation.UnsupportedAppUsage;
import android.app.Notification;
import android.app.NotificationManager;
@@ -299,7 +300,7 @@
* Might be different from {@link #getPackageName()} if the app owning the notification has
* a {@link NotificationManager#setNotificationDelegate(String) notification delegate}.
*/
- public String getOpPkg() {
+ public @NonNull String getOpPkg() {
return opPkg;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index a3d0a7e..9222bd6 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2372,6 +2372,9 @@
mAttachInfo.mOutsets.set(mPendingOutsets);
mApplyInsetsRequested = false;
dispatchApplyInsets(host);
+ // We applied insets so force contentInsetsChanged to ensure the
+ // hierarchy is measured below.
+ contentInsetsChanged = true;
}
if (visibleInsetsChanged) {
mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
diff --git a/core/java/android/view/contentcapture/ContentCaptureHelper.java b/core/java/android/view/contentcapture/ContentCaptureHelper.java
index 6e84ff0..6bc3829 100644
--- a/core/java/android/view/contentcapture/ContentCaptureHelper.java
+++ b/core/java/android/view/contentcapture/ContentCaptureHelper.java
@@ -20,7 +20,6 @@
import static android.view.contentcapture.ContentCaptureManager.LOGGING_LEVEL_OFF;
import static android.view.contentcapture.ContentCaptureManager.LOGGING_LEVEL_VERBOSE;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Build;
import android.provider.DeviceConfig;
@@ -48,21 +47,6 @@
}
/**
- * Gets the value of a device config property from the Content Capture namespace.
- */
- public static int getIntDeviceConfigProperty(@NonNull String key, int defaultValue) {
- final String value = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_CONTENT_CAPTURE, key);
- if (value == null) return defaultValue;
-
- try {
- return Integer.parseInt(value);
- } catch (Exception e) {
- Log.w(TAG, "error parsing value (" + value + ") of property " + key + ": " + e);
- return defaultValue;
- }
- }
-
- /**
* Gets the default logging level for the device.
*/
@LoggingLevel
@@ -75,8 +59,8 @@
*/
public static void setLoggingLevel() {
final int defaultLevel = getDefaultLoggingLevel();
- final int level = getIntDeviceConfigProperty(DEVICE_CONFIG_PROPERTY_LOGGING_LEVEL,
- defaultLevel);
+ final int level = DeviceConfig.getInt(DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
+ DEVICE_CONFIG_PROPERTY_LOGGING_LEVEL, defaultLevel);
setLoggingLevel(level);
}
diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java
index f4c904d..7270302 100644
--- a/core/java/com/android/internal/infra/AbstractRemoteService.java
+++ b/core/java/com/android/internal/infra/AbstractRemoteService.java
@@ -480,6 +480,11 @@
return mDestroyed;
}
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[" + mComponentName + "]";
+ }
+
/**
* Base class for the requests serviced by the remote service.
*
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
index aa1e0d4..5688870 100644
--- a/core/java/com/android/internal/os/BinderCallsStats.java
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -212,7 +212,7 @@
// It helps to keep the memory usage down when sampling is enabled.
final CallStat callStat = uidEntry.get(
callingUid, s.binderClass, s.transactionCode,
- mDeviceState.isScreenInteractive());
+ screenInteractive);
if (callStat != null) {
callStat.callCount++;
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 2bba3c9..70d8b45 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -369,17 +369,8 @@
* @param appInfo ApplicationInfo of the application
*/
protected static void allowAppFilesAcrossFork(ApplicationInfo appInfo) {
- Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir);
- if (appInfo.splitSourceDirs != null) {
- for (String path : appInfo.splitSourceDirs) {
- Zygote.nativeAllowFileAcrossFork(path);
- }
- }
- // As well as its shared libs
- if (appInfo.sharedLibraryFiles != null) {
- for (String path : appInfo.sharedLibraryFiles) {
- Zygote.nativeAllowFileAcrossFork(path);
- }
+ for (String path : appInfo.getAllApkPaths()) {
+ Zygote.nativeAllowFileAcrossFork(path);
}
}
diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
index a8e64c6..49221b4 100644
--- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto
+++ b/core/proto/android/stats/devicepolicy/device_policy_enums.proto
@@ -101,7 +101,7 @@
PROVISIONING_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 77;
PROVISIONING_PERSISTENT_DEVICE_OWNER = 78;
- // existing Tron logs to be migrated to WestWorld
+ // existing Tron logs to be migrated to statsd
PROVISIONING_ENTRY_POINT_NFC = 79;
PROVISIONING_ENTRY_POINT_QR_CODE = 80;
PROVISIONING_ENTRY_POINT_CLOUD_ENROLLMENT = 81;
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index b48c6b0..840cd63 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2941,6 +2941,7 @@
<!-- @hide @SystemApi -->
<public name="allowClearUserDataOnFailedRestore"/>
<public name="allowAudioPlaybackCapture"/>
+ <public name="secureElementName" />
</public-group>
<public-group type="drawable" first-id="0x010800b4">
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
index a88968b..1cb71f9 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java
@@ -20,6 +20,7 @@
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.fail;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doAnswer;
@@ -33,6 +34,8 @@
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
+import com.google.common.base.Throwables;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -588,6 +591,29 @@
}
}
+ @Test
+ public void addSameParentNodeWithDifferentChildNode_whenOriginalChildHasChild_doesntCrash() {
+ AccessibilityNodeInfo parentNodeInfo = getParentNode();
+ AccessibilityNodeInfo childNodeInfo = getChildNode();
+ childNodeInfo.addChild(getMockViewWithA11yAndWindowIds(CHILD_VIEW_ID + 1, WINDOW_ID_1));
+
+ AccessibilityNodeInfo replacementParentNodeInfo =
+ getNodeWithA11yAndWindowId(PARENT_VIEW_ID, WINDOW_ID_1);
+ replacementParentNodeInfo.addChild(
+ getMockViewWithA11yAndWindowIds(OTHER_CHILD_VIEW_ID, WINDOW_ID_1));
+ try {
+ mAccessibilityCache.add(parentNodeInfo);
+ mAccessibilityCache.add(childNodeInfo);
+ mAccessibilityCache.add(replacementParentNodeInfo);
+ } catch (IllegalStateException e) {
+ fail("recycle A11yNodeInfo twice" + Throwables.getStackTraceAsString(e));
+ } finally {
+ parentNodeInfo.recycle();
+ childNodeInfo.recycle();
+ replacementParentNodeInfo.recycle();
+ }
+ }
+
private void assertNodeIsRefreshedWithEventType(int eventType, int contentChangeTypes) {
AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(SINGLE_VIEW_ID, WINDOW_ID_1);
mAccessibilityCache.add(nodeInfo);
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
index e375af3..c4632f7 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -718,6 +718,36 @@
assertEquals(2, callStats.recordedCallCount);
}
+ @Test
+ public void testTrackScreenInteractiveDisabled_sampling() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setSamplingInterval(2);
+ bcs.setTrackScreenInteractive(false);
+ Binder binder = new Binder();
+
+ mDeviceState.setScreenInteractive(false);
+ CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
+
+ mDeviceState.setScreenInteractive(true);
+ callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID);
+ bcs.time += 1000; // shoud be ignored.
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(1, uidEntries.size());
+ BinderCallsStats.UidEntry uidEntry = uidEntries.get(WORKSOURCE_UID);
+ Assert.assertNotNull(uidEntry);
+ assertEquals(2, uidEntry.callCount);
+
+ List<BinderCallsStats.CallStat> callStatsList = new ArrayList(uidEntry.getCallStatsList());
+ assertEquals(1, callStatsList.size());
+ BinderCallsStats.CallStat callStats = callStatsList.get(0);
+ assertEquals(false, callStats.screenInteractive);
+ assertEquals(2, callStats.callCount);
+ assertEquals(1, callStats.recordedCallCount);
+ }
class TestBinderCallsStats extends BinderCallsStats {
public int callingUid = CALLING_UID;
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 83c8b01..fd37735 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -425,8 +425,8 @@
* Make lint happy.
* See {@link Canvas#drawDoubleRoundRect(RectF, float[], RectF, float[], Paint)}
*/
- public void drawDoubleRoundRect(@NonNull RectF outer, float[] outerRadii,
- @NonNull RectF inner, float[] innerRadii, @NonNull Paint paint) {
+ public void drawDoubleRoundRect(@NonNull RectF outer, @NonNull float[] outerRadii,
+ @NonNull RectF inner, @NonNull float[] innerRadii, @NonNull Paint paint) {
throwIfHasHwBitmapInSwMode(paint);
if (innerRadii == null || outerRadii == null
|| innerRadii.length != 8 || outerRadii.length != 8) {
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 034dff0..8f46e1a 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -2018,8 +2018,8 @@
* @param paint The paint used to draw the double roundRect
*/
@Override
- public void drawDoubleRoundRect(@NonNull RectF outer, float[] outerRadii,
- @NonNull RectF inner, float[] innerRadii, @NonNull Paint paint) {
+ public void drawDoubleRoundRect(@NonNull RectF outer, @NonNull float[] outerRadii,
+ @NonNull RectF inner, @NonNull float[] innerRadii, @NonNull Paint paint) {
super.drawDoubleRoundRect(outer, outerRadii, inner, innerRadii, paint);
}
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index 7345ea4..bc744cc 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -170,13 +170,14 @@
/**
* Destroys the rendering context of this HardwareRenderer. This destroys the resources
- * associated with this renderer and releases the currently set {@link Surface}.
+ * associated with this renderer and releases the currently set {@link Surface}. This must
+ * be called when this HardwareRenderer is no longer needed.
*
* <p>The renderer may be restored from this state by setting a new {@link Surface}, setting
* new rendering content with {@link #setContentRoot(RenderNode)}, and resuming
* rendering by issuing a new {@link FrameRenderRequest}.
*
- * <p>It is suggested to call this in response to callbacks such as
+ * <p>It is recommended to call this in response to callbacks such as
* {@link android.view.SurfaceHolder.Callback#surfaceDestroyed(SurfaceHolder)}.
*
* <p>Note that if there are any outstanding frame commit callbacks they may never being
@@ -383,7 +384,7 @@
* The system internally may reuse instances of {@link FrameRenderRequest} to reduce
* allocation churn.
*
- * @return The result of the sync operation. See {@link SyncAndDrawResult}.
+ * @return The result of the sync operation.
*/
@SyncAndDrawResult
public int syncAndDraw() {
@@ -456,12 +457,37 @@
* and {@link Activity#onStart()}.
*
* @param stopped true to stop all rendering, false to resume
+ * @hide
*/
public void setStopped(boolean stopped) {
nSetStopped(mNativeProxy, stopped);
}
/**
+ * Hard stops rendering into the surface. If the renderer is stopped it will
+ * block any attempt to render. Calls to {@link FrameRenderRequest#syncAndDraw()} will
+ * still sync over the latest rendering content, however they will not render and instead
+ * {@link #SYNC_CONTEXT_IS_STOPPED} will be returned.
+ *
+ * <p>This is useful in combination with lifecycle events such as {@link Activity#onStop()}.
+ * See {@link #start()} for resuming rendering.
+ */
+ public void stop() {
+ nSetStopped(mNativeProxy, true);
+ }
+
+ /**
+ * Resumes rendering into the surface. Any pending rendering requests
+ * will produce a new frame at the next vsync signal.
+ *
+ * <p>This is useful in combination with lifecycle events such as {@link Activity#onStart()}.
+ * See {@link #stop()} for stopping rendering.
+ */
+ public void start() {
+ nSetStopped(mNativeProxy, false);
+ }
+
+ /**
* Destroys all the display lists associated with the current rendering content.
* This includes releasing a reference to the current content root RenderNode. It will
* therefore be necessary to call {@link #setContentRoot(RenderNode)} in order to resume
@@ -473,7 +499,7 @@
* {@link android.content.ComponentCallbacks2#onTrimMemory(int)} signals such as
* {@link android.content.ComponentCallbacks2#TRIM_MEMORY_UI_HIDDEN}
*
- * See also {@link #setStopped(boolean)}
+ * See also {@link #stop()}.
*/
public void clearContent() {
nDestroyHardwareResources(mNativeProxy);
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index c3bcbb4..5e48ea1 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -135,6 +135,36 @@
* }
* </pre>
*
+ * <p>A few of the properties may at first appear redundant, such as {@link #setElevation(float)}
+ * and {@link #setTranslationZ(float)}. The reason for these duplicates are to allow for a
+ * separation between static & transient usages. For example consider a button that raises from 2dp
+ * to 8dp when pressed. To achieve that an application may decide to setElevation(2dip), and then
+ * on press to animate setTranslationZ to 6dip. Combined this achieves the final desired 8dip
+ * value, but the animation need only concern itself with animating the lift from press without
+ * needing to know the initial starting value. {@link #setTranslationX(float)} and
+ * {@link #setTranslationY(float)} are similarly provided for animation uses despite the functional
+ * overlap with {@link #setPosition(Rect)}.
+ *
+ * <p>The RenderNode's transform matrix is computed at render time as follows:
+ * First a setTranslate(getTranslationX(), getTranslationY()) is applied to a {@link Matrix}.
+ * Second a preRotate(getRotationZ(), getPivotX(), getPivotY()) is applied to the matrix. And
+ * finally a preScale(getScaleX(), getScaleY(), getPivotX(), getPivotY()) is applied. The current
+ * canvas transform matrix, which is translated to the RenderNode's position,
+ * is then multiplied by the RenderNode's transform matrix. Therefore there is no implicit
+ * ordering in setting various RenderNode properties. That is to say that:
+ *
+ * <pre class="prettyprint">
+ * renderNode.setTranslationX(100);
+ * renderNode.setScaleX(100);
+ * </pre>
+ *
+ * is equivalent to
+ *
+ * <pre class="prettyprint">
+ * renderNode.setScaleX(100);
+ * renderNode.setTranslationX(100);
+ * </pre>
+ *
* <h3>Threading</h3>
* <p>RenderNode may be created and used on any thread but they are not thread-safe. Only
* a single thread may interact with a RenderNode at any given time. It is critical
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 1ff7ffe..e0ed3e4 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -134,6 +134,7 @@
void RenderNode::damageSelf(TreeInfo& info) {
if (isRenderable()) {
+ mDamageGenerationId = info.damageGenerationId;
if (properties().getClipDamageToBounds()) {
info.damageAccumulator->dirty(0, 0, properties().getWidth(), properties().getHeight());
} else {
@@ -199,6 +200,12 @@
* stencil buffer may be needed. Views that use a functor to draw will be forced onto a layer.
*/
void RenderNode::prepareTreeImpl(TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer) {
+ if (mDamageGenerationId == info.damageGenerationId) {
+ // We hit the same node a second time in the same tree. We don't know the minimal
+ // damage rect anymore, so just push the biggest we can onto our parent's transform
+ // We push directly onto parent in case we are clipped to bounds but have moved position.
+ info.damageAccumulator->dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
+ }
info.damageAccumulator->pushTransform(this);
if (info.mode == TreeInfo::MODE_FULL) {
diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h
index 6060123..23e7a0e 100644
--- a/libs/hwui/RenderNode.h
+++ b/libs/hwui/RenderNode.h
@@ -255,6 +255,8 @@
DisplayList* mDisplayList;
DisplayList* mStagingDisplayList;
+ int64_t mDamageGenerationId;
+
friend class AnimatorManager;
AnimatorManager mAnimatorManager;
diff --git a/libs/hwui/TreeInfo.cpp b/libs/hwui/TreeInfo.cpp
index 808a12a..cdad20e 100644
--- a/libs/hwui/TreeInfo.cpp
+++ b/libs/hwui/TreeInfo.cpp
@@ -24,6 +24,7 @@
: mode(mode)
, prepareTextures(mode == MODE_FULL)
, canvasContext(canvasContext)
+ , damageGenerationId(canvasContext.getFrameNumber())
, disableForceDark(canvasContext.useForceDark() ? 0 : 1) {}
} // namespace android::uirenderer
diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h
index a0d9605..04eabac 100644
--- a/libs/hwui/TreeInfo.h
+++ b/libs/hwui/TreeInfo.h
@@ -87,6 +87,7 @@
// Must not be null during actual usage
DamageAccumulator* damageAccumulator = nullptr;
+ int64_t damageGenerationId = 0;
LayerUpdateQueue* layerUpdateQueue = nullptr;
ErrorHandler* errorHandler = nullptr;
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 8e57a3a..091775dbe7 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -401,11 +401,11 @@
SkRect dirty;
mDamageAccumulator.finish(&dirty);
- // TODO: Re-enable after figuring out cause of b/22592975
- // if (dirty.isEmpty() && Properties::skipEmptyFrames) {
- // mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame);
- // return;
- // }
+ if (dirty.isEmpty() && Properties::skipEmptyFrames
+ && !surfaceRequiresRedraw()) {
+ mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame);
+ return;
+ }
mCurrentFrameInfo->markIssueDrawCommandsStart();
@@ -638,6 +638,19 @@
return mFrameNumber;
}
+bool CanvasContext::surfaceRequiresRedraw() {
+ if (!mNativeSurface) return false;
+ if (mHaveNewSurface) return true;
+
+ int width = -1;
+ int height = -1;
+ ReliableSurface* surface = mNativeSurface.get();
+ surface->query(NATIVE_WINDOW_WIDTH, &width);
+ surface->query(NATIVE_WINDOW_HEIGHT, &height);
+
+ return width == mLastFrameWidth && height == mLastFrameHeight;
+}
+
SkRect CanvasContext::computeDirtyRect(const Frame& frame, SkRect* dirty) {
if (frame.width() != mLastFrameWidth || frame.height() != mLastFrameHeight) {
// can't rely on prior content of window if viewport size changes
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index db97763..4da0eac 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -217,6 +217,7 @@
void freePrefetchedLayers();
bool isSwapChainStuffed();
+ bool surfaceRequiresRedraw();
SkRect computeDirtyRect(const Frame& frame, SkRect* dirty);
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index f6b2031..5cd3621 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -1985,7 +1985,7 @@
* When the language is unknown or could not be determined,
* ISO-639-2 language code, "und", is returned.
*/
- public @Nullable String getLanguage() {
+ public @NonNull String getLanguage() {
String language = mFormat.getString(MediaFormat.KEY_LANGUAGE);
return language == null ? "und" : language;
}
diff --git a/media/apex/java/android/media/MediaSession2.java b/media/apex/java/android/media/MediaSession2.java
index 148e16c..09ac9ca 100644
--- a/media/apex/java/android/media/MediaSession2.java
+++ b/media/apex/java/android/media/MediaSession2.java
@@ -749,6 +749,10 @@
* You can reject the connection by returning {@code null}. In that case, controller
* receives {@link MediaController2.ControllerCallback#onDisconnected(MediaController2)}
* and cannot be used.
+ * <p>
+ * The controller hasn't connected yet in this method, so calls to the controller
+ * (e.g. {@link #sendSessionCommand}) would be ignored. Override {@link #onPostConnect} for
+ * the custom initialization for the controller instead.
*
* @param session the session for this event
* @param controller controller information.
@@ -763,6 +767,10 @@
/**
* Called immediately after a controller is connected. This is a convenient method to add
* custom initialization between the session and a controller.
+ * <p>
+ * Note that calls to the controller (e.g. {@link #sendSessionCommand}) work here but don't
+ * work in {@link #onConnect} because the controller hasn't connected yet in
+ * {@link #onConnect}.
*
* @param session the session for this event
* @param controller controller information.
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index fbb629b..8051236 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -22,6 +22,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.app.ActivityThread;
import android.media.audiopolicy.AudioMix;
@@ -1791,13 +1792,14 @@
// MicrophoneDirection
//--------------------
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
- * @param direction Direction constant.
* @return true if sucessful.
*/
- public boolean setMicrophoneDirection(int direction) {
- return native_set_microphone_direction(direction) == 0;
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_set_microphone_direction(direction) == AudioSystem.SUCCESS;
}
/**
@@ -1809,7 +1811,9 @@
* @return true if sucessful.
*/
public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
- return native_set_microphone_field_dimension(zoom) == 0;
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_set_microphone_field_dimension(zoom) == AudioSystem.SUCCESS;
}
//---------------------------------------------------------
@@ -2024,5 +2028,60 @@
* The value is an {@code int}.
*/
public static final String CHANNELS = MM_PREFIX + "channels";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The native channel mask.
+ * The value is a {@code long}.
+ * @hide
+ */
+ @TestApi
+ public static final String CHANNEL_MASK = MM_PREFIX + "channelMask";
+
+
+ /**
+ * Use for testing only. Do not expose.
+ * The port id of this input port in audioserver.
+ * The value is an {@code int}.
+ * @hide
+ */
+ @TestApi
+ public static final String PORT_ID = MM_PREFIX + "portId";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The buffer frameCount.
+ * The value is an {@code int}.
+ * @hide
+ */
+ @TestApi
+ public static final String FRAME_COUNT = MM_PREFIX + "frameCount";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The actual record track attributes used.
+ * The value is a {@code String}.
+ * @hide
+ */
+ @TestApi
+ public static final String ATTRIBUTES = MM_PREFIX + "attributes";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The buffer frameCount
+ * The value is a {@code double}.
+ * @hide
+ */
+ @TestApi
+ public static final String DURATION_MS = MM_PREFIX + "durationMs";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The number of times the record track has started
+ * The value is a {@code long}.
+ * @hide
+ */
+ @TestApi
+ public static final String START_COUNT = MM_PREFIX + "startCount";
}
}
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index a15d322..09cfa95 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -22,6 +22,7 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Binder;
import android.os.Build;
@@ -3624,5 +3625,59 @@
*/
@Deprecated
public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The current sample rate.
+ * The value is an {@code int}.
+ * @hide
+ */
+ @TestApi
+ public static final String SAMPLE_RATE = MM_PREFIX + "sampleRate";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The native channel mask.
+ * The value is a {@code long}.
+ * @hide
+ */
+ @TestApi
+ public static final String CHANNEL_MASK = MM_PREFIX + "channelMask";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The output audio data encoding.
+ * The value is a {@code String}.
+ * @hide
+ */
+ @TestApi
+ public static final String ENCODING = MM_PREFIX + "encoding";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The port id of this track port in audioserver.
+ * The value is an {@code int}.
+ * @hide
+ */
+ @TestApi
+ public static final String PORT_ID = MM_PREFIX + "portId";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The buffer frameCount.
+ * The value is an {@code int}.
+ * @hide
+ */
+ @TestApi
+ public static final String FRAME_COUNT = MM_PREFIX + "frameCount";
+
+ /**
+ * Use for testing only. Do not expose.
+ * The actual track attributes used.
+ * The value is a {@code String}.
+ * @hide
+ */
+ @TestApi
+ public static final String ATTRIBUTES = MM_PREFIX + "attributes";
}
}
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 1304afe..e7b4752 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.CallbackExecutor;
+import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -35,6 +36,7 @@
import android.view.Surface;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import java.io.File;
import java.io.FileDescriptor;
@@ -45,7 +47,6 @@
import java.util.List;
import java.util.concurrent.Executor;
-
/**
* Used to record audio and video. The recording control is based on a
* simple state machine (see below).
@@ -90,7 +91,8 @@
*/
public class MediaRecorder implements AudioRouting,
AudioRecordingMonitor,
- AudioRecordingMonitorClient
+ AudioRecordingMonitorClient,
+ MicrophoneDirection
{
static {
System.loadLibrary("media_jni");
@@ -1527,6 +1529,36 @@
ArrayList<MicrophoneInfo> activeMicrophones);
//--------------------------------------------------------------------------
+ // MicrophoneDirection
+ //--------------------
+ /**
+ * Specifies the logical microphone (for processing).
+ *
+ * @param direction Direction constant.
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_setMicrophoneDirection(direction) == 0;
+ }
+
+ /**
+ * Specifies the zoom factor (i.e. the field dimension) for the selected microphone
+ * (for processing). The selected microphone is determined by the use-case for the stream.
+ *
+ * @param zoom the desired field dimension of microphone capture. Range is from -1 (wide angle),
+ * though 0 (no zoom) to 1 (maximum zoom).
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_setMicrophoneFieldDimension(zoom) == 0;
+ }
+
+ private native int native_setMicrophoneDirection(int direction);
+ private native int native_setMicrophoneFieldDimension(float zoom);
+
+ //--------------------------------------------------------------------------
// Implementation of AudioRecordingMonitor interface
//--------------------
diff --git a/media/java/android/media/MicrophoneDirection.java b/media/java/android/media/MicrophoneDirection.java
index 489e268..2382da5 100644
--- a/media/java/android/media/MicrophoneDirection.java
+++ b/media/java/android/media/MicrophoneDirection.java
@@ -22,6 +22,10 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+/**
+ * Interface defining mechanism for controlling the directionality and field width of
+ * audio capture.
+ */
public interface MicrophoneDirection {
/**
* Don't do any directionality processing of the activated microphone(s).
@@ -41,21 +45,23 @@
int MIC_DIRECTION_EXTERNAL = 3;
/** @hide */
- @IntDef({
+ /*public*/ @IntDef({
MIC_DIRECTION_UNSPECIFIED,
MIC_DIRECTION_FRONT,
MIC_DIRECTION_BACK,
MIC_DIRECTION_EXTERNAL
})
@Retention(RetentionPolicy.SOURCE)
- public @interface Directionmode{};
+ @interface DirectionMode{};
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
* @param direction Direction constant.
* @return true if sucessful.
*/
- boolean setMicrophoneDirection(@Directionmode int direction);
+ boolean setMicrophoneDirection(@DirectionMode int direction);
/**
* Specifies the zoom factor (i.e. the field dimension) for the selected microphone
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index a7c0159..3ec0903 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -760,6 +760,44 @@
return jStatus;
}
+static jint android_media_MediaRecord_setMicrophoneDirection(
+ JNIEnv *env, jobject thiz, jint direction) {
+ ALOGV("setMicrophoneDirection(%d)", direction);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status =
+ mr->setMicrophoneDirection(static_cast<audio_microphone_direction_t>(direction));
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+}
+
+static jint android_media_MediaRecord_setMicrophoneFieldDimension(
+ JNIEnv *env, jobject thiz, jfloat zoom) {
+ ALOGV("setMicrophoneFieldDimension(%f)", zoom);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status = mr->setMicrophoneFieldDimension(zoom);
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+
+}
+
static jint android_media_MediaRecord_getPortId(JNIEnv *env, jobject thiz) {
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
if (mr == NULL) {
@@ -812,6 +850,8 @@
{"native_getActiveMicrophones", "(Ljava/util/ArrayList;)I", (void *)android_media_MediaRecord_getActiveMicrophones},
{"native_getPortId", "()I", (void *)android_media_MediaRecord_getPortId},
+ {"native_setMicrophoneDirection", "(I)I", (void *)android_media_MediaRecord_setMicrophoneDirection},
+ {"native_setMicrophoneFieldDimension", "(F)I", (void *)android_media_MediaRecord_setMicrophoneFieldDimension},
};
// This function only registers the native methods, and is called from
diff --git a/native/android/choreographer.cpp b/native/android/choreographer.cpp
index 3fecd53..63e0734 100644
--- a/native/android/choreographer.cpp
+++ b/native/android/choreographer.cpp
@@ -37,6 +37,7 @@
struct FrameCallback {
AChoreographer_frameCallback callback;
+ AChoreographer_frameCallback64 callback64;
void* data;
nsecs_t dueTime;
@@ -50,8 +51,8 @@
class Choreographer : public DisplayEventDispatcher, public MessageHandler {
public:
- void postFrameCallback(AChoreographer_frameCallback cb, void* data);
- void postFrameCallbackDelayed(AChoreographer_frameCallback cb, void* data, nsecs_t delay);
+ void postFrameCallbackDelayed(AChoreographer_frameCallback cb,
+ AChoreographer_frameCallback64 cb64, void* data, nsecs_t delay);
enum {
MSG_SCHEDULE_CALLBACKS = 0,
@@ -107,14 +108,10 @@
DisplayEventDispatcher(looper), mLooper(looper), mThreadId(std::this_thread::get_id()) {
}
-void Choreographer::postFrameCallback(AChoreographer_frameCallback cb, void* data) {
- postFrameCallbackDelayed(cb, data, 0);
-}
-
void Choreographer::postFrameCallbackDelayed(
- AChoreographer_frameCallback cb, void* data, nsecs_t delay) {
+ AChoreographer_frameCallback cb, AChoreographer_frameCallback64 cb64, void* data, nsecs_t delay) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
- FrameCallback callback{cb, data, now + delay};
+ FrameCallback callback{cb, cb64, data, now + delay};
{
AutoMutex _l{mLock};
mCallbacks.push(callback);
@@ -156,7 +153,11 @@
}
}
for (const auto& cb : callbacks) {
- cb.callback(timestamp, cb.data);
+ if (cb.callback64 != nullptr) {
+ cb.callback64(timestamp, cb.data);
+ } else if (cb.callback != nullptr) {
+ cb.callback(timestamp, cb.data);
+ }
}
}
@@ -204,10 +205,21 @@
void AChoreographer_postFrameCallback(AChoreographer* choreographer,
AChoreographer_frameCallback callback, void* data) {
- AChoreographer_to_Choreographer(choreographer)->postFrameCallback(callback, data);
+ AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed(
+ callback, nullptr, data, 0);
}
void AChoreographer_postFrameCallbackDelayed(AChoreographer* choreographer,
AChoreographer_frameCallback callback, void* data, long delayMillis) {
AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed(
- callback, data, ms2ns(delayMillis));
+ callback, nullptr, data, ms2ns(delayMillis));
+}
+void AChoreographer_postFrameCallback64(AChoreographer* choreographer,
+ AChoreographer_frameCallback64 callback, void* data) {
+ AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed(
+ nullptr, callback, data, 0);
+}
+void AChoreographer_postFrameCallbackDelayed64(AChoreographer* choreographer,
+ AChoreographer_frameCallback64 callback, void* data, uint32_t delayMillis) {
+ AChoreographer_to_Choreographer(choreographer)->postFrameCallbackDelayed(
+ nullptr, callback, data, ms2ns(delayMillis));
}
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index a3db2d6..e1dc406 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -21,6 +21,8 @@
AChoreographer_getInstance; # introduced=24
AChoreographer_postFrameCallback; # introduced=24
AChoreographer_postFrameCallbackDelayed; # introduced=24
+ AChoreographer_postFrameCallback64; # introduced=29
+ AChoreographer_postFrameCallbackDelayed64; # introduced=29
AConfiguration_copy;
AConfiguration_delete;
AConfiguration_diff;
diff --git a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
index efa4387..4a2d2fb 100644
--- a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
+++ b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java
@@ -130,7 +130,6 @@
R.layout.navigation_bar_window, null);
mCarNotificationWindow
.setBackgroundColor(mContext.getColor(R.color.notification_shade_background_color));
-
inflateNotificationContent();
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
@@ -246,6 +245,12 @@
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return distanceY > 0;
}
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent motionEvent) {
+ closeCarNotifications(DEFAULT_FLING_VELOCITY);
+ return false;
+ }
}
private class NotificationListTouchListener implements View.OnTouchListener {
@@ -324,6 +329,14 @@
@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
float distanceY) {
+ boolean isDown = event1.getY() - event2.getY() < 0;
+ // CarStatusBar and NavigationBar are identical so avoid the touch if it
+ // starts from NavigationBar to open.
+ if (event1.getRawY() > mCarNotificationWindow.getHeight() && isDown
+ && mCarNotificationWindow.getVisibility() == View.GONE) {
+ mIsTracking = false;
+ return true;
+ }
mIsTracking = true;
mCarNotificationWindow.setVisibility(View.VISIBLE);
@@ -345,14 +358,15 @@
boolean isUp = velocityY < 0;
float distanceDelta = Math.abs(event1.getY() - event2.getY());
-
if (isUp && distanceDelta > SWIPE_UP_MIN_DISTANCE) {
// fling up
mIsTracking = false;
closeCarNotifications(Math.abs(velocityY));
return true;
- } else if (!isUp && distanceDelta > SWIPE_DOWN_MIN_DISTANCE) {
+ } else if (!isUp && distanceDelta > SWIPE_DOWN_MIN_DISTANCE
+ && (event1.getRawY() < mCarNotificationWindow.getHeight()
+ || mCarNotificationWindow.getVisibility() == View.VISIBLE)) {
// fling down
mIsTracking = false;
openCarNotifications(velocityY);
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index cfc76b7..835fcc2 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor gegrond op jou gebruik"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor gegrond op jou gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sal op grond van jou gebruik waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Sal waarskynlik hou tot omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 6e6d58f..11dde97 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ቀርቷል"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"በአጠቃቀምዎ መሠረት <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ገደማ ቀርቷል"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"በአጠቃቀምዎ መሠረት <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ቀርቷል"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ቀርቷል"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"በአጠቃቀምዎ (<xliff:g id="LEVEL">%2$s</xliff:g>) መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"በአጠቃቀምዎ መሠረት እስከ <xliff:g id="TIME">%1$s</xliff:g> ገደማ መቆየት አለበት"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"እስከ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ገደማ ድረስ መቆየት አለበት"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 18d47ac..10d4ee5 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا، بناءً على استخدامك"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا، بناءً على استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"الوقت المتبقي: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> حسب استخدامك."</string>
<string name="power_discharge_by" msgid="6453537733650125582">"قد تكفي طاقة البطارية حتى حوالي الساعة <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 68f1e6f..dee399e 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 8e6e07d..73e3d51 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"İstifadəyə əsasən təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"İstifadəyə əsasən təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"İstifadəyə (<xliff:g id="LEVEL">%2$s</xliff:g>) əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"İstifadəyə əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> olana qədər davam edəcək (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 1cdd1fd..47b536c 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu korišćenja"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu korišćenja (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> na osnovu korišćenja"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Trajaće približno do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 1a60c3d..ee662fa 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Зараду пры такім выкарыстанні хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) пры такім выкарыстанні хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Хопіць на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Зараду хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g> пры цяперашнім узроўні выкарыстання"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Зараду (<xliff:g id="LEVEL">%2$s</xliff:g>) хопіць прыблізна да <xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index aaedce4..4e4ac9b 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> въз основа на използването"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Още <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Следва да издържи приблизително до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 4f29131..c7d1c0a 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ব্যবহারের উপর ভিত্তি করে আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ব্যবহারের উপর ভিত্তি করে আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"আর <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"বর্তমান ব্যবহার অনুযায়ী আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"আনুমানিক <xliff:g id="TIME">%1$s</xliff:g> পর্যন্ত চলবে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 4193d52..d5d13d1 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Trebala bi trajati otprilike do <xliff:g id="TIME">%1$s</xliff:g> na osnovu vaše upotrebe"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Trebala bi trajati do otprilike <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 9c3e4d9..c000a3c 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Temps restant aproximat: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> segons l\'ús que en fas"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"La bateria hauria de durar aproximadament fins a les <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index b6507bc..37b7c51 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Při vašem obvyklém využití zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zbývá <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Při vašem obvyklém využití (<xliff:g id="LEVEL">%2$s</xliff:g>) vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Při vašem obvyklém využití vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index a870cf8..628df26 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> baseret på dit forbrug"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Bør holde indtil ca. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index bb420a6c..7b63f34 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, basierend auf deiner Nutzung (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Noch <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sollte basierend auf deiner Nutzung etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Sollte etwa bis <xliff:g id="TIME">%1$s</xliff:g> reichen (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 22c1b26..7ddd3fc 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, βάσει της χρήσης σας"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, βάσει της χρήσης σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Απομένει/ουν <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου, ανάλογα με τη χρήση σας"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Θα διαρκέσει μέχρι τις <xliff:g id="TIME">%1$s</xliff:g> περίπου (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index d4f4e5e..47f31b4 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index d4f4e5e..47f31b4 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index d4f4e5e..47f31b4 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index d4f4e5e..47f31b4 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 98b63ee..bb36101 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index e803abd..22d4748 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en función de tu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duración aproximada hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index f336f1b..47b1dfa 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tiempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (según el uso)"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 14ac827..1a704e2 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäänud (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Teie kasutuse põhjal on jäänud ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Jäänud on <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Peaks teie kasutuse põhjal kestma kuni <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Peaks kestma kuni <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 04710c7..9e1af11 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Erabilera kontuan izanda, <xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Erabilera kontuan izanda, <xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> gelditzen dira"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Erabileraren arabera, ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Ordu honetara arte iraungo du, gutxi gorabehera: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 8f55092..087a7ff 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"براساس مصرفتان، تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"براساس مصرفتان، تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"با توجه به میزان مصرفتان (<xliff:g id="LEVEL">%2$s</xliff:g>)، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"باتوجه به میزان مصرفتان، باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> شارژ داشته باشید"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"باید حدوداً تا <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) شارژ داشته باشید"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 5802a03..ac1f8a5 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä käyttösi perusteella"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä käyttösi perusteella (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Varaus loppuu käyttösi perusteella noin <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Varaus loppuu noin <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index ec8d6b0..acbc028 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en fonction de votre usage"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant : <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g>, en fonction de votre usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 0b620d8..080074a 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Temps restant : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Temps restant en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>) : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Temps restant : <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre utilisation"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Devrait durer jusqu\'à environ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index b4d7fcb..26ee53d 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado en función do uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado en función do uso (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"En función do uso, debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente ata a seguinte hora: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 36e04bb..937fc30 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"તમારા વપરાશના આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"લગભગ <xliff:g id="TIME">%1$s</xliff:g> સુધી ચાલવી જોઈએ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 8b1ca93..0026d3e 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> में बैटरी खत्म हो जाएगी"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"आपके इस्तेमाल के हिसाब से बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"बैटरी लगभग <xliff:g id="TIME">%1$s</xliff:g> चलेगी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index b4cbbdb..f06d01d 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na temelju vaše upotrebe"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Još <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Otprilike bi trebalo trajati do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 589eb59..92b4e20 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra az eszköz használata alapján"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra az eszköz használata alapján (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"A használat alapján nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Nagyjából még ennyit bír: <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index ba62c84..b5e5cf5 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Լիցքը կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Լիցքը կբավարարի <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Լիցքը պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ կախված օգտագործման եղանակից"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Լիցքը (<xliff:g id="LEVEL">%2$s</xliff:g>) պետք է, որ բավականացնի մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index c5d8f30..6bd2876 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan Anda"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Akan bertahan kira-kira sampai <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 58505f5..87006ac 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir miðað við notkun þína"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> miðað við notkun þína"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Ætti að endast til u.þ.b. <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 6d863aa..b00bada 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo rimanente in base al tuo utilizzo (<xliff:g id="LEVEL">%2$s</xliff:g>): <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tempo stimato rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Tempo stimato rimanente: <xliff:g id="TIME">%1$s</xliff:g> circa (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 89d6361..ae16ecb 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"הזמן הנותר: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"הזמן הנותר על סמך השימוש שלך: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"הזמן הנותר על סמך השימוש שלך: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"הזמן הנותר: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> על סמך השימוש במכשיר"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"אמורה להחזיק מעמד בערך עד <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 233e8e8..cc7ff1e 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"電池切れの推定時間: <xliff:g id="TIME">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 09bea2a..c54fdfd 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ოხმარების გათვალისწინებით (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, მოხმარების გათვალისწინებით"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"უნდა იმუშაოს დაახლოებით <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 8670ec9..e2b40bb 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Пайдалану деректеріңізге сәйкес енді шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Пайдалану деректеріңізге сәйкес енді шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Пайдалануға байланысты шамамен <xliff:g id="TIME">%1$s</xliff:g> уақытқа жетеді"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Шамамен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) уақытқа жетеді"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 6bf8a0f..1654831 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត ផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"នៅសល់ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ដោយផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"គួរតែអាចប្រើបានរហូតដល់ម៉ោងប្រហែល <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 1e9a0d5..457a163 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"(<xliff:g id="LEVEL">%2$s</xliff:g>) ತಲುಪಲು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ನಿಮ್ಮ ಬಳಕೆಯ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ನಿಮ್ಮ ಬಳಕೆ (<xliff:g id="LEVEL">%2$s</xliff:g>) ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ನಿಮ್ಮ ಬಳಕೆ ಆಧರಿಸಿ <xliff:g id="TIME">%1$s</xliff:g> ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) ಸಮಯದವರೆಗೆ ಫೋನ್ ರನ್ ಆಗಬೇಕು"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 877866c..d19b9f2 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"남은 시간 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"내 사용량을 기준으로 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> 남음"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"내 사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> 남음"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"남은 시간: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"사용량(<xliff:g id="LEVEL">%2$s</xliff:g>)을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"약 <xliff:g id="TIME">%1$s</xliff:g>까지 사용 가능(<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 9e4a9a8..9bc6d58 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Колдонгонуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> кийин өчөт"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Болжол менен <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) кийин өчөт"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 7e6aaac..5c10aab 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"ເຫຼືອອີກ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> based on your usage"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Should last until about <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 71b8cf0..d437bc7 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, atsižvelgiant į naudojimą"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>, atsižvelgiant į naudojimą (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Liko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Pagal tai, kaip naudojama, turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Turėtų išsikrauti maždaug po <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 82ec0ae..afa9127 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Aptuvenais atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ņemot vērā lietojumu, atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ņemot vērā lietojumu, atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Ņemot vērā lietojumu (<xliff:g id="LEVEL">%2$s</xliff:g>), darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>."</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Ņemot vērā lietojumu, darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Darbosies aptuveni līdz <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index c99ef68..ebc4fda 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> според вашето користење"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Уште <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> според вашето користење"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Треба да трае до околу <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index ae97fb2..f04bfcc 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ്"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> വരെ നീണ്ടുനിൽക്കേണ്ടതാണ് (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 10c1415..498b855 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Таны хэрэглээнд үндэслэн ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Таны хэрэглээнд үндэслэн ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Таны хэрэглээнд (<xliff:g id="LEVEL">%2$s</xliff:g>) тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Таны хэрэглээнд тулгуурлан ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> хүртэл барих ёстой (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 88de8f4..7729f21 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"तुमच्या वापरावर आधारित अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"तुमच्या वापरावर आधारित अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तुमच्या वापरावर अवलंबून सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकावी"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> पर्यंत टिकेल (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index e98418d..236e30d 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan anda"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Seharusnya boleh digunakan hingga kira-kira <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index ed2aae6..88eef56 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"သင်၏ အသုံးပြုမှု အပေါ် မူတည်၍ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည်"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"သင်၏ အသုံးပြုမှု အပေါ် မူတည်၍ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျန်သည်"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"သင်၏ အသုံးပြုမှုအပေါ် အခြေခံ၍ <xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည်"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်အထိ သုံးနိုင်သည် (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 93e53e5..259ed34 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår basert på bruken din"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g>, basert på bruken din"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Skal vare til omtrent <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index ac15f1b..451691b 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"तपाईंको प्रयोगको आधारमा लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"तपाईंको प्रयोगको आधारमा लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"ब्याट्री लगभग <xliff:g id="TIME">%1$s</xliff:g> सम्म टिक्नु पर्छ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 959c1ea..00c36de 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend op basis van je gebruik"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> op basis van je gebruik"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Is nog genoeg tot ongeveer <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 847586e..b24b4a2 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ପାଇଁ (<xliff:g id="LEVEL">%2$s</xliff:g>) ବଳକା ଅଛି"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି (<xliff:g id="LEVEL">%2$s</xliff:g>) ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ବ୍ୟାଟେରୀ <xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ ଚାଲିବ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ବ୍ୟାଟେରୀ <xliff:g id="TIME">%1$s</xliff:g> ପର୍ଯ୍ୟନ୍ତ ଚାଲିବ"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"ବ୍ୟାଟେରୀ ପାଖାପାଖି <xliff:g id="TIME">%1$s</xliff:g> ଚାଲିବ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 0675b6b..21a7ab9 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਚੱਲੇਗਾ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 505e395..e053514 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) (na podstawie Twojego sposobu korzystania)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Jeszcze <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Na podstawie Twojego sposobu korzystania (<xliff:g id="LEVEL">%2$s</xliff:g>) jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Na podstawie Twojego sposobu korzystania jeszcze około <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Powinno wystarczyć do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index c0f31a6..46b2f93 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 08c3cc8..dd7861d 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> com base na sua utilização"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Resta(m) <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização."</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca da(s) <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index c0f31a6..46b2f93 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tempo restante aproximado, com base no seu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> com base no seu uso"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Deve durar até cerca de <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 015eb92..3364ce5 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Timp aproximativ rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"În baza utilizării, timpul rămas este de aproximativ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Timp rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"În baza utilizării, ar trebui să reziste până la aproximativ <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Ar trebui să reziste până la <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index b0b592c..ffd477d 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Заряда хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g> при текущем уровне расхода"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g> при текущем уровне расхода"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Заряда хватит на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"При текущем уровне использования (<xliff:g id="LEVEL">%2$s</xliff:g>) заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"При текущем уровне использования заряда хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Заряда (<xliff:g id="LEVEL">%2$s</xliff:g>) хватит примерно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index ca7a962..f3372b3 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ක් පමණ ඉතිරියි (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME_REMAINING">%1$s</xliff:g> පමණ ඉතිරිව ඇත"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME_REMAINING">%1$s</xliff:g> පමණ ඉතිරිව ඇත (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ඉතිරිව ඇත"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"<xliff:g id="TIME">%1$s</xliff:g> පමණ වන තෙක් (<xliff:g id="LEVEL">%2$s</xliff:g>) ඔබේ භාවිතය මත පදනම්ව තිබිය යුුතුය"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"ඔබේ භාවිතය මත පදනම්ව <xliff:g id="TIME">%1$s</xliff:g> පමන වන තෙක් තිබිය යුතුය"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>) පමණ වන තෙක් තිබිය යුතුය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index dd7efdd..5451a0b 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> – závisí to od intenzity využitia"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g> – závisí to od intenzity využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zostáva <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Mal by vydržať približne do <xliff:g id="TIME">%1$s</xliff:g> v závislosti od využitia"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Mal by vydržať približne <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index fada686..57265ca 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Glede na način uporabe še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Glede na način uporabe še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Še <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Naprava bi morala glede na način uporabe (<xliff:g id="LEVEL">%2$s</xliff:g>) delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Naprava bi morala glede na način uporabe delovati do približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Naprava bi morala delovati do približno <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 2132767..231cc1e 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> bazuar në përdorimin tënd"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Duhet të zgjasë deri në rreth <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 6cf4b20..42900f7 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> на основу коришћења"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g> на основу коришћења (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Још <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> на основу коришћења"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Трајаће приближно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index f2950dc..cc5b76b 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar utifrån din användning"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> utifrån din användning"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Bör räcka ungefär till klockan <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index d8a74a1..ebe1501 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kulingana na jinsi unavyoitumia"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kulingana na jinsi unavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Zimesalia <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Inapaswa kudumu hadi <xliff:g id="TIME">%1$s</xliff:g> kulingana na jinsi unavyoitumia"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Inapaswa kudumu kwa takribani <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 3cf43c8..951bf99 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> மீதமுள்ளது"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில், <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"நீங்கள் பயன்படுத்துவதன் அடிப்படையில் <xliff:g id="TIME">%1$s</xliff:g> வரை உபயோகிக்க முடியும்"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"<xliff:g id="TIME">%1$s</xliff:g> வரை பயன்படுத்த முடியும் (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index e4dd85f..f7b98d1 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> మిగిలి ఉంది"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"మీ వినియోగం ఆధారంగా <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"మీ వినియోగం ఆధారంగా దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"దాదాపు <xliff:g id="TIME">%1$s</xliff:g> వరకు ఉండాలి (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index cf8362f..7d161bb 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"เหลืออีก <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> เมื่อดูจากการใช้งานของคุณ"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"น่าจะใช้งานได้ถึงเวลาประมาณ <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index e690800..e9a2a6f 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira batay sa iyong paggamit"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> batay sa iyong paggamit"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Tatagal dapat nang hanggang humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index ea340e8..73f1c40 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kullanımınıza göre saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Saat yaklaşık <xliff:g id="TIME">%1$s</xliff:g> olana kadar kullanılabilmelidir (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index cf90ed1..41d6883 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Згідно з даними про використання залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Згідно з даними про використання залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Залишилося <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"На основі даних про використання (<xliff:g id="LEVEL">%2$s</xliff:g>), вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"На основі даних про використання, вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Вистачить приблизно до <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index c223629..0478a76 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"تقریباً <xliff:g id="TIME">%1$s</xliff:g> تک بیٹری چلے گی (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 2851baf..d4eb44b 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Joriy holatda taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Joriy holatda taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> gacha davom etadi (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 3fb101e..050ee9c 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Còn <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Sẽ hết pin cho tới khoảng <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 0a318d7..e25e4dc 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根据您的使用情况,大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>(目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根据您的使用情况,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"目前电量为 <xliff:g id="LEVEL">%2$s</xliff:g>,估计能用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 06bee94..3e357b1 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根據您的使用情況,還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根據您的使用情況,還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"還有 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據您的使用情況 (<xliff:g id="LEVEL">%2$s</xliff:g>),電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據您的使用情況,電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"電量剩餘約 <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index a5074d9..60330ef 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"根據你的使用情形,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"還能使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"根據你的使用情形,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 5892093..a1be06c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -377,7 +377,8 @@
<string name="power_discharging_duration" msgid="8848256785736335185">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele ngokususelwe ekusebenziseni wakho"</string>
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele ngokususelwe ekusebenziseni kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> esele"</string>
+ <!-- no translation found for power_remaining_duration_only_short (9183070574408359726) -->
+ <skip />
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Kumele ihlale cishe kube ngu-<xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 4fc62bb..d9b4885 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -833,6 +833,11 @@
return ssid;
}
+ /**
+ * Returns the name associated with the stored config.
+ * @deprecated Please use {@link #getTitle()} instead to get the display name of an AccessPoint.
+ */
+ @Deprecated
public String getConfigName() {
if (mConfig != null && mConfig.isPasspoint()) {
return mConfig.providerFriendlyName;
@@ -895,6 +900,8 @@
public String getTitle() {
if (isPasspoint()) {
return mConfig.providerFriendlyName;
+ } else if (isPasspointConfig()) {
+ return mProviderFriendlyName;
} else if (isOsuProvider()) {
return mOsuProvider.getFriendlyName();
} else {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index 1fa7083..6269a71 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -232,7 +232,7 @@
* Updates the title and summary; may indirectly call notifyChanged().
*/
public void refresh() {
- setTitle(this, mAccessPoint, mForSavedNetworks);
+ setTitle(this, mAccessPoint);
final Context context = getContext();
int level = mAccessPoint.getLevel();
int wifiSpeed = mAccessPoint.getSpeed();
@@ -262,12 +262,8 @@
}
@VisibleForTesting
- static void setTitle(AccessPointPreference preference, AccessPoint ap, boolean savedNetworks) {
- if (savedNetworks) {
- preference.setTitle(ap.getConfigName());
- } else {
- preference.setTitle(ap.getTitle());
- }
+ static void setTitle(AccessPointPreference preference, AccessPoint ap) {
+ preference.setTitle(ap.getTitle());
}
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index a31d64c..fdc0fd3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -608,23 +608,23 @@
// Log accesspoints that are being removed
if (DBG()) {
- Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------");
+ Log.d(TAG,
+ "------ Dumping AccessPoints that were not seen on this scan ------");
for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
- if (prevAccessPoint.getSsid() == null)
- continue;
- String prevSsid = prevAccessPoint.getSsidStr();
+ String prevTitle = prevAccessPoint.getTitle();
boolean found = false;
for (AccessPoint newAccessPoint : accessPoints) {
- if (newAccessPoint.getSsidStr() != null && newAccessPoint.getSsidStr()
- .equals(prevSsid)) {
+ if (newAccessPoint.getTitle() != null && newAccessPoint.getTitle()
+ .equals(prevTitle)) {
found = true;
break;
}
}
if (!found)
- Log.d(TAG, "Did not find " + prevSsid + " in this scan");
+ Log.d(TAG, "Did not find " + prevTitle + " in this scan");
}
- Log.d(TAG, "---- Done dumping SSIDs that were not seen on this scan ----");
+ Log.d(TAG,
+ "---- Done dumping AccessPoints that were not seen on this scan ----");
}
mInternalAccessPoints.clear();
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 06f5fde..7c367c7 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -713,7 +713,7 @@
.setProviderFriendlyName(providerFriendlyName).build();
assertThat(ap.isPasspointConfig()).isTrue();
assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn);
- assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName);
+ assertThat(ap.getTitle()).isEqualTo(providerFriendlyName);
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
index c5cbea7..21aa526 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
@@ -98,7 +98,7 @@
.build();
final AccessPointPreference preference = mock(AccessPointPreference.class);
- AccessPointPreference.setTitle(preference, ap, false /* savedNetwork */);
+ AccessPointPreference.setTitle(preference, ap);
verify(preference).setTitle(ssid);
}
}
diff --git a/packages/SystemUI/res-keyguard/layout/type_clock.xml b/packages/SystemUI/res-keyguard/layout/type_aod_clock.xml
similarity index 73%
rename from packages/SystemUI/res-keyguard/layout/type_clock.xml
rename to packages/SystemUI/res-keyguard/layout/type_aod_clock.xml
index 89bbc09..28ff5a2 100644
--- a/packages/SystemUI/res-keyguard/layout/type_clock.xml
+++ b/packages/SystemUI/res-keyguard/layout/type_aod_clock.xml
@@ -19,13 +19,5 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
>
- <com.android.keyguard.clock.TypographicClock
- android:id="@+id/type_clock"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="50dp"
- android:textAlignment="viewStart"
- style="@style/widget_big"
- android:textSize="40dp"
- />
+ <include layout="@layout/typographic_clock" />
</com.android.keyguard.clock.ClockLayout>
diff --git a/packages/SystemUI/res-keyguard/layout/type_clock.xml b/packages/SystemUI/res-keyguard/layout/typographic_clock.xml
similarity index 63%
copy from packages/SystemUI/res-keyguard/layout/type_clock.xml
copy to packages/SystemUI/res-keyguard/layout/typographic_clock.xml
index 89bbc09..73bb4b9 100644
--- a/packages/SystemUI/res-keyguard/layout/type_clock.xml
+++ b/packages/SystemUI/res-keyguard/layout/typographic_clock.xml
@@ -14,18 +14,13 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<com.android.keyguard.clock.ClockLayout
+<com.android.keyguard.clock.TypographicClock
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/type_clock"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <com.android.keyguard.clock.TypographicClock
- android:id="@+id/type_clock"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="50dp"
- android:textAlignment="viewStart"
- style="@style/widget_big"
- android:textSize="40dp"
- />
-</com.android.keyguard.clock.ClockLayout>
+ android:layout_height="wrap_content"
+ android:paddingStart="50dp"
+ android:textAlignment="viewStart"
+ style="@style/widget_big"
+ android:textSize="40dp"
+ />
diff --git a/packages/SystemUI/res/values-land/integers.xml b/packages/SystemUI/res/layout/assistant_handle.xml
similarity index 62%
copy from packages/SystemUI/res/values-land/integers.xml
copy to packages/SystemUI/res/layout/assistant_handle.xml
index fb22665..a952ca5 100644
--- a/packages/SystemUI/res/values-land/integers.xml
+++ b/packages/SystemUI/res/layout/assistant_handle.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2018 The Android Open Source Project
+ ~ Copyright (C) 2019 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.
@@ -14,9 +14,12 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<resources>
- <!-- Action footer width is set to 0 to allow it to stretch (through a weight of 1) and center
- the page indicator in between the footer and the carrier text.-->
- <integer name="qs_footer_actions_width">0</integer>
- <integer name="qs_footer_actions_weight">1</integer>
-</resources>
\ No newline at end of file
+
+<com.android.systemui.statusbar.phone.NavigationHandle
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/assistant_handle"
+ android:layout_width="@dimen/navigation_assistant_handle_width"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+/>
+
diff --git a/packages/SystemUI/res/layout/global_actions_grid_item.xml b/packages/SystemUI/res/layout/global_actions_grid_item.xml
index 5dee09d..999c7b8 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_item.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_item.xml
@@ -35,7 +35,7 @@
android:layout_marginBottom="@dimen/global_actions_grid_item_icon_bottom_margin"
android:layout_marginLeft="@dimen/global_actions_grid_item_icon_side_margin"
android:layout_marginRight="@dimen/global_actions_grid_item_icon_side_margin"
- android:scaleType="center"
+ android:scaleType="centerInside"
android:alpha="?android:attr/primaryContentAlpha"
/>
diff --git a/packages/SystemUI/res/layout/home_handle.xml b/packages/SystemUI/res/layout/home_handle.xml
index 48ea5c4..d950f39 100644
--- a/packages/SystemUI/res/layout/home_handle.xml
+++ b/packages/SystemUI/res/layout/home_handle.xml
@@ -18,7 +18,7 @@
<com.android.systemui.statusbar.phone.NavigationHandle
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/home_handle"
- android:layout_width="@dimen/navigation_handle_width"
+ android:layout_width="@dimen/navigation_home_handle_width"
android:layout_height="match_parent"
android:layout_weight="0"
/>
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index 5ecd380..bfd079b 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -65,8 +65,8 @@
android:layout_gravity="center_vertical">
<com.android.systemui.statusbar.AnimatedImageView
android:id="@+id/mobile_signal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
+ android:layout_height="@dimen/qs_header_mobile_icon_size"
+ android:layout_width="@dimen/qs_header_mobile_icon_size"
systemui:hasOverlappingRendering="false"
/>
<ImageView
diff --git a/packages/SystemUI/res/layout/qs_footer_carrier.xml b/packages/SystemUI/res/layout/qs_carrier.xml
similarity index 70%
rename from packages/SystemUI/res/layout/qs_footer_carrier.xml
rename to packages/SystemUI/res/layout/qs_carrier.xml
index bd492b0..6edccba 100644
--- a/packages/SystemUI/res/layout/qs_footer_carrier.xml
+++ b/packages/SystemUI/res/layout/qs_carrier.xml
@@ -14,36 +14,33 @@
~ limitations under the License
-->
-<LinearLayout
+<com.android.systemui.qs.QSCarrier
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/linear_footer_carrier"
- android:layout_width="0dp"
+ android:id="@+id/linear_carrier"
+ android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:layout_weight="1"
android:gravity="center_vertical|start"
android:background="@android:color/transparent"
android:clickable="false"
android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingStart="16dp" >
+ android:clipToPadding="false" >
<include
layout="@layout/mobile_signal_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginEnd="8dp"
+ android:layout_marginEnd="@dimen/qs_carrier_margin_width"
android:visibility="gone" />
- <view class="com.android.systemui.qs.QSFooterImpl$QSCarrierText"
+ <view class="com.android.systemui.qs.QSCarrier$QSCarrierText"
android:id="@+id/qs_carrier_text"
- android:layout_width="0dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.QS.CarrierInfo"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.QS.Status"
android:textDirection="locale"
- android:singleLine="true" />
+ android:singleLine="true"
+ android:maxEms="7"/>
-</LinearLayout>
\ No newline at end of file
+</com.android.systemui.qs.QSCarrier>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/qs_carrier_group.xml b/packages/SystemUI/res/layout/qs_carrier_group.xml
new file mode 100644
index 0000000..20190b7
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_carrier_group.xml
@@ -0,0 +1,58 @@
+<!--
+ Copyright (C) 2019 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
+ -->
+
+<!-- Extends LinearLayout -->
+<com.android.systemui.qs.QSCarrierGroup
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/qs_mobile"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="end|center_vertical"
+ android:orientation="horizontal">
+
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier1"
+ android:layout_weight="1"/>
+
+ <View
+ android:id="@+id/qs_carrier_divider1"
+ android:layout_width="@dimen/qs_header_carrier_separator_width"
+ android:layout_height="match_parent"
+ android:visibility="gone" />
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier2"
+ android:layout_weight="1"
+ android:visibility="gone"/>
+
+ <View
+ android:id="@+id/qs_carrier_divider2"
+ android:layout_width="@dimen/qs_header_carrier_separator_width"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="gone" />
+
+ <include
+ layout="@layout/qs_carrier"
+ android:id="@+id/carrier3"
+ android:layout_weight="1"
+ android:visibility="gone"/>
+
+</com.android.systemui.qs.QSCarrierGroup>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index 67e31ac..669d53b 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -21,6 +21,8 @@
android:id="@+id/qs_footer"
android:layout_width="match_parent"
android:layout_height="@dimen/qs_footer_height"
+ android:layout_marginStart="@dimen/qs_footer_margin"
+ android:layout_marginEnd="@dimen/qs_footer_margin"
android:elevation="4dp"
android:background="@android:color/transparent"
android:baselineAligned="false"
@@ -41,34 +43,35 @@
android:layout_gravity="center_vertical"
android:gravity="end" >
- <LinearLayout
- android:id="@+id/qs_mobile"
- android:layout_width="0dp"
+ <com.android.keyguard.AlphaOptimizedLinearLayout
+ android:id="@+id/qs_footer_actions_edit_container"
+ android:layout_width="@integer/qs_footer_actions_width"
android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center_vertical|start"
- android:orientation="horizontal"
- android:layout_marginEnd="32dp">
+ android:layout_weight="@integer/qs_footer_actions_weight"
+ android:gravity="center_vertical|start" >
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@android:id/edit"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:clipToPadding="false"
+ android:contentDescription="@string/accessibility_quick_settings_edit"
+ android:focusable="true"
+ android:padding="@dimen/qs_footer_icon_padding"
+ android:src="@*android:drawable/ic_mode_edit"
+ android:tint="?android:attr/colorForeground"/>
- <include
- layout="@layout/qs_footer_carrier"
- android:id="@+id/carrier1" />
-
- <View
- android:id="@+id/qs_carrier_divider"
- android:layout_width="2dp"
+ <TextView
+ android:id="@+id/build"
+ android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_marginTop="15dp"
- android:layout_marginBottom="15dp"
- android:background="?android:attr/dividerVertical"
- android:visibility="gone" />
-
- <include
- layout="@layout/qs_footer_carrier"
- android:id="@+id/carrier2"
+ android:clickable="true"
+ android:gravity="center_vertical"
+ android:focusable="true"
+ android:textAppearance="@style/TextAppearance.QS.Status"
android:visibility="gone"/>
-
- </LinearLayout>
+ </com.android.keyguard.AlphaOptimizedLinearLayout>
<com.android.systemui.qs.PageIndicator
android:id="@+id/footer_page_indicator"
@@ -85,8 +88,8 @@
android:gravity="center_vertical|end" >
<com.android.systemui.statusbar.phone.MultiUserSwitch
android:id="@+id/multi_user_switch"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
android:layout_alignParentEnd="true"
android:background="@drawable/ripple_drawable"
android:focusable="true">
@@ -96,26 +99,14 @@
android:layout_width="@dimen/multi_user_avatar_expanded_size"
android:layout_height="@dimen/multi_user_avatar_expanded_size"
android:layout_gravity="center"
+ android:tint="?android:attr/colorAccent"
android:scaleType="centerInside"/>
</com.android.systemui.statusbar.phone.MultiUserSwitch>
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@android:id/edit"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:clickable="true"
- android:clipToPadding="false"
- android:contentDescription="@string/accessibility_quick_settings_edit"
- android:focusable="true"
- android:padding="15dp"
- android:src="@*android:drawable/ic_mode_edit"
- android:tint="?android:attr/colorForeground"/>
-
<com.android.systemui.statusbar.AlphaOptimizedFrameLayout
android:id="@+id/settings_button_container"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/qs_footer_action_button_size"
+ android:layout_height="@dimen/qs_footer_action_button_size"
android:clipChildren="false"
android:clipToPadding="false">
@@ -124,10 +115,12 @@
style="@android:style/Widget.Material.Button.Borderless"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:padding="@dimen/qs_footer_icon_padding"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/accessibility_quick_settings_settings"
- android:padding="15dp"
- android:src="@drawable/ic_settings_16dp"
+ android:src="@drawable/ic_settings"
+ android:scaleType="centerInside"
android:tint="?android:attr/colorForeground"/>
<com.android.systemui.statusbar.AlphaOptimizedImageView
@@ -143,7 +136,6 @@
</com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
</com.android.keyguard.AlphaOptimizedLinearLayout>
</LinearLayout>
-
<View
android:id="@+id/qs_drag_handle_view"
android:layout_width="24dp"
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 8c57ae8..01dfeb2 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -58,7 +58,7 @@
android:elevation="4dp"
android:background="@android:color/transparent"
android:focusable="true"
- android:accessibilityTraversalBefore="@id/qs_carrier_text"
+ android:accessibilityTraversalBefore="@android:id/edit"
/>
<include layout="@layout/quick_status_bar_expanded_header" />
diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml
index 967e13f..075f51d 100644
--- a/packages/SystemUI/res/layout/quick_settings_header_info.xml
+++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml
@@ -25,7 +25,7 @@
android:id="@+id/long_press_tooltip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
+ android:layout_gravity="start|bottom"
android:alpha="0"
android:text="@string/quick_settings_header_onboarding_text"
android:textAppearance="@style/TextAppearance.QS.TileLabel"
@@ -33,54 +33,69 @@
android:visibility="invisible" />
<LinearLayout
- android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
- android:gravity="center_vertical"
- android:alpha="0">
+ android:layout_gravity="start|bottom"
+ android:gravity="center_vertical">
- <ImageView
- android:id="@+id/next_alarm_icon"
- android:layout_width="@dimen/qs_header_alarm_icon_size"
- android:layout_height="@dimen/qs_header_alarm_icon_size"
- android:src="@drawable/stat_sys_alarm"
- android:tint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
-
- <TextView
- android:id="@+id/next_alarm_text"
+ <LinearLayout
+ android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
- android:textAppearance="@style/TextAppearance.QS.TileLabel"
- android:visibility="gone"/>
+ android:layout_gravity="start|center_vertical"
+ android:layout_weight="1"
+ android:gravity="center_vertical"
+ android:alpha="0">
+
+ <ImageView
+ android:id="@+id/next_alarm_icon"
+ android:layout_width="@dimen/qs_header_alarm_icon_size"
+ android:layout_height="@dimen/qs_header_alarm_icon_size"
+ android:src="@drawable/stat_sys_alarm"
+ android:tint="?android:attr/textColorPrimary"
+ android:visibility="gone"/>
+
+ <TextView
+ android:id="@+id/next_alarm_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
+ android:textAppearance="@style/TextAppearance.QS.Status"
+ android:visibility="gone"/>
+
+ <View
+ android:id="@+id/status_separator"
+ android:layout_width="@dimen/qs_header_separator_width"
+ android:layout_height="match_parent"
+ android:visibility="gone"/>
+
+ <ImageView
+ android:id="@+id/ringer_mode_icon"
+ android:layout_width="@dimen/qs_header_alarm_icon_size"
+ android:layout_height="@dimen/qs_header_alarm_icon_size"
+ android:tint="?android:attr/textColorPrimary"
+ android:visibility="gone"/>
+
+ <TextView
+ android:id="@+id/ringer_mode_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
+ android:textAppearance="@style/TextAppearance.QS.Status"
+ android:visibility="gone"/>
+ </LinearLayout>
<View
- android:id="@+id/status_separator"
- android:layout_width="1dp"
+ android:minWidth="@dimen/qs_status_separator"
+ android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_marginStart="10dp"
- android:layout_marginEnd="10dp"
- android:background="@android:color/white"
- android:backgroundTint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
+ android:layout_weight="1"/>
- <ImageView
- android:id="@+id/ringer_mode_icon"
- android:layout_width="@dimen/qs_header_alarm_icon_size"
- android:layout_height="@dimen/qs_header_alarm_icon_size"
- android:tint="?android:attr/textColorPrimary"
- android:visibility="gone"/>
-
- <TextView
- android:id="@+id/ringer_mode_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start"
- android:textAppearance="@style/TextAppearance.QS.TileLabel"
- android:visibility="gone"/>
-
+ <include layout="@layout/qs_carrier_group"
+ android:id="@+id/carrier_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android_layout_gravity="center vertical|end"/>
</LinearLayout>
</FrameLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 9ff72e8..006e8041 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi is aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen Wi-Fi-netwerke beskikbaar nie"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Skakel tans aan …"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Skermuitsending"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Saai tans uit"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Onbenoemde toestel"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gereed om uit te saai"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 9a3aa2b..89dad9a 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"በማብራት ላይ..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"የማያ ገጽ መውሰድ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ለመውሰድ ዝግጁ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 0398dcc..f1904f8 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -329,8 +329,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"تم تشغيل Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"لا تتوفر أي شبكة Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"جارٍ التفعيل…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"بث الشاشة"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"جارٍ الإرسال"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"جهاز لا يحمل اسمًا"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"جاهز للإرسال"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index ef969ab..43fd06f 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ৱাই-ফাই অন হৈ আছে"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ৱাই-ফাই নেটৱৰ্ক নাই"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"অন কৰি থকা হৈছে…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"স্ক্ৰীণ কাষ্ট"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"কাষ্টিং"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নাম নথকা ডিভাইচ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাষ্টৰ বাবে সাজু"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index ab5c1f5..9682755 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiv edilir..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Yayıma hazırdır"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 05eea12..fed8601 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključuje se..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Prebacivanje ekrana"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spremno za prebacivanje"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index e2f8afd..31ce237 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -329,8 +329,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi уключаны"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма даступнай сеткі Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Уключэнне…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Відэа з экрана"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Ідзе перадача"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Прылада без назвы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Гатова для трансляцыі"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 10a5ecb..1330373 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Функцията за Wi-Fi е включена"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма налични Wi-Fi мрежи"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Включва се..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Предаване на екрана"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Предава се"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Устройство без име"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово за предаване"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index bff2ade..2628a24 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"চালু করা হচ্ছে…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"স্ক্রিন কাস্ট"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাস্ট করার জন্য প্রস্তুত"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index be07da3..11ba800 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nema dostupnih WiFi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključivanje…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Emitiranje na ekranu"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za emitiranje"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index faf2833..c19a1ef 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"La Wi-Fi està activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hi ha cap xarxa Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"S\'està activant…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"A punt per emetre"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index a0481a2..0b10d79 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Zapínání…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Vzdálená obrazovka"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Připraveno k vysílání"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9ab5350..9d8631c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er slået til"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Der er ingen tilgængelige Wi-Fi-netværk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiverer…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Cast af skærm"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Caster"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhed uden navn"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klar til at caste"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index e22c641..b6ca09c 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -329,8 +329,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN an"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Keine WLANs verfügbar"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Wird aktiviert…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Bildschirm übertragen"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Wird übertragen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unbenanntes Gerät"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Startklar"</string>
@@ -806,7 +805,7 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimieren"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Schließen"</string>
<string name="pip_phone_settings" msgid="8080777499521528521">"Einstellungen"</string>
- <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zum Schließen nach unten ziehen"</string>
+ <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zum Verwerfen nach unten ziehen"</string>
<string name="pip_menu_title" msgid="4707292089961887657">"Menü"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ist in Bild im Bild"</string>
<string name="pip_notification_message" msgid="5619512781514343311">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 28239ae..aab426e 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Ενεργό Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Δεν υπάρχουν διαθέσιμα δίκτυα Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ενεργοποίηση…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Μετάδοση οθόνης"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Μετάδοση"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ανώνυμη συσκευή"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Έτοιμο για μετάδοση"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index d63a8fd..1360b87 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 6f510b6..926b077 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index d63a8fd..1360b87 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index d63a8fd..1360b87 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index c8887de..e23236a 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 647346c..cb707ae 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay redes Wi-Fi disponibles"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmisión de pantalla"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitiendo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para transmitir"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 27784ab..bccfdd3 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay ninguna red Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Enviar pantalla"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Enviando"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para enviar"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 633c164..2c33935 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi on sees"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"WiFi-võrke pole saadaval"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Sisselülitamine …"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekraanikuva ülekandmine"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Osatäitjad"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimeta seade"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Valmis ülekandmiseks"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 937a6ff..7fb5950 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -56,7 +56,7 @@
<string name="always_use_accessory" msgid="3257892669444535154">"Ireki <xliff:g id="APPLICATION">%1$s</xliff:g> <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> konektatzen den guztietan"</string>
<string name="usb_debugging_title" msgid="4513918393387141949">"USB arazketa onartu?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
- <string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Eman beti ordenagailu honetatik arazteko baimena"</string>
<string name="usb_debugging_allow" msgid="2272145052073254852">"Eman baimena"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string>
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string>
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Aktibatuta dago Wi-Fi konexioa"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ez dago Wi-Fi sarerik erabilgarri"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktibatzen…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Pantaila igortzeko aukera"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Igortzen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Izenik gabeko gailua"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Igortzeko prest"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 13f9772..fc67514 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi روشن"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"هیچ شبکه Wi-Fi موجود نیست"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"روشن کردن…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"فرستادن صفحه نمایش"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"در حال فرستادن"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"دستگاه بدون نام"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"آماده برای فرستادن"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 7275497..e12733a 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi on käytössä"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ei Wi-Fi-verkkoja käytettävissä"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Otetaan käyttöön…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Näytön suoratoisto"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Lähetetään"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimetön laite"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Valmis lähetystä varten"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 397b88d..c273475 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi à proximité"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activation en cours…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Diffusion de l\'écran"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Prêt à diffuser"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 22f68e1..4935672 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activation…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Diffusion de l\'écran"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Prêt à caster"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index bd4b835..524401a 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Non hai redes wifi dispoñibles"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Emisión da pantalla"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sen nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para emitir"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 87bda38..ac2af34 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"વાઇ-ફાઇ ચાલુ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"કોઈ વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ નથી"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ચાલુ કરી રહ્યાં છીએ…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"સ્ક્રીન કાસ્ટ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"કાસ્ટ કરી રહ્યાં છે"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"અનામાંકિત ઉપકરણ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"કાસ્ટ કરવા માટે તૈયાર"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 998e045..c81a159 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाई-फ़ाई चालू है"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"कोई भी वाई-फ़ाई नेटवर्क उपलब्ध नहीं है"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"वाई-फ़ाई चालू हो रहा है…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"स्क्रीन कास्ट करना"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्टिंग"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"अनाम डिवाइस"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"कास्ट करने के लिए तैयार"</string>
@@ -438,10 +437,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"बैटरी सेवर चालू है"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"निष्पादन और पृष्ठभूमि डेटा को कम करता है"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"बैटरी सेवर बंद करें"</string>
- <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
- <skip />
- <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
- <skip />
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपकी स्क्रीन की सभी सामग्री कैप्चर करेगा. इसमें सूचनाएं, पासवर्ड, फ़ोटो, मैसेज, और पैसे चुकाने की जानकारी भी शामिल होगी."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> को अपनी स्क्रीन रिकॉर्ड या कास्ट करने की मंज़ूरी दें?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सभी को हटाएं"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"प्रबंधित करें"</string>
@@ -819,8 +816,7 @@
<string name="high_temp_notif_message" msgid="5642466103153429279">"फ़ोन के ठंडा होने के दौरान कुछ सुविधाएं सीमित होती हैं"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अभी भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा."</string>
<string name="high_temp_alarm_title" msgid="442812040762745210">"चार्जर निकालें"</string>
- <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
- <skip />
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"इस डिवाइस को चार्ज करने में समस्या हुई. पावर अडैप्टर का प्लग निकालें. ऐसा करते समय सावधानी बरतें क्योंकि तार गर्म हो सकता है."</string>
<string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"प्रबंधन से जुड़े चरण देखें"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"बायां शॉर्टकट"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"दायां शॉर्टकट"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index cb34573..3173f71 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključivanje…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Emitiranje zaslona"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitiranje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Uređaj bez naziva"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za emitiranje"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index db9ce2b..815c8bc 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi bekapcsolva"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nincs elérhető Wi-Fi-hálózat"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Bekapcsolás…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Képernyőátküldés"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Átküldés"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Név nélküli eszköz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Küldésre kész"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 31f52cd..2f910b7 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi-ը միացված է"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Հասանելի Wi-Fi ցանցեր չկան"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Միացում…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Էկրանի հեռարձակում"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Հեռարձակում"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Անանուն սարք"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Պատրաստ է հեռարձակման"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 9f88ef1..cef419e 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktif"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tidak ada jaringan Wi-Fi yang tersedia"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Mengaktifkan…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmisi Layar"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Melakukan transmisi"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Perangkat tanpa nama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Siap melakukan transmisi"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 012fa31..b65c7c2 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kveikt á Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Engin Wi-Fi net í boði"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Kveikir…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Skjáútsending"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Sendir út"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ónefnt tæki"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tilbúið í útsendingu"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index de7a69b..ffcff5e 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi attivo"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nessuna rete Wi-Fi disponibile"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Attivazione…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Trasmissione schermo"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"In trasmissione"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo senza nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto a trasmettere"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 2f71591..b9844bc 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi פועל"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"אין רשתות Wi-Fi זמינות"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ההפעלה מתבצעת…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"העברת מסך"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"מעביר"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"מכשיר ללא שם"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"מוכן להעביר"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 8a642a1..c871d1c 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi: ON"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fiネットワークを利用できません"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ON にしています…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"画面のキャスト"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"キャストしています"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"名前のないデバイス"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"キャスト準備完了"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 358d148..cd4b9df 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ჩართულია"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ქსელები მიუწვდომელია"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ირთვება…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ეკრანის გადაცემა"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"გადაიცემა"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"უსახელო მოწყობილობა"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"მზად არის სამაუწყებლოდ"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b029d7c..34eb108 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi қосулы"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Қолжетімді Wi-Fi желілері жоқ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Қосылуда…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Экранды трансляциялау"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляциялануда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Атаусыз құрылғы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Трансляциялауға дайын"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 079004f..f077c77 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi បានបើក"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"គ្មានបណ្តាញ Wi-Fi ទេ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"កំពុងបើក..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ការថតវីដេអូនៅលើអេក្រង់"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ការចាត់ថ្នាក់"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ឧបករណ៍ដែលមិនមានឈ្មោះ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ត្រៀមរួចរាល់ដើម្បីចាត់ថ្នាក់"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index aa60553..8904b9e 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ಯಾವುದೇ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ಸ್ಕ್ರೀನ್ ಕ್ಯಾಸ್ಟ್"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ಬಿತ್ತರಿಸಲು ಸಿದ್ದವಾಗಿದೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 73df554..55d77d1 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 사용"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"사용 가능한 Wi-Fi 네트워크 없음"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"켜는 중..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"화면 전송"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"전송 중"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"이름이 없는 기기"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"전송 준비 완료"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 331ca48..7e7af37 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi күйүк"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Бир дагы жеткиликтүү Wi-Fi тармагы жок"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Күйгүзүлүүдө…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Тышкы экранга чыгаруу"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Тышкы экранга чыгарылууда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Аты жок түзмөк"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Тышкы экранга чыгарууга даяр"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 6d5134b..c28d73b 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ເປີດ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ບໍ່ມີເຄືອຂ່າຍ Wi-Fi ຢູ່"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ກຳລັງເປີດ..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ການສົ່ງສັນຍານໜ້າຈໍ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ກຳລັງສົ່ງສັນຍານ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ອຸປະກອນບໍ່ມີຊື່"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ພ້ອມສົ່ງສັນຍານແລ້ວ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 2b4b5ff..df4017d 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"„Wi-Fi“ įjungtas"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nėra jokių pasiekiamų „Wi-Fi“ tinklų"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Įjungiama…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekrano perdavimas"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Perduodama"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Įrenginys be pavadinimo"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Paruošta perduoti"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 54d9ad2..3a00dd6 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi savienojums ieslēgts"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nav pieejams neviens Wi-Fi tīkls."</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Notiek ieslēgšana…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekrāna apraide"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Notiek apraide…"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nenosaukta ierīce"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gatavs apraidei"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 292c18e..eff3492 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Вклучено е Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Нема достапни Wi-Fi мрежи"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Се вклучува…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Емитување на екранот"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Емитување"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименуван уред"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Подготвено за емитување"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index ca979e5..c640426 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ഓണാക്കുന്നു…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"സ്ക്രീൻ കാസ്റ്റ്"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"കാസ്റ്റുചെയ്യുന്നു"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാത്ത ഉപകരണം"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"കാസ്റ്റ് ചെയ്യാൻ തയ്യാറാണ്"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 9812f4c..e73428e 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi асаалттай"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi сүлжээ байхгүй байна"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Асааж байна…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Дэлгэцийг дамжуулах"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Дамжуулж байна"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Нэргүй төхөөрөмж"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Дамжуулахад бэлэн"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 3af0b4f..7e58a39 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाय-फाय चालू"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"वाय-फाय नेटवर्क उपलब्ध नाहीत"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"सुरू करत आहे…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"स्क्रीन कास्ट करा"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"निनावी डिव्हाइस"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"कास्ट करण्यास तयार"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 9690913..63f2e76 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Dihidupkan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tiada rangkaian Wi-Fi tersedia"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Menghidupkan…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Penghantaran Skrin"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Menghantar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Peranti tidak bernama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Bersedia untuk menghantar"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 17dc52f..b167375 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ဖွင့်နေသည်…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"မျက်နှာပြင် ကာ့စ်လုပ်ခြင်း"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 8a175b2..bb86aab 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Slår på …"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Skjermcasting"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klar til å caste"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 60279a9..7db0aa3 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi सक्रिय छ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi नेटवर्क अनुपलब्ध"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"सक्रिय गर्दै…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"स्क्रिन Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"प्रसारण गर्दै"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"बेनाम उपकरण"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"प्रसारण गर्न तयार"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index e501a09..fe0ee74 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen wifi-netwerken beschikbaar"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Inschakelen..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screencast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casten"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Naamloos apparaat"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klaar om te casten"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 20e0e7b..03d4413 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ୱାଇ-ଫାଇ ଅନ୍ ଅଛି"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ଅନ୍ ହେଉଛି…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ସ୍କ୍ରିନ୍ କାଷ୍ଟ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ନାମହୀନ ଡିଭାଇସ୍"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"କାଷ୍ଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ"</string>
@@ -438,10 +437,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ଅଛି"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅଫ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
- <skip />
- <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
- <skip />
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"ବିଜ୍ଞପ୍ତି, ପାସ୍ୱର୍ଡ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ପେମେଣ୍ଟ ସୂଚନା ସହ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ରେ ସବୁକିଛି କ୍ୟାପ୍ଚର୍ କରିବା <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଆରମ୍ଭ କରିବ।"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ କାଷ୍ଟ ବା ରେକର୍ଡ କରିବାକୁ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଅନୁୁୁମତି ଦେବେ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ପରିଚାଳନା କରନ୍ତୁ"</string>
@@ -819,8 +816,7 @@
<string name="high_temp_notif_message" msgid="5642466103153429279">"ଫୋନ୍ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର୍ ସୀମିତ ଭାବେ କାମ କରିଥାଏ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ଆପଣଙ୍କ ଫୋନ୍ ସ୍ୱଚାଳିତ ଭାବେ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ତଥାପି ନିଜ ଫୋନ୍ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ୍ ଥଣ୍ଡା ହୋଇଯିବାପରେ, ଏହା ସାମାନ୍ୟ ଭାବେ ଚାଲିବ।"</string>
<string name="high_temp_alarm_title" msgid="442812040762745210">"ଚାର୍ଜର୍ ଅନ୍ପ୍ଲଗ୍ କରନ୍ତୁ"</string>
- <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
- <skip />
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ଏହି ଡିଭାଇସ୍ ଚାର୍ଜ କରିବାରେ ଗୋଟିଏ ସମସ୍ୟା ଅଛି। ଯେହେତୁ କେବଳ ଗରମ ହୋଇଯାଇପାରେ, ତେଣୁ ପାୱାର୍ ଆଡପ୍ଟର୍ ଅନ୍ପ୍ଲଗ୍ କରନ୍ତୁ ଏବଂ ଯତ୍ନ ନିଅନ୍ତୁ।"</string>
<string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ସେବା ସମ୍ବନ୍ଧିତ ଷ୍ଟେପ୍ଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ବାମ ଶର୍ଟକଟ୍"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ଡାହାଣ ଶର୍ଟକଟ୍"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 9ac544a..acd9bd2 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ਵਾਈ-ਫਾਈ ਚਾਲੂ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"ਸਕ੍ਰੀਨ ਕਾਸਟ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਾ ਡੀਵਾਈਸ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ਜੋੜਨ ਲਈ ਤਿਆਰ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 409d2ce..d00d349 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi wł."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Brak dostępnych sieci Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Włączam…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Przesyłanie ekranu"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Przesyłam"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Urządzenie bez nazwy"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gotowy do działania"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 559f50c..23682b6 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ativando…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmissão de tela"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 87d16db..b5c2343 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ligado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Não estão disponíveis redes Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"A ativar..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmissão do ecrã"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmissão"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 559f50c..23682b6 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ativando…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmissão de tela"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index d2a3fe7..259f1db 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Se activează..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Proiectarea ecranului"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Se proiectează"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispozitiv nedenumit"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pregătit pentru proiecție"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8799891..a3d6680 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi включен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Не удалось найти доступные сети Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Включение…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Трансляция экрана"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Передача изображения"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Безымянное устройство"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово к передаче"</string>
@@ -444,7 +443,7 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Режим энергосбережения включен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Откл. фоновой передачи данных"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Отключить режим энергосбережения"</string>
- <string name="media_projection_dialog_text" msgid="1443042478990422751">"Приложение \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" будет транслировать всю информацию на экране, в том числе уведомления, пароли, фотографии, сообщения и платежные данные."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Приложение \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" будет записывать всю информацию на экране, в том числе уведомления, пароли, фотографии, сообщения и платежные данные."</string>
<string name="media_projection_dialog_title" msgid="7574971526813630219">"Разрешить приложению \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" записывать или транслировать экран устройства?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Больше не показывать"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Очистить все"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 3302e7a..e7febac 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ක්රියාත්මකයි"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ජාල ලබා ගත නොහැකිය"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ක්රියාත්මක කරමින්…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"තිර විකාශය"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"කාස්ට් කිරීම"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"නම් නොකළ උපාංගය"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"කාස්ට් කිරීමට සුදානම්"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 6a22346..c1b80b1 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi‑Fi je zapnuté"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi‑Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Zapína sa…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Prenos obrazovky"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prenáša sa"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepomenované zariadenie"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pripravené na prenášanie"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 50fe72d..9992c82 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je vklopljen."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Na voljo ni nobeno omrežje Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Vklapljanje …"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Predvajanje zaslona"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Predvajanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovana naprava"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pripravljeno za predvajanje"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index eafcc33..49c55d1 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi i aktivizuar"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nuk ka rrjete Wi-Fi të disponueshme"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Po aktivizohet…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Transmetimi i ekranit"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Po transmeton"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Pajisje e paemërtuar"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gati për transmetim"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 81c7b2e..8dec319 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -326,8 +326,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi је укључен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Није доступна ниједна Wi-Fi мрежа"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Укључује се..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Пребацивање екрана"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Пребацивање"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименовани уређај"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Спремно за пребацивање"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 317cc8c..106298a2 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi är aktiverat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Det finns inga tillgängliga Wi-Fi-nätverk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiverar …"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Casta skärmen"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Castar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Namnlös enhet"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Redo att casta"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 1b57252..1df75f6 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Imewasha Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hakuna mitandao ya Wi-Fi inayopatikana"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Inawasha..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Kutuma kwenye Skrini"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Inatuma"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Kifaa hakina jina"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tayari kutuma"</string>
diff --git a/packages/SystemUI/res/values-land/integers.xml b/packages/SystemUI/res/values-sw392dp-land/dimens.xml
similarity index 63%
rename from packages/SystemUI/res/values-land/integers.xml
rename to packages/SystemUI/res/values-sw392dp-land/dimens.xml
index fb22665..c718614 100644
--- a/packages/SystemUI/res/values-land/integers.xml
+++ b/packages/SystemUI/res/values-sw392dp-land/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2018 The Android Open Source Project
+ ~ Copyright (C) 2019 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.
@@ -15,8 +15,13 @@
~ limitations under the License
-->
<resources>
- <!-- Action footer width is set to 0 to allow it to stretch (through a weight of 1) and center
- the page indicator in between the footer and the carrier text.-->
- <integer name="qs_footer_actions_width">0</integer>
- <integer name="qs_footer_actions_weight">1</integer>
-</resources>
\ No newline at end of file
+
+ <!-- Global actions grid -->
+ <dimen name="global_actions_grid_vertical_padding">3dp</dimen>
+ <dimen name="global_actions_grid_horizontal_padding">0dp</dimen>
+
+ <dimen name="global_actions_grid_item_side_margin">6dp</dimen>
+ <dimen name="global_actions_grid_item_vertical_margin">10dp</dimen>
+
+</resources>
+
diff --git a/packages/SystemUI/res/values-sw392dp/dimens.xml b/packages/SystemUI/res/values-sw392dp/dimens.xml
new file mode 100644
index 0000000..6fa6692
--- /dev/null
+++ b/packages/SystemUI/res/values-sw392dp/dimens.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 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>
+ <!-- Global actions grid -->
+ <dimen name="global_actions_grid_container_bottom_margin">4dp</dimen>
+
+ <dimen name="global_actions_grid_vertical_padding">0dp</dimen>
+ <dimen name="global_actions_grid_horizontal_padding">3dp</dimen>
+
+ <dimen name="global_actions_grid_item_side_margin">10dp</dimen>
+ <dimen name="global_actions_grid_item_vertical_margin">6dp</dimen>
+ <dimen name="global_actions_grid_item_width">72dp</dimen>
+ <dimen name="global_actions_grid_item_height">72dp</dimen>
+
+ <dimen name="global_actions_grid_item_icon_width">22dp</dimen>
+ <dimen name="global_actions_grid_item_icon_height">22dp</dimen>
+ <dimen name="global_actions_grid_item_icon_top_margin">12dp</dimen>
+ <dimen name="global_actions_grid_item_icon_side_margin">22dp</dimen>
+ <dimen name="global_actions_grid_item_icon_bottom_margin">4dp</dimen>
+
+</resources>
+
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index adff726..e5fd953 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ஆன் செய்கிறது…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"திரை அலைபரப்பல்"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"திரையிடத் தயார்"</string>
@@ -399,7 +398,7 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"அறிவிப்புகள்\nவேண்டாம்"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"முன்னுரிமைகள்\nமட்டும்"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"அலாரங்கள்\nமட்டும்"</string>
- <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது (முழு சார்ஜ் ஆக <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ஆகும்)"</string>
+ <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வயர்லெஸ் முறையில் சார்ஜாகிறது (முடிய <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ஆகும்)"</string>
<string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
<string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • வேகமாகச் சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
<string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • மெதுவாகச் சார்ஜாகிறது (முழு சார்ஜ்: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string>
@@ -438,10 +437,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"செயல்திறனையும் பின்புல டேட்டா உபயோகத்தையும் குறைக்கிறது"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"பேட்டரி சேமிப்பானை ஆஃப் செய்"</string>
- <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
- <skip />
- <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
- <skip />
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"உங்கள் திரையில் தோன்றும் அறிவிப்புகள், கடவுச்சொற்கள், படங்கள், மெசேஜ்கள் மற்றும் கட்டணத் தகவல் போன்ற அனைத்தையும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> காட்டத் தொடங்கும்."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> உங்கள் திரையை ரெக்கார்டு செய்யவோ அலைபரப்பவோ அனுமதிக்கவா?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"மீண்டும் காட்டாதே"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"எல்லாவற்றையும் அழி"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"அறிவிப்புகளை நிர்வகி"</string>
@@ -819,8 +816,7 @@
<string name="high_temp_notif_message" msgid="5642466103153429279">"மொபைலின் வெப்ப அளவு குறையும் போது, சில அம்சங்களைப் பயன்படுத்த முடியாது"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"உங்கள் மொபைலின் வெப்ப அளவு தானாகவே குறையும். தொடர்ந்து நீங்கள் மொபைலைப் பயன்படுத்தலாம், ஆனால் அதன் வேகம் குறைவாக இருக்கக்கூடும்.\n\nமொபைலின் வெப்ப அளவு குறைந்தவுடன், அது இயல்பு நிலையில் இயங்கும்."</string>
<string name="high_temp_alarm_title" msgid="442812040762745210">"சார்ஜரைத் துண்டிக்கவும்"</string>
- <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
- <skip />
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"இந்தச் சாதனத்தைச் சார்ஜ் செய்வதில் சிக்கல் உள்ளது. பவர் அடாப்டரைத் துண்டிக்கவும், கேபிள் சூடாக இருக்கக்கூடும் என்பதால் கவனமாகக் கையாளவும்."</string>
<string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"இடப்புற ஷார்ட்கட்"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"வலப்புற ஷார்ட்கட்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index de7f48c..86f3a87 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ఆన్లో ఉంది"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi నెట్వర్క్లు ఏవీ అందుబాటులో లేవు"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ఆన్ చేస్తోంది…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"స్క్రీన్ ప్రసారం"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ప్రసారం చేస్తోంది"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"పేరులేని పరికరం"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ప్రసారం చేయడానికి సిద్ధంగా ఉంది"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index cc708e6..331945a 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi เปิดอยู่"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ไม่มีเครือข่าย Wi-Fi พร้อมใช้งาน"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"กำลังเปิด..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"การแคสต์หน้าจอ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"กำลังส่ง"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"อุปกรณ์ที่ไม่มีชื่อ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"พร้อมที่จะส่ง"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index bd814c7..394aaaa 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Naka-on Ang Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Walang available na mga Wi-Fi network"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ino-on…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Screen Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Nagka-cast"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Walang pangalang device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Handang mag-cast"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 7253131..8cab568 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kablosuz Bağlantı Açık"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Kullanılabilir kablosuz ağ yok"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Açılıyor…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekran Yayını"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayınlanıyor"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Yayın için hazır"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 213decb..47a6046 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -327,8 +327,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi увімкнено"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Немає доступних мереж Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Увімкнення…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Трансляція екрана"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово до трансляції"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index f6d5888..9a7cd14 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi آن ہے"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"کوئی WI-FI نیٹ ورک دستیاب نہیں"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"آن ہو رہا ہے…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"اسکرین کاسٹ کریں"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"کاسٹنگ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"بغیر نام والا آلہ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"کاسٹ کرنے کیلئے تیار"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 39d9acd..a1dd2e1 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi yoqilgan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hech qanday Wi-Fi tarmog‘i mavjud emas"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Yoqilmoqda…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Ekran translatsiyasi"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Translatsiya qilinmoqda"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nomsiz qurilma"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tarqatish uchun tayyor"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index d36ba30..67970eb 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi đang bật"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Không có mạng Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Đang bật…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Truyền màn hình"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Đang truyền"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Thiết bị không có tên"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Sẵn sàng truyền"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index d645d47..30af99a 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN 已开启"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"没有 WLAN 网络"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"正在开启…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"屏幕投射"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"正在投射"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名设备"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"已准备好投射"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index ad6000b..04e7eca 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 已開啟"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有可用的 Wi-Fi 網絡"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"正在開啟…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"螢幕投放"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"正在放送"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"放送準備完成"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index edb3f62..86b0eea 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"已開啟 Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有 Wi-Fi 網路"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"開啟中…"</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"螢幕投放"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"可以開始投放了"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index e92d6ab..612b61e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -325,8 +325,7 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"I-Wi-Fi ivuliwe"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Awekho amanethiwekhi we-Wi-Fi atholakalayo"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Iyavula..."</string>
- <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
- <skip />
+ <string name="quick_settings_cast_title" msgid="6954684227605751758">"Linganisa isikrini"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Ukusakaza"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Idivayisi engenalo igama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ilungele ukusakaza"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 8835503..33e1974 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -329,7 +329,7 @@
<!-- Nav bar button default ordering/layout -->
<string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string>
<string name="config_navBarLayoutQuickstep" translatable="false">back[1.7WC];home;contextual[1.7WC]</string>
- <string name="config_navBarLayoutHandle" translatable="false">";home_handle;"</string>
+ <string name="config_navBarLayoutHandle" translatable="false">";home_handle;assistant_handle[.18WC]"</string>
<bool name="quick_settings_show_full_alarm">false</bool>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index a40a14a..4457440 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -34,9 +34,11 @@
<dimen name="navigation_bar_deadzone_size_max">32dp</dimen>
<!-- dimensions for the navigation bar handle -->
- <dimen name="navigation_handle_width">180dp</dimen>
<dimen name="navigation_handle_radius">2dp</dimen>
<dimen name="navigation_handle_bottom">8dp</dimen>
+ <dimen name="navigation_handle_horizontal_margin">30dp</dimen>
+ <dimen name="navigation_home_handle_width">180dp</dimen>
+ <dimen name="navigation_assistant_handle_width">36dp</dimen>
<!-- Height of notification icons in the status bar -->
<dimen name="status_bar_icon_size">@*android:dimen/status_bar_icon_size</dimen>
@@ -274,7 +276,16 @@
<!-- The height of the quick settings footer that holds the user switcher, settings icon,
etc. -->
- <dimen name="qs_footer_height">56dp</dimen>
+ <dimen name="qs_footer_height">48dp</dimen>
+
+ <!-- The size of each of the icon buttons in the QS footer -->
+ <dimen name="qs_footer_action_button_size">@dimen/qs_footer_height</dimen>
+
+ <!-- Margins on each side of QS Footer -->
+ <dimen name="qs_footer_margin">2dp</dimen>
+
+ <!-- Padding on each QS Footer Icon to make the icons 20dpx20dp -->
+ <dimen name="qs_footer_icon_padding">14dp</dimen>
<!-- The padding between the notifications and the quick settings container -->
<dimen name="qs_notification_padding">@dimen/notification_side_paddings</dimen>
@@ -415,11 +426,16 @@
<dimen name="qs_detail_item_icon_marginEnd">20dp</dimen>
<dimen name="qs_header_tooltip_height">18dp</dimen>
<dimen name="qs_header_alarm_icon_size">18dp</dimen>
+ <dimen name="qs_header_mobile_icon_size">18dp</dimen>
<dimen name="qs_header_alarm_text_margin_start">6dp</dimen>
+ <dimen name="qs_header_separator_width">8dp</dimen>
+ <dimen name="qs_header_carrier_separator_width">6dp</dimen>
+ <dimen name="qs_status_separator">32dp</dimen>
+ <dimen name="qs_carrier_margin_width">4dp</dimen>
<dimen name="qs_footer_padding_start">16dp</dimen>
<dimen name="qs_footer_padding_end">16dp</dimen>
<dimen name="qs_footer_icon_size">16dp</dimen>
- <dimen name="qs_paged_tile_layout_padding_bottom">24dp</dimen>
+ <dimen name="qs_paged_tile_layout_padding_bottom">16dp</dimen>
<dimen name="qs_notif_collapsed_space">64dp</dimen>
@@ -592,7 +608,7 @@
<dimen name="multi_user_avatar_keyguard_size">22dp</dimen>
<!-- The width of user avatar when expanded -->
- <dimen name="multi_user_avatar_expanded_size">18dp</dimen>
+ <dimen name="multi_user_avatar_expanded_size">20dp</dimen>
<!-- The font size of the time when collapsed in QS -->
<dimen name="qs_time_collapsed_size">14sp</dimen>
diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml
index e8fabf5..a6dae45 100644
--- a/packages/SystemUI/res/values/integers.xml
+++ b/packages/SystemUI/res/values/integers.xml
@@ -19,8 +19,8 @@
<!-- Action footer width used for layout_width to indicate WRAP_CONTENT (along with a weight of
0) as we can allow the carrier text to stretch as far as needed in the QS footer. -->
- <integer name="qs_footer_actions_width">-2</integer>
- <integer name="qs_footer_actions_weight">0</integer>
+ <integer name="qs_footer_actions_width">0</integer>
+ <integer name="qs_footer_actions_weight">1</integer>
<!-- Maximum number of bubbles to render and animate at one time. While the animations used are
lightweight translation animations, this number can be reduced on lower end devices if any
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index fc7a56f..b985b6b 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -227,6 +227,8 @@
<item name="android:textSize">@dimen/qs_carrier_info_text_size</item>
</style>
+ <style name="TextAppearance.QS.Status" parent="TextAppearance.QS.TileLabel.Secondary" />
+
<style name="TextAppearance.AppOpsDialog" />
<style name="TextAppearance.AppOpsDialog.Title">
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
index 37abab9..ce615b6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
@@ -113,4 +113,10 @@
* Sent when there was an action on one of the onboarding tips view.
*/
void onTip(int actionType, int viewType) = 10;
+
+ /**
+ * Sent when device assistant changes its default assistant whether it is available or not.
+ */
+ void onAssistantAvailable(boolean available) = 13;
+
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
index 69f86c7..387f265 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java
@@ -51,7 +51,7 @@
/**
* Small clock shown on lock screen above stack scroller.
*/
- private View mLockClockContainer;
+ private TypographicClock mLockClock;
/**
* Controller for transition into dark state.
@@ -69,13 +69,15 @@
}
private void createViews() {
- mView = mLayoutInflater.inflate(R.layout.type_clock, null);
+ mView = mLayoutInflater.inflate(R.layout.type_aod_clock, null);
mTypeClock = mView.findViewById(R.id.type_clock);
// For now, this view is used to hide the default digital clock.
// Need better transition to lock screen.
- mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null);
- mLockClockContainer.setVisibility(View.GONE);
+ mLockClock = (TypographicClock) mLayoutInflater.inflate(R.layout.typographic_clock, null);
+ mLockClock.setVisibility(View.GONE);
+
+ mDarkController = new CrossFadeDarkController(mView, mLockClock);
}
@Override
@@ -95,10 +97,10 @@
@Override
public View getView() {
- if (mLockClockContainer == null) {
+ if (mLockClock == null) {
createViews();
}
- return mLockClockContainer;
+ return mLockClock;
}
@Override
@@ -115,6 +117,7 @@
@Override
public void setTextColor(int color) {
mTypeClock.setTextColor(color);
+ mLockClock.setTextColor(color);
}
@Override
@@ -122,21 +125,28 @@
if (colorPalette == null || colorPalette.length == 0) {
return;
}
- final int length = colorPalette.length;
- mTypeClock.setClockColor(colorPalette[Math.max(0, length - 5)]);
+ final int color = colorPalette[Math.max(0, colorPalette.length - 5)];
+ mTypeClock.setClockColor(color);
+ mLockClock.setClockColor(color);
}
@Override
public void onTimeTick() {
mTypeClock.onTimeChanged();
+ mLockClock.onTimeChanged();
}
@Override
- public void setDarkAmount(float darkAmount) {}
+ public void setDarkAmount(float darkAmount) {
+ if (mDarkController != null) {
+ mDarkController.setDarkAmount(darkAmount);
+ }
+ }
@Override
public void onTimeZoneChanged(TimeZone timeZone) {
mTypeClock.onTimeZoneChanged(timeZone);
+ mLockClock.onTimeZoneChanged(timeZone);
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java
index 7bce3c5..572ab30 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/TypographicClock.java
@@ -119,4 +119,12 @@
mTime.setTimeZone(mTimeZone != null ? mTimeZone : TimeZone.getDefault());
onTimeChanged();
}
+
+ /**
+ * Overriding hasOverlappingRendering as false to improve performance of crossfading.
+ */
+ @Override
+ public boolean hasOverlappingRendering() {
+ return false;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 83398cf..ff68d2b 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -315,8 +315,13 @@
}
@Nullable
+ public ComponentName getAssistInfoForUser(int userId) {
+ return mAssistUtils.getAssistComponentForUser(userId);
+ }
+
+ @Nullable
private ComponentName getAssistInfo() {
- return mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser());
+ return getAssistInfoForUser(KeyguardUpdateMonitor.getCurrentUser());
}
public void showDisclosure() {
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
index 4addbb5..25ee87a 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
@@ -528,7 +528,9 @@
/**
* Removes and releases an ActivityView if one was previously created for this bubble.
*/
- public void destroyActivityView() {
+ public void cleanUpExpandedState() {
+ removeView(mNotifRow);
+
if (mActivityView == null) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index 8f9f1cb..97aa786 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -385,7 +385,7 @@
// Remove it from the views
int removedIndex = mBubbleContainer.indexOfChild(b.iconView);
- b.expandedView.destroyActivityView();
+ b.expandedView.cleanUpExpandedState();
mBubbleContainer.removeView(b.iconView);
int bubbleCount = mBubbleContainer.getChildCount();
@@ -414,7 +414,7 @@
public void stackDismissed() {
for (Bubble bubble : mBubbleData.getBubbles()) {
bubble.entry.setBubbleDismissed(true);
- bubble.expandedView.destroyActivityView();
+ bubble.expandedView.cleanUpExpandedState();
}
mBubbleData.clear();
collapseStack();
@@ -495,7 +495,7 @@
}
/**
- * Expands the stack fo bubbles.
+ * Expands the stack of bubbles.
* <p>
* Must be called from the main thread.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
index c6b5377..6c106df 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java
@@ -40,8 +40,6 @@
public class ListGridLayout extends LinearLayout {
private static final String TAG = "ListGridLayout";
private int mExpectedCount;
- private int mRows;
- private int mColumns;
public ListGridLayout(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -63,7 +61,7 @@
* Get the parent view associated with the item which should be placed at the given position.
*/
public ViewGroup getParentView(int index, boolean reverseSublists, boolean swapRowsAndColumns) {
- if (mRows == 0) {
+ if (getRowCount() == 0) {
return null;
}
int column = getParentViewIndex(index, reverseSublists, swapRowsAndColumns);
@@ -77,10 +75,11 @@
private int getParentViewIndex(int index, boolean reverseSublists, boolean swapRowsAndColumns) {
int sublistIndex;
ViewGroup row;
+ int rows = getRowCount();
if (swapRowsAndColumns) {
- sublistIndex = (int) Math.floor(index / mRows);
+ sublistIndex = (int) Math.floor(index / rows);
} else {
- sublistIndex = index % mRows;
+ sublistIndex = index % rows;
}
if (reverseSublists) {
sublistIndex = reverseSublistIndex(sublistIndex);
@@ -93,11 +92,9 @@
*/
public void setExpectedCount(int count) {
mExpectedCount = count;
- mRows = getRowCount();
- mColumns = getColumnCount();
for (int i = 0; i < getChildCount(); i++) {
- if (i <= mColumns) {
+ if (i <= getColumnCount()) {
setSublistVisibility(i, true);
} else {
setSublistVisibility(i, false);
@@ -113,10 +110,18 @@
}
private int getRowCount() {
+ // special case for 3 to use a single row
+ if (mExpectedCount == 3) {
+ return 1;
+ }
return (int) Math.ceil(Math.sqrt(mExpectedCount));
}
private int getColumnCount() {
+ // special case for 3 to use a single row
+ if (mExpectedCount == 3) {
+ return 3;
+ }
return (int) Math.round(Math.sqrt(mExpectedCount));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index f607367..aa972e3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -261,11 +261,9 @@
// Fade in the tiles/labels as we reach the final position.
mFirstPageDelayedAnimator = new TouchAnimator.Builder()
.setStartDelay(EXPANDED_TILE_DELAY)
- .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(tileLayout, "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.addFloat(mQsPanel.getFooter().getView(), "alpha", 0, 1).build();
- mAllViews.add(mQsPanel.getPageIndicator());
mAllViews.add(mQsPanel.getDivider());
mAllViews.add(mQsPanel.getFooter().getView());
float px = 0;
@@ -283,7 +281,6 @@
}
mNonfirstPageAnimator = new TouchAnimator.Builder()
.addFloat(mQuickQsPanel, "alpha", 1, 0)
- .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.setListener(mNonFirstPageListener)
.setEndDelay(.5f)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java
new file mode 100644
index 0000000..3ff30c5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2019 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.qs;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.settingslib.Utils;
+import com.android.settingslib.graph.SignalDrawable;
+import com.android.systemui.R;
+
+public class QSCarrier extends LinearLayout {
+
+ private View mMobileGroup;
+ private QSCarrierText mCarrierText;
+ private ImageView mMobileSignal;
+ private ImageView mMobileRoaming;
+ private ColorStateList mColorForegroundStateList;
+ private float mColorForegroundIntensity;
+
+ public QSCarrier(Context context) {
+ super(context);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public QSCarrier(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mMobileGroup = findViewById(R.id.mobile_combo);
+ mMobileSignal = findViewById(R.id.mobile_signal);
+ mMobileRoaming = findViewById(R.id.mobile_roaming);
+ mCarrierText = findViewById(R.id.qs_carrier_text);
+
+ int colorForeground = Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorForeground);
+ mColorForegroundStateList = ColorStateList.valueOf(colorForeground);
+ mColorForegroundIntensity = QuickStatusBarHeader.getColorIntensity(colorForeground);
+
+ }
+
+ public void updateState(QSCarrierGroup.CellSignalState state) {
+ mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE);
+ if (state.visible) {
+ mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
+ mMobileRoaming.setImageTintList(mColorForegroundStateList);
+ SignalDrawable d = new SignalDrawable(mContext);
+ d.setDarkIntensity(mColorForegroundIntensity);
+ mMobileSignal.setImageDrawable(d);
+ mMobileSignal.setImageLevel(state.mobileSignalIconId);
+
+ StringBuilder contentDescription = new StringBuilder();
+ if (state.contentDescription != null) {
+ contentDescription.append(state.contentDescription).append(", ");
+ }
+ if (state.roaming) {
+ contentDescription
+ .append(mContext.getString(R.string.data_connection_roaming))
+ .append(", ");
+ }
+ // TODO: show mobile data off/no internet text for 5 seconds before carrier text
+ if (TextUtils.equals(state.typeContentDescription,
+ mContext.getString(R.string.data_connection_no_internet))
+ || TextUtils.equals(state.typeContentDescription,
+ mContext.getString(R.string.cell_data_off_content_description))) {
+ contentDescription.append(state.typeContentDescription);
+ }
+ mMobileSignal.setContentDescription(contentDescription);
+ }
+ }
+
+ public void setCarrierText(CharSequence text) {
+ mCarrierText.setText(text);
+ }
+
+ /**
+ * TextView that changes its ellipsize value with its visibility.
+ */
+ public static class QSCarrierText extends TextView {
+
+ public QSCarrierText(Context context) {
+ super(context);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ // Only show marquee when visible
+ if (visibility == VISIBLE) {
+ setEllipsize(TextUtils.TruncateAt.MARQUEE);
+ setSelected(true);
+ } else {
+ setEllipsize(TextUtils.TruncateAt.END);
+ setSelected(false);
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java
new file mode 100644
index 0000000..0eeaa9b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2019 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.qs;
+
+import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
+
+import android.content.Context;
+import android.telephony.SubscriptionManager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.keyguard.CarrierTextController;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+/**
+ * Displays Carrier name and network status in QS
+ */
+public class QSCarrierGroup extends LinearLayout implements
+ CarrierTextController.CarrierTextCallback,
+ NetworkController.SignalCallback {
+
+ private static final String TAG = "QSCarrierGroup";
+ /**
+ * Support up to 3 slots which is what's supported by {@link TelephonyManager#getPhoneCount}
+ */
+ private static final int SIM_SLOTS = 3;
+ private final NetworkController mNetworkController;
+
+ private View[] mCarrierDividers = new View[SIM_SLOTS - 1];
+ private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS];
+ private final CellSignalState[] mInfos = new CellSignalState[SIM_SLOTS];
+ private CarrierTextController mCarrierTextController;
+
+ private boolean mListening;
+
+ @Inject
+ public QSCarrierGroup(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
+ NetworkController networkController) {
+ super(context, attrs);
+ mNetworkController = networkController;
+ }
+
+ @VisibleForTesting
+ public QSCarrierGroup(Context context, AttributeSet attrs) {
+ this(context, attrs,
+ Dependency.get(NetworkController.class));
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ mCarrierGroups[0] = findViewById(R.id.carrier1);
+ mCarrierGroups[1] = findViewById(R.id.carrier2);
+ mCarrierGroups[2] = findViewById(R.id.carrier3);
+
+ mCarrierDividers[0] = findViewById(R.id.qs_carrier_divider1);
+ mCarrierDividers[1] = findViewById(R.id.qs_carrier_divider2);
+
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mInfos[i] = new CellSignalState();
+ }
+
+ CharSequence separator = mContext.getString(
+ com.android.internal.R.string.kg_text_message_separator);
+ mCarrierTextController = new CarrierTextController(mContext, separator, false, false);
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+
+ public void setListening(boolean listening) {
+ if (listening == mListening) {
+ return;
+ }
+ mListening = listening;
+ updateListeners();
+ }
+
+ @Override
+ @VisibleForTesting
+ public void onDetachedFromWindow() {
+ setListening(false);
+ super.onDetachedFromWindow();
+ }
+
+ private void updateListeners() {
+ if (mListening) {
+ if (mNetworkController.hasVoiceCallingFeature()) {
+ mNetworkController.addCallback(this);
+ }
+ mCarrierTextController.setListening(this);
+ } else {
+ mNetworkController.removeCallback(this);
+ mCarrierTextController.setListening(null);
+ }
+ }
+
+ private void handleUpdateState() {
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mCarrierGroups[i].updateState(mInfos[i]);
+ }
+
+ mCarrierDividers[0].setVisibility(
+ mInfos[0].visible && mInfos[1].visible ? View.VISIBLE : View.GONE);
+ // This tackles the case of slots 2 being available as well as at least one other.
+ // In that case we show the second divider. Note that if both dividers are visible, it means
+ // all three slots are in use, and that is correct.
+ mCarrierDividers[1].setVisibility(
+ (mInfos[1].visible && mInfos[2].visible)
+ || (mInfos[0].visible && mInfos[2].visible) ? View.VISIBLE : View.GONE);
+ }
+
+ @VisibleForTesting
+ protected int getSlotIndex(int subscriptionId) {
+ return SubscriptionManager.getSlotIndex(subscriptionId);
+ }
+
+ @Override
+ public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
+ if (info.anySimReady) {
+ boolean[] slotSeen = new boolean[SIM_SLOTS];
+ if (info.listOfCarriers.length == info.subscriptionIds.length) {
+ for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
+ int slot = getSlotIndex(info.subscriptionIds[i]);
+ if (slot >= SIM_SLOTS) {
+ Log.w(TAG, "updateInfoCarrier - slot: " + slot);
+ continue;
+ }
+ if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+ Log.e(TAG,
+ "Invalid SIM slot index for subscription: "
+ + info.subscriptionIds[i]);
+ continue;
+ }
+ mInfos[slot].visible = true;
+ slotSeen[slot] = true;
+ mCarrierGroups[slot].setCarrierText(info.listOfCarriers[i].toString().trim());
+ mCarrierGroups[slot].setVisibility(View.VISIBLE);
+ }
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ if (!slotSeen[i]) {
+ mInfos[i].visible = false;
+ mCarrierGroups[i].setVisibility(View.GONE);
+ }
+ }
+ } else {
+ Log.e(TAG, "Carrier information arrays not of same length");
+ }
+ } else {
+ mInfos[0].visible = false;
+ mCarrierGroups[0].setCarrierText(info.carrierText);
+ mCarrierGroups[0].setVisibility(View.VISIBLE);
+ for (int i = 1; i < SIM_SLOTS; i++) {
+ mInfos[i].visible = false;
+ mCarrierGroups[i].setCarrierText("");
+ mCarrierGroups[i].setVisibility(View.GONE);
+ }
+ }
+ handleUpdateState();
+ }
+
+ @Override
+ public void setMobileDataIndicators(NetworkController.IconState statusIcon,
+ NetworkController.IconState qsIcon, int statusType,
+ int qsType, boolean activityIn, boolean activityOut,
+ String typeContentDescription,
+ String description, boolean isWide, int subId, boolean roaming) {
+ int slotIndex = getSlotIndex(subId);
+ if (slotIndex >= SIM_SLOTS) {
+ Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
+ return;
+ }
+ if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+ Log.e(TAG, "Invalid SIM slot index for subscription: " + subId);
+ return;
+ }
+ mInfos[slotIndex].visible = statusIcon.visible;
+ mInfos[slotIndex].mobileSignalIconId = statusIcon.icon;
+ mInfos[slotIndex].contentDescription = statusIcon.contentDescription;
+ mInfos[slotIndex].typeContentDescription = typeContentDescription;
+ mInfos[slotIndex].roaming = roaming;
+ handleUpdateState();
+ }
+
+ @Override
+ public void setNoSims(boolean hasNoSims, boolean simDetected) {
+ if (hasNoSims) {
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ mInfos[i].visible = false;
+ }
+ }
+ handleUpdateState();
+ }
+
+ static final class CellSignalState {
+ boolean visible;
+ int mobileSignalIconId;
+ String contentDescription;
+ String typeContentDescription;
+ boolean roaming;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index bbd8de3..0ae8f6c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -23,24 +23,24 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
-import android.content.res.ColorStateList;
import android.content.res.Configuration;
+import android.database.ContentObserver;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
import android.os.UserManager;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
+import android.provider.Settings;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -49,11 +49,10 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
-import com.android.keyguard.CarrierTextController;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils;
+import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.drawable.UserIconDrawable;
-import com.android.settingslib.graph.SignalDrawable;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.R.dimen;
@@ -62,9 +61,6 @@
import com.android.systemui.statusbar.phone.MultiUserSwitch;
import com.android.systemui.statusbar.phone.SettingsButton;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
-import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import com.android.systemui.tuner.TunerService;
@@ -73,15 +69,12 @@
import javax.inject.Named;
public class QSFooterImpl extends FrameLayout implements QSFooter,
- OnClickListener, OnUserInfoChangedListener, EmergencyListener, SignalCallback,
- CarrierTextController.CarrierTextCallback {
+ OnClickListener, OnUserInfoChangedListener {
- private static final int SIM_SLOTS = 2;
private static final String TAG = "QSFooterImpl";
private final ActivityStarter mActivityStarter;
private final UserInfoController mUserInfoController;
- private final NetworkController mNetworkController;
private final DeviceProvisionedController mDeviceProvisionedController;
private SettingsButton mSettingsButton;
protected View mSettingsContainer;
@@ -94,7 +87,6 @@
private boolean mListening;
- private boolean mShowEmergencyCallsOnly;
private View mDivider;
protected MultiUserSwitch mMultiUserSwitch;
private ImageView mMultiUserAvatar;
@@ -103,35 +95,30 @@
private float mExpansionAmount;
protected View mEdit;
+ protected View mEditContainer;
private TouchAnimator mSettingsCogAnimator;
private View mActionsContainer;
private View mDragHandle;
- private View mCarrierDivider;
- private ViewGroup mMobileFooter;
- private View[] mMobileGroups = new View[SIM_SLOTS];
- private ViewGroup[] mCarrierGroups = new ViewGroup[SIM_SLOTS];
- private TextView[] mCarrierTexts = new TextView[SIM_SLOTS];
- private ImageView[] mMobileSignals = new ImageView[SIM_SLOTS];
- private ImageView[] mMobileRoamings = new ImageView[SIM_SLOTS];
- private final CellSignalState[] mInfos =
- new CellSignalState[]{new CellSignalState(), new CellSignalState()};
-
- private final int mColorForeground;
private OnClickListener mExpandClickListener;
- private CarrierTextController mCarrierTextController;
+
+ private final ContentObserver mDeveloperSettingsObserver = new ContentObserver(
+ new Handler(mContext.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ super.onChange(selfChange, uri);
+ setBuildText();
+ }
+ };
@Inject
public QSFooterImpl(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
ActivityStarter activityStarter, UserInfoController userInfoController,
- NetworkController networkController,
DeviceProvisionedController deviceProvisionedController) {
super(context, attrs);
- mColorForeground = Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground);
mActivityStarter = activityStarter;
mUserInfoController = userInfoController;
- mNetworkController = networkController;
mDeviceProvisionedController = deviceProvisionedController;
}
@@ -140,7 +127,6 @@
this(context, attrs,
Dependency.get(ActivityStarter.class),
Dependency.get(UserInfoController.class),
- Dependency.get(NetworkController.class),
Dependency.get(DeviceProvisionedController.class));
}
@@ -159,26 +145,12 @@
mSettingsContainer = findViewById(R.id.settings_button_container);
mSettingsButton.setOnClickListener(this);
- mMobileFooter = findViewById(R.id.qs_mobile);
- mCarrierGroups[0] = findViewById(R.id.carrier1);
- mCarrierGroups[1] = findViewById(R.id.carrier2);
-
- for (int i = 0; i < SIM_SLOTS; i++) {
- mMobileGroups[i] = mCarrierGroups[i].findViewById(R.id.mobile_combo);
- mMobileSignals[i] = mCarrierGroups[i].findViewById(R.id.mobile_signal);
- mMobileRoamings[i] = mCarrierGroups[i].findViewById(R.id.mobile_roaming);
- mCarrierTexts[i] = mCarrierGroups[i].findViewById(R.id.qs_carrier_text);
- }
- mCarrierDivider = findViewById(R.id.qs_carrier_divider);
- CharSequence separator = mContext.getString(
- com.android.internal.R.string.kg_text_message_separator);
- mCarrierTextController = new CarrierTextController(mContext, separator, false, false);
-
mMultiUserSwitch = findViewById(R.id.multi_user_switch);
mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
mDragHandle = findViewById(R.id.qs_drag_handle_view);
mActionsContainer = findViewById(R.id.qs_footer_actions_container);
+ mEditContainer = findViewById(R.id.qs_footer_actions_edit_container);
// RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view
@@ -190,6 +162,21 @@
oldBottom) -> updateAnimator(right - left));
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
updateEverything();
+ setBuildText();
+ }
+
+ private void setBuildText() {
+ TextView v = findViewById(R.id.build);
+ if (v == null) return;
+ if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)) {
+ v.setText(mContext.getString(
+ com.android.internal.R.string.bugreport_status,
+ Build.VERSION.RELEASE,
+ Build.ID));
+ v.setVisibility(View.VISIBLE);
+ } else {
+ v.setVisibility(View.GONE);
+ }
}
private void updateAnimator(int width) {
@@ -222,14 +209,6 @@
private void updateResources() {
updateFooterAnimator();
-
- // Update the width and weight of the actions container as the page indicator can sometimes
- // show and the layout needs to center it between the carrier text and actions container.
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mActionsContainer.getLayoutParams();
- params.width = mContext.getResources().getInteger(R.integer.qs_footer_actions_width);
- params.weight = mContext.getResources().getInteger(R.integer.qs_footer_actions_weight);
- mActionsContainer.setLayoutParams(params);
}
private void updateFooterAnimator() {
@@ -240,9 +219,8 @@
private TouchAnimator createFooterAnimator() {
return new TouchAnimator.Builder()
.addFloat(mDivider, "alpha", 0, 1)
- .addFloat(mMobileFooter, "alpha", 0, 0, 1)
- .addFloat(mCarrierDivider, "alpha", 0, 1)
.addFloat(mActionsContainer, "alpha", 0, 1)
+ .addFloat(mEditContainer, "alpha", 0, 1)
.addFloat(mDragHandle, "alpha", 1, 0, 0)
.addFloat(mPageIndicator, "alpha", 0, 1)
.setStartDelay(0.15f)
@@ -277,9 +255,18 @@
}
@Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED), false,
+ mDeveloperSettingsObserver, UserHandle.USER_ALL);
+ }
+
+ @Override
@VisibleForTesting
public void onDetachedFromWindow() {
setListening(false);
+ mContext.getContentResolver().unregisterContentObserver(mDeveloperSettingsObserver);
super.onDetachedFromWindow();
}
@@ -337,7 +324,7 @@
TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
mMultiUserSwitch.setVisibility(showUserSwitcher(isDemo) ? View.VISIBLE : View.INVISIBLE);
- mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
+ mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
}
@@ -364,16 +351,8 @@
private void updateListeners() {
if (mListening) {
mUserInfoController.addCallback(this);
- if (mNetworkController.hasVoiceCallingFeature()) {
- mNetworkController.addEmergencyListener(this);
- mNetworkController.addCallback(this);
- }
- mCarrierTextController.setListening(this);
} else {
mUserInfoController.removeCallback(this);
- mNetworkController.removeEmergencyListener(this);
- mNetworkController.removeCallback(this);
- mCarrierTextController.setListening(null);
}
}
@@ -430,17 +409,6 @@
}
@Override
- public void setEmergencyCallsOnly(boolean show) {
- boolean changed = show != mShowEmergencyCallsOnly;
- if (changed) {
- mShowEmergencyCallsOnly = show;
- if (mExpanded) {
- updateEverything();
- }
- }
- }
-
- @Override
public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
if (picture != null &&
UserManager.get(mContext).isGuestUser(KeyguardUpdateMonitor.getCurrentUser()) &&
@@ -452,162 +420,4 @@
}
mMultiUserAvatar.setImageDrawable(picture);
}
-
- private void handleUpdateState() {
- for (int i = 0; i < SIM_SLOTS; i++) {
- mMobileGroups[i].setVisibility(mInfos[i].visible ? View.VISIBLE : View.GONE);
- if (mInfos[i].visible) {
- mMobileRoamings[i].setVisibility(mInfos[i].roaming ? View.VISIBLE : View.GONE);
- mMobileRoamings[i].setImageTintList(ColorStateList.valueOf(mColorForeground));
- SignalDrawable d = new SignalDrawable(mContext);
- d.setDarkIntensity(QuickStatusBarHeader.getColorIntensity(mColorForeground));
- mMobileSignals[i].setImageDrawable(d);
- mMobileSignals[i].setImageLevel(mInfos[i].mobileSignalIconId);
-
- StringBuilder contentDescription = new StringBuilder();
- if (mInfos[i].contentDescription != null) {
- contentDescription.append(mInfos[i].contentDescription).append(", ");
- }
- if (mInfos[i].roaming) {
- contentDescription
- .append(mContext.getString(R.string.data_connection_roaming))
- .append(", ");
- }
- // TODO: show mobile data off/no internet text for 5 seconds before carrier text
- if (TextUtils.equals(mInfos[i].typeContentDescription,
- mContext.getString(R.string.data_connection_no_internet))
- || TextUtils.equals(mInfos[i].typeContentDescription,
- mContext.getString(R.string.cell_data_off_content_description))) {
- contentDescription.append(mInfos[i].typeContentDescription);
- }
- mMobileSignals[i].setContentDescription(contentDescription);
- }
- }
- mCarrierDivider.setVisibility(
- mInfos[0].visible && mInfos[1].visible ? View.VISIBLE : View.GONE);
- }
-
- @VisibleForTesting
- protected int getSlotIndex(int subscriptionId) {
- return SubscriptionManager.getSlotIndex(subscriptionId);
- }
-
- @Override
- public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
- if (info.anySimReady) {
- boolean[] slotSeen = new boolean[SIM_SLOTS];
- if (info.listOfCarriers.length == info.subscriptionIds.length) {
- for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
- int slot = getSlotIndex(info.subscriptionIds[i]);
- if (slot >= SIM_SLOTS) {
- Log.w(TAG, "updateInfoCarrier - slot: " + slot);
- continue;
- }
- if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- Log.e(TAG,
- "Invalid SIM slot index for subscription: "
- + info.subscriptionIds[i]);
- continue;
- }
- mInfos[slot].visible = true;
- slotSeen[slot] = true;
- mCarrierTexts[slot].setText(info.listOfCarriers[i].toString().trim());
- mCarrierGroups[slot].setVisibility(View.VISIBLE);
- }
- for (int i = 0; i < SIM_SLOTS; i++) {
- if (!slotSeen[i]) {
- mInfos[i].visible = false;
- mCarrierGroups[i].setVisibility(View.GONE);
- }
- }
- } else {
- Log.e(TAG, "Carrier information arrays not of same length");
- }
- } else {
- mInfos[0].visible = false;
- mCarrierTexts[0].setText(info.carrierText);
- mCarrierGroups[0].setVisibility(View.VISIBLE);
- for (int i = 1; i < SIM_SLOTS; i++) {
- mInfos[i].visible = false;
- mCarrierTexts[i].setText("");
- mCarrierGroups[i].setVisibility(View.GONE);
- }
- }
- handleUpdateState();
- }
-
- @Override
- public void setMobileDataIndicators(NetworkController.IconState statusIcon,
- NetworkController.IconState qsIcon, int statusType,
- int qsType, boolean activityIn, boolean activityOut,
- String typeContentDescription,
- String description, boolean isWide, int subId, boolean roaming) {
- int slotIndex = getSlotIndex(subId);
- if (slotIndex >= SIM_SLOTS) {
- Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
- return;
- }
- if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
- Log.e(TAG, "Invalid SIM slot index for subscription: " + subId);
- return;
- }
- mInfos[slotIndex].visible = statusIcon.visible;
- mInfos[slotIndex].mobileSignalIconId = statusIcon.icon;
- mInfos[slotIndex].contentDescription = statusIcon.contentDescription;
- mInfos[slotIndex].typeContentDescription = typeContentDescription;
- mInfos[slotIndex].roaming = roaming;
- handleUpdateState();
- }
-
- @Override
- public void setNoSims(boolean hasNoSims, boolean simDetected) {
- if (hasNoSims) {
- mInfos[0].visible = false;
- mInfos[1].visible = false;
- }
- handleUpdateState();
- }
-
- private final class CellSignalState {
- boolean visible;
- int mobileSignalIconId;
- public String contentDescription;
- String typeContentDescription;
- boolean roaming;
- }
-
- /**
- * TextView that changes its ellipsize value with its visibility.
- */
- public static class QSCarrierText extends TextView {
- public QSCarrierText(Context context) {
- super(context);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- // Only show marquee when visible
- if (visibility == VISIBLE) {
- setEllipsize(TextUtils.TruncateAt.MARQUEE);
- setSelected(true);
- } else {
- setEllipsize(TextUtils.TruncateAt.END);
- setSelected(false);
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index f1f0f69..3c3dfb1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -16,8 +16,6 @@
package com.android.systemui.qs;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
-
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
import android.annotation.Nullable;
@@ -79,7 +77,6 @@
protected QSTileHost mHost;
protected QSSecurityFooter mFooter;
- private PageIndicator mPanelPageIndicator;
private PageIndicator mFooterPageIndicator;
private boolean mGridContentVisible = true;
@@ -110,11 +107,6 @@
mTileLayout.setListening(mListening);
addView((View) mTileLayout);
- mPanelPageIndicator = (PageIndicator) LayoutInflater.from(context).inflate(
- R.layout.qs_page_indicator, this, false);
- addView(mPanelPageIndicator);
-
- ((PagedTileLayout) mTileLayout).setPageIndicator(mPanelPageIndicator);
mQsTileRevealController = new QSTileRevealController(mContext, this,
(PagedTileLayout) mTileLayout);
@@ -141,10 +133,6 @@
return mDivider;
}
- public View getPageIndicator() {
- return mPanelPageIndicator;
- }
-
public QSTileRevealController getQsTileRevealController() {
return mQsTileRevealController;
}
@@ -265,21 +253,11 @@
private void updatePageIndicator() {
if (mTileLayout instanceof PagedTileLayout) {
- // If we're in landscape, and we have the footer page indicator (which we should if the
- // footer has been initialized & linked), then we'll show the footer page indicator to
- // save space in the main QS tile area. Otherwise, we'll use the default one under the
- // tiles/above the footer.
- boolean shouldUseFooterPageIndicator =
- getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE
- && mFooterPageIndicator != null;
-
- mPanelPageIndicator.setVisibility(View.GONE);
if (mFooterPageIndicator != null) {
mFooterPageIndicator.setVisibility(View.GONE);
- }
- ((PagedTileLayout) mTileLayout).setPageIndicator(
- shouldUseFooterPageIndicator ? mFooterPageIndicator : mPanelPageIndicator);
+ ((PagedTileLayout) mTileLayout).setPageIndicator(mFooterPageIndicator);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 08cf606..b502a9524 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -113,6 +113,7 @@
private boolean mListening;
private boolean mQsDisabled;
+ private QSCarrierGroup mCarrierGroup;
protected QuickQSPanel mHeaderQsPanel;
protected QSTileHost mHost;
private TintedIconManager mIconManager;
@@ -207,6 +208,7 @@
mRingerModeTextView = findViewById(R.id.ringer_mode_text);
mPrivacyChip = findViewById(R.id.privacy_chip);
mPrivacyChip.setOnClickListener(this);
+ mCarrierGroup = findViewById(R.id.carrier_group);
updateResources();
@@ -519,6 +521,7 @@
}
mHeaderQsPanel.setListening(listening);
mListening = listening;
+ mCarrierGroup.setListening(mListening);
if (listening) {
mZenController.addCallback(this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 3fc60cd..b68c7c6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -51,10 +51,12 @@
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.inputmethodservice.InputMethodService;
+import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
@@ -137,6 +139,7 @@
private AccessibilityManager mAccessibilityManager;
private MagnificationContentObserver mMagnificationObserver;
private ContentResolver mContentResolver;
+ private boolean mAssistantAvailable;
private int mDisabledFlags1;
private int mDisabledFlags2;
@@ -167,6 +170,11 @@
public void onConnectionChanged(boolean isConnected) {
mNavigationBarView.updateStates();
updateScreenPinningGestures();
+
+ // Send the assistant availability upon connection
+ if (isConnected) {
+ mNavigationBarView.setAssistantAvailable(mAssistantAvailable);
+ }
}
@Override
@@ -213,6 +221,19 @@
private final Runnable mAutoDim = () -> getBarTransitions().setAutoDim(true);
+ private final ContentObserver mAssistContentObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ boolean available = mAssistManager
+ .getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
+ if (mAssistantAvailable != available) {
+ mNavigationBarView.setAssistantAvailable(available);
+ mAssistantAvailable = available;
+ }
+ }
+ };
+
@Inject
public NavigationBarFragment(AccessibilityManagerWrapper accessibilityManagerWrapper,
DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger,
@@ -221,6 +242,7 @@
mDeviceProvisionedController = deviceProvisionedController;
mMetricsLogger = metricsLogger;
mAssistManager = assistManager;
+ mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
mOverviewProxyService = overviewProxyService;
}
@@ -242,6 +264,9 @@
mContentResolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED), false,
mMagnificationObserver, UserHandle.USER_ALL);
+ mContentResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),
+ false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);
if (savedInstanceState != null) {
mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0);
@@ -258,6 +283,7 @@
super.onDestroy();
mAccessibilityManagerWrapper.removeCallback(mAccessibilityListener);
mContentResolver.unregisterContentObserver(mMagnificationObserver);
+ mContentResolver.unregisterContentObserver(mAssistContentObserver);
}
@Override
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 faa2ab1..2a38f77 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -63,6 +63,7 @@
public static final String NAVSPACE = "space";
public static final String CLIPBOARD = "clipboard";
public static final String HOME_HANDLE = "home_handle";
+ public static final String ASSISTANT_HANDLE = "assistant_handle";
public static final String KEY = "key";
public static final String LEFT = "left";
public static final String RIGHT = "right";
@@ -398,6 +399,8 @@
v = inflater.inflate(R.layout.contextual, parent, false);
} else if (HOME_HANDLE.equals(button)) {
v = inflater.inflate(R.layout.home_handle, parent, false);
+ } else if (ASSISTANT_HANDLE.equals(button)) {
+ v = inflater.inflate(R.layout.assistant_handle, parent, false);
} else if (button.startsWith(KEY)) {
String uri = extractImage(button);
int code = extractKeycode(button);
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 f82b05e..c389082 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -171,6 +171,7 @@
private NotificationPanelView mPanelView;
private NavBarTintController mColorAdaptionController;
+ private boolean mAssistantAvailable;
private NavigationPrototypeController mPrototypeController;
private NavigationGestureAction[] mDefaultGestureMap;
private QuickScrubAction mQuickScrubAction;
@@ -347,6 +348,11 @@
public void onHomeHandleVisiblilityChanged(boolean visible) {
showHomeHandle(visible);
}
+
+ @Override
+ public void onAssistantGestureEnabled(boolean enabled) {
+ updateAssistantAvailability();
+ }
};
public NavigationBarView(Context context, AttributeSet attrs) {
@@ -385,6 +391,7 @@
mButtonDispatchers.put(R.id.back, new ButtonDispatcher(R.id.back));
mButtonDispatchers.put(R.id.home, new ButtonDispatcher(R.id.home));
mButtonDispatchers.put(R.id.home_handle, new ButtonDispatcher(R.id.home_handle));
+ mButtonDispatchers.put(R.id.assistant_handle, new ButtonDispatcher(R.id.assistant_handle));
mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps));
mButtonDispatchers.put(R.id.menu, menuButton);
mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton);
@@ -582,6 +589,10 @@
return mButtonDispatchers.get(R.id.home_handle);
}
+ public ButtonDispatcher getAssistantHandle() {
+ return mButtonDispatchers.get(R.id.assistant_handle);
+ }
+
public SparseArray<ButtonDispatcher> getButtonDispatchers() {
return mButtonDispatchers;
}
@@ -940,6 +951,24 @@
}
}
+ public void setAssistantAvailable(boolean available) {
+ mAssistantAvailable = available;
+ updateAssistantAvailability();
+ }
+
+ // TODO(b/112934365): move this back to NavigationBarFragment when prototype is removed
+ private void updateAssistantAvailability() {
+ boolean available = mAssistantAvailable && mPrototypeController.isAssistantGestureEnabled();
+ getAssistantHandle().setVisibility(available ? View.VISIBLE : View.GONE);
+ if (mOverviewProxyService.getProxy() != null) {
+ try {
+ mOverviewProxyService.getProxy().onAssistantAvailable(available);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to send assistant availability data to launcher");
+ }
+ }
+ }
+
public void setMenuVisibility(final boolean show) {
mContextualButtonGroup.setButtonVisiblity(R.id.menu, show);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
index 2c31e2c..31579c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
@@ -43,6 +43,7 @@
private final String GESTURE_MATCH_SETTING = "quickstepcontroller_gesture_match_map";
public static final String NAV_COLOR_ADAPT_ENABLE_SETTING = "navbar_color_adapt_enable";
public static final String SHOW_HOME_HANDLE_SETTING = "quickstepcontroller_showhandle";
+ public static final String ENABLE_ASSISTANT_GESTURE = "ENABLE_ASSISTANT_GESTURE";
@Retention(RetentionPolicy.SOURCE)
@IntDef({ACTION_DEFAULT, ACTION_QUICKSTEP, ACTION_QUICKSCRUB, ACTION_BACK,
@@ -87,6 +88,7 @@
registerObserver(NAV_COLOR_ADAPT_ENABLE_SETTING);
registerObserver(EDGE_SENSITIVITY_WIDTH_SETTING);
registerObserver(SHOW_HOME_HANDLE_SETTING);
+ registerObserver(ENABLE_ASSISTANT_GESTURE);
}
/**
@@ -119,6 +121,8 @@
getEdgeSensitivityHeight());
} else if (path.endsWith(SHOW_HOME_HANDLE_SETTING)) {
mListener.onHomeHandleVisiblilityChanged(showHomeHandle());
+ } else if (path.endsWith(ENABLE_ASSISTANT_GESTURE)) {
+ mListener.onAssistantGestureEnabled(isAssistantGestureEnabled());
}
}
}
@@ -162,6 +166,11 @@
return getGlobalBool(SHOW_HOME_HANDLE_SETTING, false /* default */);
}
+ boolean isAssistantGestureEnabled() {
+ return getGlobalBool(ENABLE_ASSISTANT_GESTURE, false /* default */);
+ }
+
+
/**
* Since Settings.Global cannot pass arrays, use a string to represent each character as a
* gesture map to actions corresponding to {@see GestureAction}. The number is represented as:
@@ -201,5 +210,6 @@
void onHomeHandleVisiblilityChanged(boolean visible);
void onColorAdaptChanged(boolean enabled);
void onEdgeSensitivityChanged(int width, int height);
+ void onAssistantGestureEnabled(boolean enabled);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
index c6636b4..e6b6672 100644
--- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
+++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
@@ -24,6 +24,7 @@
import android.view.View;
import com.android.systemui.SystemUIFactory;
+import com.android.systemui.qs.QSCarrierGroup;
import com.android.systemui.qs.QSFooterImpl;
import com.android.systemui.qs.QuickStatusBarHeader;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
@@ -124,6 +125,11 @@
* Creates the NotificationPanelView.
*/
NotificationPanelView createPanelView();
+
+ /**
+ * Creates the QSCarrierGroup
+ */
+ QSCarrierGroup createQSCarrierGroup();
}
/**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java
new file mode 100644
index 0000000..f29392b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSCarrierGroupTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2019 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.qs;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.telephony.SubscriptionManager;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.LayoutInflater;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.keyguard.CarrierTextController;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.utils.leaks.LeakCheckedTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+@SmallTest
+public class QSCarrierGroupTest extends LeakCheckedTest {
+
+ private QSCarrierGroup mCarrierGroup;
+
+ @Before
+ public void setup() throws Exception {
+ injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+ TestableLooper.get(this).runWithLooper(
+ () -> mCarrierGroup = (QSCarrierGroup) LayoutInflater.from(mContext).inflate(
+ R.layout.qs_carrier_group, null));
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_sameLengths() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenAnswer(
+ new Answer<Integer>() {
+ @Override
+ public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
+ return invocationOnMock.getArgument(0);
+ }
+ });
+
+ // listOfCarriers length 1, subscriptionIds length 1, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c1 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ false,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c1);
+
+ // listOfCarriers length 1, subscriptionIds length 1, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c2 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ true,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c2);
+
+ // listOfCarriers length 2, subscriptionIds length 2, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c3 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ false,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c3);
+
+ // listOfCarriers length 2, subscriptionIds length 2, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_differentLength() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenAnswer(
+ new Answer<Integer>() {
+ @Override
+ public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
+ return invocationOnMock.getArgument(0);
+ }
+ });
+
+ // listOfCarriers length 2, subscriptionIds length 1, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c1 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ false,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c1);
+
+ // listOfCarriers length 2, subscriptionIds length 1, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c2 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0});
+ spiedCarrierGroup.updateCarrierInfo(c2);
+
+ // listOfCarriers length 1, subscriptionIds length 2, anySims false
+ CarrierTextController.CarrierTextCallbackInfo
+ c3 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ false,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c3);
+
+ // listOfCarriers length 1, subscriptionIds length 2, anySims true
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testUpdateCarrierText_invalidSim() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenReturn(
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+ CarrierTextController.CarrierTextCallbackInfo
+ c4 = new CarrierTextController.CarrierTextCallbackInfo(
+ "",
+ new CharSequence[]{"", ""},
+ true,
+ new int[]{0, 1});
+ spiedCarrierGroup.updateCarrierInfo(c4);
+ }
+
+ @Test // throws no Exception
+ public void testSetMobileDataIndicators_invalidSim() {
+ QSCarrierGroup spiedCarrierGroup = Mockito.spy(mCarrierGroup);
+ when(spiedCarrierGroup.getSlotIndex(anyInt())).thenReturn(
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+ spiedCarrierGroup.setMobileDataIndicators(
+ mock(NetworkController.IconState.class),
+ mock(NetworkController.IconState.class),
+ 0, 0, true, true, "", "", true, 0, true);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
index a8b169c..d4688d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
@@ -16,13 +16,10 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.telephony.SubscriptionManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -31,21 +28,16 @@
import androidx.test.filters.SmallTest;
-import com.android.keyguard.CarrierTextController.CarrierTextCallbackInfo;
import com.android.systemui.R;
import com.android.systemui.R.id;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@@ -77,117 +69,4 @@
// Verify Settings wasn't launched.
verify(mActivityStarter, never()).startActivity(any(), anyBoolean());
}
-
- @Test // throws no Exception
- public void testUpdateCarrierText_sameLengts() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenAnswer(
- new Answer<Integer>() {
- @Override
- public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
- return invocationOnMock.getArgument(0);
- }
- });
-
- // listOfCarriers length 1, subscriptionIds length 1, anySims false
- CarrierTextCallbackInfo c1 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- false,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c1);
-
- // listOfCarriers length 1, subscriptionIds length 1, anySims true
- CarrierTextCallbackInfo c2 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- true,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c2);
-
- // listOfCarriers length 2, subscriptionIds length 2, anySims false
- CarrierTextCallbackInfo c3 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- false,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c3);
-
- // listOfCarriers length 2, subscriptionIds length 2, anySims true
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testUpdateCarrierText_differentLength() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenAnswer(
- new Answer<Integer>() {
- @Override
- public Integer answer(InvocationOnMock invocationOnMock) throws Throwable {
- return invocationOnMock.getArgument(0);
- }
- });
-
- // listOfCarriers length 2, subscriptionIds length 1, anySims false
- CarrierTextCallbackInfo c1 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- false,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c1);
-
- // listOfCarriers length 2, subscriptionIds length 1, anySims true
- CarrierTextCallbackInfo c2 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0});
- spiedFooter.updateCarrierInfo(c2);
-
- // listOfCarriers length 1, subscriptionIds length 2, anySims false
- CarrierTextCallbackInfo c3 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- false,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c3);
-
- // listOfCarriers length 1, subscriptionIds length 2, anySims true
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testUpdateCarrierText_invalidSim() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenReturn(
- SubscriptionManager.INVALID_SIM_SLOT_INDEX);
- CarrierTextCallbackInfo c4 = new CarrierTextCallbackInfo(
- "",
- new CharSequence[]{"", ""},
- true,
- new int[]{0, 1});
- spiedFooter.updateCarrierInfo(c4);
- }
-
- @Test // throws no Exception
- public void testSetMobileDataIndicators_invalidSim() {
- QSFooterImpl spiedFooter = Mockito.spy(mFooter);
- when(spiedFooter.getSlotIndex(anyInt())).thenReturn(
- SubscriptionManager.INVALID_SIM_SLOT_INDEX);
- spiedFooter.setMobileDataIndicators(
- mock(NetworkController.IconState.class),
- mock(NetworkController.IconState.class),
- 0, 0, true, true, "", "", true, 0, true);
- }
-
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 785d5b0..ff849c3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -69,6 +69,7 @@
import com.android.systemui.util.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -461,6 +462,7 @@
}
@Test
+ @Ignore
public void testSetShouldManageLifetime_setShouldManage() {
NotificationEntry entry = createTestNotificationRow().getEntry();
mGutsManager.setShouldManageLifetime(entry, true /* shouldManage */);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 6db3624..b85d058 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -51,6 +51,7 @@
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.utils.os.FakeHandler;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -99,12 +100,13 @@
visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager);
mScrimController.setHasBackdrop(false);
mScrimController.setWallpaperSupportsAmbientMode(false);
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+ mScrimController.finishAnimationsImmediately();
}
- @Test
- public void initialState() {
- Assert.assertEquals("ScrimController should start initialized",
- mScrimController.getState(), ScrimState.UNINITIALIZED);
+ @After
+ public void tearDown() {
+ mScrimController.finishAnimationsImmediately();
}
@Test
@@ -307,13 +309,13 @@
reset(mScrimBehind);
mScrimController.setPanelExpansion(0f);
mScrimController.setPanelExpansion(1.0f);
- mScrimController.onPreDraw();
+ mScrimController.finishAnimationsImmediately();
Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
mScrimController.setPanelExpansion(0f);
- mScrimController.onPreDraw();
+ mScrimController.finishAnimationsImmediately();
Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
@@ -336,6 +338,7 @@
mScrimController.setExpansionAffectsAlpha(true);
mScrimController.setPanelExpansion(0.1f);
+ mScrimController.finishAnimationsImmediately();
Assert.assertNotEquals("Scrim opacity should change when setExpansionAffectsAlpha "
+ "is true", scrimAlpha, mScrimBehind.getViewAlpha(), 0.01f);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
index ca0e1c6..043b832 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
@@ -35,11 +35,13 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
+@Ignore
public class StatusBarWindowViewTest extends SysuiTestCase {
private StatusBarWindowView mView;
@@ -60,6 +62,7 @@
}
@Test
+ @Ignore
public void testDragDownHelperCalledWhenDraggingDown() throws Exception {
when(Dependency.get(StatusBarStateController.class).getState())
.thenReturn(StatusBarState.SHADE);
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 245e2c9..0e852f8 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -479,13 +479,16 @@
private void setDeviceConfigProperties() {
synchronized (mLock) {
- mAugmentedServiceIdleUnbindTimeoutMs = Helper.getIntDeviceConfigProperty(
+ mAugmentedServiceIdleUnbindTimeoutMs = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_AUTOFILL,
AutofillManager.DEVICE_CONFIG_AUGMENTED_SERVICE_IDLE_UNBIND_TIMEOUT,
(int) AbstractRemoteService.PERMANENT_BOUND_TIMEOUT_MS);
- mAugmentedServiceRequestTimeoutMs = Helper.getIntDeviceConfigProperty(
+ mAugmentedServiceRequestTimeoutMs = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_AUTOFILL,
AutofillManager.DEVICE_CONFIG_AUGMENTED_SERVICE_REQUEST_TIMEOUT,
DEFAULT_AUGMENTED_AUTOFILL_REQUEST_TIMEOUT_MILLIS);
- mSupportedSmartSuggestionModes = Helper.getIntDeviceConfigProperty(
+ mSupportedSmartSuggestionModes = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_AUTOFILL,
AutofillManager.DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES,
AutofillManager.FLAG_SMART_SUGGESTION_SYSTEM);
if (verbose) {
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index d300bf2..3c0da7d 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -22,11 +22,9 @@
import android.app.assist.AssistStructure.ViewNode;
import android.content.ComponentName;
import android.metrics.LogMaker;
-import android.provider.DeviceConfig;
import android.service.autofill.Dataset;
import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.Log;
import android.util.Slog;
import android.view.WindowManager;
import android.view.autofill.AutofillId;
@@ -207,21 +205,6 @@
}
}
- /**
- * Gets the value of a device config property from the Autofill namespace.
- */
- static int getIntDeviceConfigProperty(@NonNull String key, int defaultValue) {
- final String value = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_AUTOFILL, key);
- if (value == null) return defaultValue;
-
- try {
- return Integer.parseInt(value);
- } catch (Exception e) {
- Log.w(TAG, "error parsing value (" + value + ") of property " + key + ": " + e);
- return defaultValue;
- }
- }
-
private interface ViewNodeFilter {
boolean matches(ViewNode node);
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 52d2334..c75b4c6 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -43,6 +43,7 @@
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.service.contentcapture.ActivityEvent.ActivityEventType;
import android.util.LocalLog;
import android.util.Slog;
import android.util.SparseBooleanArray;
@@ -233,18 +234,23 @@
private void setFineTuneParamsFromDeviceConfig() {
synchronized (mLock) {
- mDevCfgMaxBufferSize = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgMaxBufferSize = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_MAX_BUFFER_SIZE,
ContentCaptureManager.DEFAULT_MAX_BUFFER_SIZE);
- mDevCfgIdleFlushingFrequencyMs = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgIdleFlushingFrequencyMs = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_IDLE_FLUSH_FREQUENCY,
ContentCaptureManager.DEFAULT_IDLE_FLUSHING_FREQUENCY_MS);
- mDevCfgTextChangeFlushingFrequencyMs = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgTextChangeFlushingFrequencyMs = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_TEXT_CHANGE_FLUSH_FREQUENCY,
ContentCaptureManager.DEFAULT_TEXT_CHANGE_FLUSHING_FREQUENCY_MS);
- mDevCfgLogHistorySize = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgLogHistorySize = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_LOG_HISTORY_SIZE, 20);
- mDevCfgIdleUnbindTimeoutMs = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgIdleUnbindTimeoutMs = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_IDLE_UNBIND_TIMEOUT,
(int) AbstractRemoteService.PERMANENT_BOUND_TIMEOUT_MS);
if (verbose) {
@@ -259,7 +265,8 @@
}
private void setLoggingLevelFromDeviceConfig() {
- mDevCfgLoggingLevel = ContentCaptureHelper.getIntDeviceConfigProperty(
+ mDevCfgLoggingLevel = DeviceConfig.getInt(
+ DeviceConfig.NAMESPACE_CONTENT_CAPTURE,
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_LOGGING_LEVEL,
ContentCaptureHelper.getDefaultLoggingLevel());
ContentCaptureHelper.setLoggingLevel(mDevCfgLoggingLevel);
@@ -617,7 +624,7 @@
}
@Override
- public ContentCaptureOptions getOptionsForPackage(int userId, String packageName) {
+ public ContentCaptureOptions getOptionsForPackage(int userId, @NonNull String packageName) {
synchronized (mLock) {
final ContentCapturePerUserService service = peekServiceForUserLocked(userId);
if (service != null) {
@@ -626,5 +633,16 @@
}
return null;
}
+
+ @Override
+ public void notifyActivityEvent(int userId, @NonNull ComponentName activityComponent,
+ @ActivityEventType int eventType) {
+ synchronized (mLock) {
+ final ContentCapturePerUserService service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ service.onActivityEventLocked(activityComponent, eventType);
+ }
+ }
+ }
}
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index 9185cb6..feb1ac1 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -47,6 +47,8 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
+import android.service.contentcapture.ActivityEvent;
+import android.service.contentcapture.ActivityEvent.ActivityEventType;
import android.service.contentcapture.ContentCaptureService;
import android.service.contentcapture.IContentCaptureServiceCallback;
import android.service.contentcapture.SnapshotData;
@@ -175,10 +177,8 @@
@Override // from ContentCaptureServiceCallbacks
public void onServiceDied(@NonNull RemoteContentCaptureService service) {
- if (mMaster.debug) Slog.d(TAG, "remote service died: " + service);
- synchronized (mLock) {
- removeSelfFromCacheLocked();
- }
+ // Don't do anything; eventually the system will bind to it again...
+ Slog.w(TAG, "remote service died: " + service);
}
// TODO(b/119613670): log metrics
@@ -432,6 +432,19 @@
return options;
}
+ @GuardedBy("mLock")
+ void onActivityEventLocked(@NonNull ComponentName componentName, @ActivityEventType int type) {
+ if (mRemoteService == null) {
+ if (mMaster.debug) Slog.d(mTag, "onActivityEvent(): no remote service");
+ return;
+ }
+ final ActivityEvent event = new ActivityEvent(componentName, type);
+
+ if (mMaster.verbose) Slog.v(mTag, "onActivityEvent(): " + event);
+
+ mRemoteService.onActivityLifecycleEvent(event);
+ }
+
@Override
protected void dumpLocked(String prefix, PrintWriter pw) {
super.dumpLocked(prefix, pw);
diff --git a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
index dc07c0a..f7ac7b8c 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
@@ -23,6 +23,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.IBinder;
+import android.service.contentcapture.ActivityEvent;
import android.service.contentcapture.IContentCaptureService;
import android.service.contentcapture.IContentCaptureServiceCallback;
import android.service.contentcapture.SnapshotData;
@@ -111,6 +112,13 @@
scheduleAsyncRequest((s) -> s.onUserDataRemovalRequest(request));
}
+ /**
+ * Called by {@link ContentCaptureServerSession} to notify a high-level activity event.
+ */
+ public void onActivityLifecycleEvent(@NonNull ActivityEvent event) {
+ scheduleAsyncRequest((s) -> s.onActivityEvent(event));
+ }
+
public interface ContentCaptureServiceCallbacks
extends VultureCallback<RemoteContentCaptureService> {
// NOTE: so far we don't need to notify the callback implementation
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 219e046..199477c 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -71,6 +71,7 @@
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
+import android.net.ITetheringEventCallback;
import android.net.InetAddresses;
import android.net.IpPrefix;
import android.net.LinkProperties;
@@ -3798,6 +3799,22 @@
mTethering.getLatestTetheringEntitlementResult(type, receiver, showEntitlementUi);
}
+ /** Register tethering event callback. */
+ @Override
+ public void registerTetheringEventCallback(ITetheringEventCallback callback,
+ String callerPkg) {
+ ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
+ mTethering.registerTetheringEventCallback(callback);
+ }
+
+ /** Unregister tethering event callback. */
+ @Override
+ public void unregisterTetheringEventCallback(ITetheringEventCallback callback,
+ String callerPkg) {
+ ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
+ mTethering.unregisterTetheringEventCallback(callback);
+ }
+
// Called when we lose the default network and have no replacement yet.
// This will automatically be cleared after X seconds or a new default network
// becomes CONNECTED, whichever happens first. The timer is started by the
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 6b66394..3ab3c34 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -1132,7 +1132,7 @@
KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L);
NOTIFICATION_WHITELIST_DURATION = mParser.getDurationMillis(
KEY_NOTIFICATION_WHITELIST_DURATION, 30 * 1000L);
- WAIT_FOR_UNLOCK = mParser.getBoolean(KEY_WAIT_FOR_UNLOCK, false);
+ WAIT_FOR_UNLOCK = mParser.getBoolean(KEY_WAIT_FOR_UNLOCK, true);
PRE_IDLE_FACTOR_LONG = mParser.getFloat(KEY_PRE_IDLE_FACTOR_LONG, 1.67f);
PRE_IDLE_FACTOR_SHORT = mParser.getFloat(KEY_PRE_IDLE_FACTOR_SHORT, 0.33f);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 73884a0..0a80d45 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -185,6 +185,7 @@
import android.app.WindowConfiguration.WindowingMode;
import android.app.backup.IBackupManager;
import android.app.usage.UsageEvents;
+import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStatsManagerInternal;
import android.appwidget.AppWidgetManager;
import android.content.AutofillOptions;
@@ -1489,6 +1490,11 @@
private ParcelFileDescriptor[] mLifeMonitorFds;
+ /**
+ * Used to notify activity lifecycle events.
+ */
+ @Nullable ContentCaptureManagerInternal mContentCaptureService;
+
final class UiHandler extends Handler {
public UiHandler() {
super(com.android.server.UiThread.get().getLooper(), null, true);
@@ -1983,6 +1989,16 @@
mActivityTaskManager.setUsageStatsManager(usageStatsManager);
}
+ /**
+ * Sets the internal content capture manager service.
+ *
+ * <p>It's called when {@code SystemServer} starts, so we don't really need to acquire the lock.
+ */
+ public void setContentCaptureManager(
+ @Nullable ContentCaptureManagerInternal contentCaptureManager) {
+ mContentCaptureService = contentCaptureManager;
+ }
+
public void startObservingNativeCrashes() {
final NativeCrashListener ncl = new NativeCrashListener(this);
ncl.start();
@@ -2915,6 +2931,10 @@
taskRoot);
}
}
+ if (mContentCaptureService != null
+ && (event == Event.ACTIVITY_PAUSED || event == Event.ACTIVITY_RESUMED)) {
+ mContentCaptureService.notifyActivityEvent(userId, activity, event);
+ }
}
/**
@@ -3949,11 +3969,12 @@
final long callingId = Binder.clearCallingIdentity();
try {
synchronized (this) {
- mProcessList.killAllBackgroundProcessesLocked();
-
+ // Allow memory level to go down (the flag needs to be set before updating oom adj)
+ // because this method is also used to simulate low memory.
mAllowLowerMemLevel = true;
+ mProcessList.killPackageProcessesLocked(null /* packageName */, -1 /* appId */,
+ UserHandle.USER_ALL, ProcessList.CACHED_APP_MIN_ADJ, "kill all background");
- updateOomAdjLocked();
doLowMemReportIfNeededLocked(null);
}
} finally {
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 4f6f9fd..85322d6 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -492,7 +492,6 @@
final long endTime = SystemClock.uptimeMillis();
PrintWriter out = mWaitOption ? pw : getErrPrintWriter();
boolean launched = false;
- boolean hotLaunch = false;
switch (res) {
case ActivityManager.START_SUCCESS:
launched = true;
@@ -518,8 +517,6 @@
break;
case ActivityManager.START_TASK_TO_FRONT:
launched = true;
- //TODO(b/120981435) remove special case
- hotLaunch = true;
out.println(
"Warning: Activity not started, its current "
+ "task has been brought to the front");
@@ -567,9 +564,7 @@
result.who = intent.getComponent();
}
pw.println("Status: " + (result.timeout ? "timeout" : "ok"));
- final @WaitResult.LaunchState int launchState =
- hotLaunch ? WaitResult.LAUNCH_STATE_HOT : result.launchState;
- pw.println("LaunchState: " + launchStateToString(launchState));
+ pw.println("LaunchState: " + launchStateToString(result.launchState));
if (result.who != null) {
pw.println("Activity: " + result.who.flattenToShortString());
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 620fb2c..d02fd73 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -2085,25 +2085,6 @@
}
}
- void killAllBackgroundProcessesLocked() {
- final ArrayList<ProcessRecord> procs = new ArrayList<>();
- final int NP = mProcessNames.getMap().size();
- for (int ip = 0; ip < NP; ip++) {
- final SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip);
- final int NA = apps.size();
- for (int ia = 0; ia < NA; ia++) {
- final ProcessRecord app = apps.valueAt(ia);
- if (app.isPersistent()) {
- // We don't kill persistent processes.
- continue;
- }
- if (app.removed || app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
- procs.add(app);
- }
- }
- }
- }
-
@GuardedBy("mService")
boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj,
String reason) {
@@ -2140,6 +2121,11 @@
// Skip process if it doesn't meet our oom adj requirement.
if (app.setAdj < minOomAdj) {
+ // Note it is still possible to have a process with oom adj 0 in the killed
+ // processes, but it does not mean misjudgment. E.g. a bound service process
+ // and its client activity process are both in the background, so they are
+ // collected to be killed. If the client activity is killed first, the service
+ // may be scheduled to unbind and become an executing service (oom adj 0).
continue;
}
diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java
index 47c9b86..5965d59 100644
--- a/services/core/java/com/android/server/attention/AttentionManagerService.java
+++ b/services/core/java/com/android/server/attention/AttentionManagerService.java
@@ -127,8 +127,7 @@
}
private boolean isServiceEnabled() {
- final String enabled = DeviceConfig.getProperty(NAMESPACE, SERVICE_ENABLED);
- return enabled == null ? DEFAULT_SERVICE_ENABLED : "true".equals(enabled);
+ return DeviceConfig.getBoolean(NAMESPACE, SERVICE_ENABLED, DEFAULT_SERVICE_ENABLED);
}
/**
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 3b4b6f8..35704d40 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -62,6 +62,7 @@
import android.hardware.usb.UsbManager;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
+import android.net.ITetheringEventCallback;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -82,6 +83,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.UserHandle;
@@ -184,6 +186,9 @@
private final VersionedBroadcastListener mDefaultSubscriptionChange;
private final TetheringDependencies mDeps;
private final EntitlementManager mEntitlementMgr;
+ private final Handler mHandler;
+ private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks =
+ new RemoteCallbackList<>();
private volatile TetheringConfiguration mConfig;
private InterfaceSet mCurrentUpstreamIfaceSet;
@@ -193,6 +198,7 @@
private boolean mRndisEnabled; // track the RNDIS function enabled state
// True iff. WiFi tethering should be started when soft AP is ready.
private boolean mWifiTetherRequested;
+ private Network mTetherUpstream;
public Tethering(Context context, INetworkManagementService nmService,
INetworkStatsService statsService, INetworkPolicyManager policyManager,
@@ -213,9 +219,9 @@
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps);
mTetherMasterSM.start();
- final Handler smHandler = mTetherMasterSM.getHandler();
- mOffloadController = new OffloadController(smHandler,
- mDeps.getOffloadHardwareInterface(smHandler, mLog),
+ mHandler = mTetherMasterSM.getHandler();
+ mOffloadController = new OffloadController(mHandler,
+ mDeps.getOffloadHardwareInterface(mHandler, mLog),
mContext.getContentResolver(), mNMService,
mLog);
mUpstreamNetworkMonitor = deps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
@@ -227,7 +233,7 @@
mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM,
mLog, systemProperties);
mCarrierConfigChange = new VersionedBroadcastListener(
- "CarrierConfigChangeListener", mContext, smHandler, filter,
+ "CarrierConfigChangeListener", mContext, mHandler, filter,
(Intent ignored) -> {
mLog.log("OBSERVED carrier config change");
updateConfiguration();
@@ -237,7 +243,7 @@
filter = new IntentFilter();
filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
mDefaultSubscriptionChange = new VersionedBroadcastListener(
- "DefaultSubscriptionChangeListener", mContext, smHandler, filter,
+ "DefaultSubscriptionChangeListener", mContext, mHandler, filter,
(Intent ignored) -> {
mLog.log("OBSERVED default data subscription change");
updateConfiguration();
@@ -248,14 +254,13 @@
// Load tethering configuration.
updateConfiguration();
- startStateMachineUpdaters();
+ startStateMachineUpdaters(mHandler);
}
- private void startStateMachineUpdaters() {
+ private void startStateMachineUpdaters(Handler handler) {
mCarrierConfigChange.startListening();
mDefaultSubscriptionChange.startListening();
- final Handler handler = mTetherMasterSM.getHandler();
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_STATE);
filter.addAction(CONNECTIVITY_ACTION);
@@ -1229,8 +1234,13 @@
sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS);
}
}
- mUpstreamNetworkMonitor.setCurrentUpstream((ns != null) ? ns.network : null);
setUpstreamNetwork(ns);
+ final Network newUpstream = (ns != null) ? ns.network : null;
+ if (mTetherUpstream != newUpstream) {
+ mTetherUpstream = newUpstream;
+ mUpstreamNetworkMonitor.setCurrentUpstream(mTetherUpstream);
+ reportUpstreamChanged(mTetherUpstream);
+ }
}
protected void setUpstreamNetwork(NetworkState ns) {
@@ -1413,6 +1423,10 @@
mUpstreamNetworkMonitor.stop();
notifyDownstreamsOfNewUpstreamIface(null);
handleNewUpstreamNetworkState(null);
+ if (mTetherUpstream != null) {
+ mTetherUpstream = null;
+ reportUpstreamChanged(null);
+ }
}
private boolean updateUpstreamWanted() {
@@ -1684,6 +1698,40 @@
}
}
+ /** Register tethering event callback */
+ public void registerTetheringEventCallback(ITetheringEventCallback callback) {
+ mHandler.post(() -> {
+ try {
+ callback.onUpstreamChanged(mTetherUpstream);
+ } catch (RemoteException e) {
+ // Not really very much to do here.
+ }
+ mTetheringEventCallbacks.register(callback);
+ });
+ }
+
+ /** Unregister tethering event callback */
+ public void unregisterTetheringEventCallback(ITetheringEventCallback callback) {
+ mHandler.post(() -> {
+ mTetheringEventCallbacks.unregister(callback);
+ });
+ }
+
+ private void reportUpstreamChanged(Network network) {
+ final int length = mTetheringEventCallbacks.beginBroadcast();
+ try {
+ for (int i = 0; i < length; i++) {
+ try {
+ mTetheringEventCallbacks.getBroadcastItem(i).onUpstreamChanged(network);
+ } catch (RemoteException e) {
+ // Not really very much to do here.
+ }
+ }
+ } finally {
+ mTetheringEventCallbacks.finishBroadcast();
+ }
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
// Binder.java closes the resource for us.
diff --git a/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java b/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
index d04f920..fa7d3fc 100644
--- a/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
+++ b/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
@@ -18,9 +18,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.content.ComponentName;
import android.content.ContentCaptureOptions;
import android.os.Bundle;
import android.os.IBinder;
+import android.service.contentcapture.ActivityEvent.ActivityEventType;
/**
* ContentCapture Manager local system service interface.
@@ -51,4 +53,10 @@
@Nullable
public abstract ContentCaptureOptions getOptionsForPackage(@UserIdInt int userId,
@NonNull String packageName);
+
+ /**
+ * Notifies the intelligence service of a high-level activity event for the given user.
+ */
+ public abstract void notifyActivityEvent(@UserIdInt int userId,
+ @NonNull ComponentName activityComponent, @ActivityEventType int eventType);
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index b4a93d3..3052330 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -953,11 +953,7 @@
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
- if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
- hideInputMethodMenu();
- // No need to update mIsInteractive
- return;
- } else if (Intent.ACTION_USER_ADDED.equals(action)
+ if (Intent.ACTION_USER_ADDED.equals(action)
|| Intent.ACTION_USER_REMOVED.equals(action)) {
updateCurrentProfileIds();
return;
@@ -1549,12 +1545,35 @@
mSettingsObserver.registerContentObserverLocked(currentUserId);
final IntentFilter broadcastFilter = new IntentFilter();
- broadcastFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
broadcastFilter.addAction(Intent.ACTION_USER_ADDED);
broadcastFilter.addAction(Intent.ACTION_USER_REMOVED);
broadcastFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
broadcastFilter.addAction(ACTION_SHOW_INPUT_METHOD_PICKER);
mContext.registerReceiver(new ImmsBroadcastReceiver(), broadcastFilter);
+ mContext.registerReceiverAsUser(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Intent is guaranteed to be ACTION_CLOSE_SYSTEM_DIALOGS here.
+ final PendingResult pendingResult = getPendingResult();
+ if (pendingResult == null) {
+ return;
+ }
+ // sender userId can be a real user ID or USER_ALL.
+ final int senderUserId = pendingResult.getSendingUserId();
+ if (senderUserId != UserHandle.USER_ALL) {
+ final int resolvedUserId = PER_PROFILE_IME_ENABLED
+ ? senderUserId
+ : mUserManagerInternal.getProfileParentId(senderUserId);
+ if (resolvedUserId != mSettings.getCurrentUserId()) {
+ // A background user is trying to hide the dialog. Ignore.
+ return;
+ }
+ }
+ hideInputMethodMenu();
+ }
+ }, UserHandle.ALL, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
+ null, null);
final String defaultImiId = mSettings.getSelectedInputMethod();
final boolean imeSelectedOnBoot = !TextUtils.isEmpty(defaultImiId);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 9281bf8..d25360a 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2477,29 +2477,27 @@
checkCallerIsSameApp(callingPkg);
final int callingUid = Binder.getCallingUid();
UserHandle user = UserHandle.getUserHandleForUid(callingUid);
- try {
- ApplicationInfo info =
- mPackageManager.getApplicationInfo(delegate,
- MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
- user.getIdentifier());
- if (info != null) {
- mPreferencesHelper.setNotificationDelegate(
- callingPkg, callingUid, delegate, info.uid);
- handleSavePolicyFile();
+ if (delegate == null) {
+ mPreferencesHelper.revokeNotificationDelegate(callingPkg, Binder.getCallingUid());
+ handleSavePolicyFile();
+ } else {
+ try {
+ ApplicationInfo info =
+ mPackageManager.getApplicationInfo(delegate,
+ MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
+ user.getIdentifier());
+ if (info != null) {
+ mPreferencesHelper.setNotificationDelegate(
+ callingPkg, callingUid, delegate, info.uid);
+ handleSavePolicyFile();
+ }
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
}
- } catch (RemoteException e) {
- // :(
}
}
@Override
- public void revokeNotificationDelegate(String callingPkg) {
- checkCallerIsSameApp(callingPkg);
- mPreferencesHelper.revokeNotificationDelegate(callingPkg, Binder.getCallingUid());
- handleSavePolicyFile();
- }
-
- @Override
public String getNotificationDelegate(String callingPkg) {
// callable by Settings also
checkCallerIsSystemOrSameApp(callingPkg);
@@ -7196,7 +7194,7 @@
@Override
protected String getRequiredPermission() {
- // only signature/privileged apps can be bound
+ // only signature/privileged apps can be bound.
return android.Manifest.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE;
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index a3b72fd..3a4bcca 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -482,9 +482,9 @@
}
if (callingUid == Process.SYSTEM_UID) {
- params.installFlags |= PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE;
+ params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
} else {
- params.installFlags &= ~PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE;
+ params.installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
}
boolean isApex = (params.installFlags & PackageManager.INSTALL_APEX) != 0;
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index ff81ad5..a12005b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -820,9 +820,9 @@
// platform builds.
//
// In case of user builds, downgrade is permitted only for the system server initiated
- // sessions. This is enforced by INSTALL_RESPECT_ALLOW_DOWNGRADE flag parameter.
+ // sessions. This is enforced by INSTALL_ALLOW_DOWNGRADE flag parameter.
final boolean downgradeRequested =
- (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0;
+ (installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0;
if (!downgradeRequested) {
return false;
}
@@ -832,7 +832,7 @@
if (isDebuggable) {
return true;
}
- return (installFlags & PackageManager.INSTALL_RESPECT_ALLOW_DOWNGRADE) != 0;
+ return (installFlags & PackageManager.INSTALL_ALLOW_DOWNGRADE) != 0;
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 114810d..912a50e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -2337,7 +2337,7 @@
sessionParams.installFlags |= PackageManager.INSTALL_INTERNAL;
break;
case "-d":
- sessionParams.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ sessionParams.installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE;
break;
case "-g":
sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 59e5d77..aced1a2 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -979,7 +979,7 @@
// Try to revoke as an install permission which is for all users.
// The package is gone - no need to keep flags for applying policy.
permissionsState.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, 0);
if (permissionsState.revokeInstallPermission(bp) ==
PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
@@ -2165,7 +2165,7 @@
XmlUtils.skipCurrentTag(parser);
} else {
permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
- PackageManager.MASK_PERMISSION_FLAGS, flags);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
}
} else {
if (permissionsState.revokeInstallPermission(bp) ==
@@ -2174,7 +2174,7 @@
XmlUtils.skipCurrentTag(parser);
} else {
permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
- PackageManager.MASK_PERMISSION_FLAGS, flags);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
}
}
} else {
@@ -5240,7 +5240,7 @@
if (bp != null) {
permissionsState.revokeRuntimePermission(bp, userId);
permissionsState.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, 0);
}
}
}
@@ -5354,10 +5354,10 @@
if (granted) {
permissionsState.grantRuntimePermission(bp, userId);
permissionsState.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, flags);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
} else {
permissionsState.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, flags);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
}
} break;
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index ac7338e..a37c0bb 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -32,7 +32,7 @@
import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
-import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS;
+import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS_ALL;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.os.UserHandle.getAppId;
import static android.os.UserHandle.getUid;
@@ -980,7 +980,7 @@
// Revoke the runtime permission and clear the flags.
origPermissions.revokeRuntimePermission(bp, userId);
origPermissions.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ PackageManager.MASK_PERMISSION_FLAGS_ALL, 0);
// If we revoked a permission permission, we have to write.
updatedUserIds = ArrayUtils.appendInt(
updatedUserIds, userId);
@@ -1043,7 +1043,7 @@
}
permissionsState.updatePermissionFlags(bp, userId,
- MASK_PERMISSION_FLAGS, flags);
+ MASK_PERMISSION_FLAGS_ALL, flags);
}
} break;
@@ -1058,7 +1058,7 @@
if (origPermissions.revokeInstallPermission(bp)
!= PERMISSION_OPERATION_FAILURE) {
origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ MASK_PERMISSION_FLAGS_ALL, 0);
changedInstallPermission = true;
}
@@ -1094,7 +1094,7 @@
}
permissionsState.updatePermissionFlags(bp, userId,
- MASK_PERMISSION_FLAGS, flags);
+ MASK_PERMISSION_FLAGS_ALL, flags);
}
} break;
@@ -1114,7 +1114,7 @@
PERMISSION_OPERATION_FAILURE) {
// Also drop the permission flags.
permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ MASK_PERMISSION_FLAGS_ALL, 0);
changedInstallPermission = true;
Slog.i(TAG, "Un-granting permission " + perm
+ " from package " + pkg.packageName
@@ -2180,7 +2180,7 @@
if (bp != null) {
permissionsState.revokeInstallPermission(bp);
permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ MASK_PERMISSION_FLAGS_ALL, 0);
}
}
}
@@ -2199,7 +2199,7 @@
if (bp != null) {
permissionsState.revokeRuntimePermission(bp, userId);
permissionsState.updatePermissionFlags(bp, userId,
- PackageManager.MASK_PERMISSION_FLAGS, 0);
+ MASK_PERMISSION_FLAGS_ALL, 0);
runtimePermissionChangedUserIds = ArrayUtils.appendInt(
runtimePermissionChangedUserIds, userId);
}
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index f533ad1..d04a89e 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -255,7 +255,7 @@
}
});
try {
- result.get(5, TimeUnit.SECONDS);
+ result.get(30, TimeUnit.SECONDS);
userState.setPackagesHash(packagesHash);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
Slog.e(LOG_TAG, "Failed to grant defaults for user " + userId, e);
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index d3e1a05..ffdfe57 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -356,7 +356,7 @@
PackageInstaller packageInstaller = pm.getPackageInstaller();
PackageInstaller.SessionParams parentParams = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
- parentParams.setAllowDowngrade(true);
+ parentParams.setRequestDowngrade(true);
parentParams.setMultiPackage();
if (data.isStaged()) {
parentParams.setStaged();
@@ -377,7 +377,7 @@
params.setInstallerPackageName(installerPackageName);
}
}
- params.setAllowDowngrade(true);
+ params.setRequestDowngrade(true);
if (data.isStaged()) {
params.setStaged();
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 23bed7b..5a746eb 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -27,6 +27,8 @@
import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
+import static android.app.WaitResult.LAUNCH_STATE_COLD;
+import static android.app.WaitResult.LAUNCH_STATE_HOT;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
@@ -1311,6 +1313,8 @@
break;
}
case START_TASK_TO_FRONT: {
+ outResult.launchState =
+ r.attachedToProcess() ? LAUNCH_STATE_HOT : LAUNCH_STATE_COLD;
// ActivityRecord may represent a different activity, but it should not be
// in the resumed state.
if (r.nowVisible && r.isState(RESUMED)) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index eba00812..e733830 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -87,6 +87,7 @@
import com.android.server.camera.CameraServiceProxy;
import com.android.server.clipboard.ClipboardService;
import com.android.server.connectivity.IpConnectivityMetrics;
+import com.android.server.contentcapture.ContentCaptureManagerInternal;
import com.android.server.coverage.CoverageService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
import com.android.server.display.DisplayManagerService;
@@ -2250,6 +2251,13 @@
traceBeginAndSlog("StartContentCaptureService");
mSystemServiceManager.startService(CONTENT_CAPTURE_MANAGER_SERVICE_CLASS);
+
+ ContentCaptureManagerInternal ccmi =
+ LocalServices.getService(ContentCaptureManagerInternal.class);
+ if (ccmi != null && mActivityManagerService != null) {
+ mActivityManagerService.setContentCaptureManager(ccmi);
+ }
+
traceEnd();
}
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index fae7920..07ffaac 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -322,6 +322,7 @@
* <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
* <code>RESULT_ERROR_RADIO_OFF</code><br>
* <code>RESULT_ERROR_NULL_PDU</code><br>
+ * <code>RESULT_ERROR_NO_SERVICE</code><br>
* For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
* the extra "errorCode" containing a radio technology specific value,
* generally only useful for troubleshooting.<br>
@@ -371,19 +372,12 @@
if (DBG) {
Log.d(TAG, "for subId: " + subId + ", subscription-info: " + info);
}
- if (info == null) {
- // There is no subscription for the given subId. That can only mean one thing:
- // the caller is using a SmsManager instance with an obsolete subscription id.
- // That is most probably because caller didn't invalidate SmsManager instance
- // for an already deleted subscription id.
- Log.e(TAG, "subId: " + subId + " for this SmsManager instance is obsolete.");
- sendErrorInPendingIntent(sentIntent, SmsManager.RESULT_ERROR_NO_SERVICE);
- }
/* If the Subscription associated with this SmsManager instance belongs to a remote-sim,
* then send the message thru the remote-sim subscription.
*/
- if (info.getSubscriptionType() == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM) {
+ if (info != null
+ && info.getSubscriptionType() == SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM) {
if (DBG) Log.d(TAG, "sending message thru bluetooth");
sendTextMessageBluetooth(destinationAddress, scAddress, text, sentIntent,
deliveryIntent, info);
@@ -391,8 +385,10 @@
}
try {
+ // If the subscription is invalid or default, we will use the default phone to send the
+ // SMS and possibly fail later in the SMS sending process.
ISms iccISms = getISmsServiceOrThrow();
- iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
+ iccISms.sendTextForSubscriber(subId, ActivityThread.currentPackageName(),
destinationAddress,
scAddress, text, sentIntent, deliveryIntent,
persistMessage);
@@ -465,6 +461,9 @@
}
private void sendErrorInPendingIntent(PendingIntent intent, int errorCode) {
+ if (intent == null) {
+ return;
+ }
try {
intent.send(errorCode);
} catch (PendingIntent.CanceledException e) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 04f3c6b..7954d0e 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -9748,7 +9748,7 @@
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony.getNumberOfModemsWithSimultaneousDataConnections(
- getSubId(), mContext.getOpPackageName());
+ getSubId(), getOpPackageName());
}
} catch (RemoteException ex) {
// This could happen if binder process crashes.
diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java
index 9104d9f..d12cda8 100644
--- a/telephony/java/android/telephony/ims/ProvisioningManager.java
+++ b/telephony/java/android/telephony/ims/ProvisioningManager.java
@@ -154,7 +154,7 @@
* @param item the IMS provisioning key constant, as defined by the OEM.
* @param value the new String value of the IMS configuration constant.
*/
- public void onProvisioningStringChanged(int item, String value) {
+ public void onProvisioningStringChanged(int item, @NonNull String value) {
// Base Implementation
}
diff --git a/test-mock/src/android/test/mock/MockContext.java b/test-mock/src/android/test/mock/MockContext.java
index ae6cd29..a95b6f1 100644
--- a/test-mock/src/android/test/mock/MockContext.java
+++ b/test-mock/src/android/test/mock/MockContext.java
@@ -577,9 +577,14 @@
}
@Override
- public boolean bindIsolatedService(Intent service,
- ServiceConnection conn, int flags,
- String instanceName) {
+ public boolean bindService(Intent service, int flags, Executor executor,
+ ServiceConnection conn) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean bindIsolatedService(Intent service, int flags, String instanceName,
+ Executor executor, ServiceConnection conn) {
throw new UnsupportedOperationException();
}
diff --git a/test-runner/src/android/test/IsolatedContext.java b/test-runner/src/android/test/IsolatedContext.java
index 73db451..dd4a9a3 100644
--- a/test-runner/src/android/test/IsolatedContext.java
+++ b/test-runner/src/android/test/IsolatedContext.java
@@ -17,13 +17,13 @@
package android.test;
import android.accounts.AccountManager;
-import android.content.ContextWrapper;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.content.Context;
-import android.content.ServiceConnection;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.test.mock.MockAccountManager;
@@ -31,6 +31,7 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
/**
@@ -75,8 +76,14 @@
}
@Override
- public boolean bindIsolatedService(Intent service, ServiceConnection conn, int flags,
- String instanceName) {
+ public boolean bindService(Intent service, int flags, Executor executor,
+ ServiceConnection conn) {
+ return false;
+ }
+
+ @Override
+ public boolean bindIsolatedService(Intent service, int flags, String instanceName,
+ Executor executor, ServiceConnection conn) {
return false;
}
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
index fece8ba..5ad7fb9 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
@@ -16,6 +16,7 @@
package com.android.test.hwui;
+import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.HardwareRenderer;
@@ -23,12 +24,15 @@
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.os.Bundle;
-import android.util.Log;
+import android.os.Handler;
import android.view.SurfaceHolder;
public class CustomRenderer extends Activity {
- private RenderNode mContent = new RenderNode("CustomRenderer");
+ private RenderNode mRootNode = new RenderNode("CustomRenderer");
+ private RenderNode mChildNode = new RenderNode("RedBox");
private HardwareRenderer mRenderer = new HardwareRenderer();
+ private ObjectAnimator mAnimator;
+ private Handler mRedrawHandler = new Handler(true);
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -36,6 +40,64 @@
getWindow().takeSurface(mSurfaceCallbacks);
}
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mAnimator = ObjectAnimator.ofFloat(mChildNode, "translationY", 0, 300);
+ mAnimator.setRepeatMode(ObjectAnimator.REVERSE);
+ mAnimator.setRepeatCount(ObjectAnimator.INFINITE);
+ final Runnable redraw = this::draw;
+ mAnimator.addUpdateListener(animation -> {
+ mRedrawHandler.post(redraw);
+ });
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mAnimator.end();
+ mAnimator = null;
+ }
+
+ private void setupRoot(int width, int height) {
+ mRootNode.setPosition(0, 0, width, height);
+
+ RecordingCanvas canvas = mRootNode.beginRecording();
+ canvas.drawColor(Color.WHITE);
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setColor(Color.BLACK);
+ paint.setTextAlign(Paint.Align.CENTER);
+ float textSize = Math.min(width, height) * .05f;
+ paint.setTextSize(textSize);
+ canvas.drawText("Hello custom renderer!", width / 2, textSize * 2, paint);
+
+ canvas.translate(0, height / 4);
+ canvas.drawRenderNode(mChildNode);
+ canvas.translate(width / 2, 0);
+ canvas.drawRenderNode(mChildNode);
+ mRootNode.endRecording();
+
+ setupChild(width / 2, height / 2);
+ }
+
+ private void setupChild(int width, int height) {
+ mChildNode.setPosition(0, 0, width, height);
+ mChildNode.setScaleX(.5f);
+ mChildNode.setScaleY(.5f);
+
+ RecordingCanvas canvas = mChildNode.beginRecording();
+ canvas.drawColor(Color.RED);
+ mChildNode.endRecording();
+ }
+
+ private void draw() {
+ // Since we are constantly pumping frames between onStart & onStop we don't really
+ // care about any errors that may happen. They will self-correct.
+ mRenderer.createRenderRequest()
+ .setVsyncTime(System.nanoTime())
+ .syncAndDraw();
+ }
+
private SurfaceHolder.Callback2 mSurfaceCallbacks = new SurfaceHolder.Callback2() {
@Override
@@ -48,24 +110,14 @@
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- mContent.setLeftTopRightBottom(0, 0, width, height);
- RecordingCanvas canvas = mContent.beginRecording();
- canvas.drawColor(Color.WHITE);
- Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
- paint.setColor(Color.BLACK);
- paint.setTextAlign(Paint.Align.CENTER);
- paint.setTextSize(Math.min(width, height) * .05f);
- canvas.drawText("Hello custom renderer!", width / 2, height / 2, paint);
- mContent.endRecording();
+ setupRoot(width, height);
- mRenderer.setContentRoot(mContent);
+ mRenderer.setContentRoot(mRootNode);
mRenderer.setSurface(holder.getSurface());
- mRenderer.createRenderRequest()
- .setVsyncTime(System.nanoTime())
- .setFrameCommitCallback(Runnable::run, () -> {
- Log.d("CustomRenderer", "Frame committed!");
- })
- .syncAndDraw();
+ draw();
+ if (!mAnimator.isStarted()) {
+ mAnimator.start();
+ }
}
@Override
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index a12b0a0..fdba723 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -68,6 +68,7 @@
import android.net.INetd;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
+import android.net.ITetheringEventCallback;
import android.net.InterfaceConfiguration;
import android.net.IpPrefix;
import android.net.LinkAddress;
@@ -123,6 +124,7 @@
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Vector;
@RunWith(AndroidJUnit4.class)
@@ -918,6 +920,67 @@
expectedInteractionsWithShowNotification);
}
+ private class TestTetheringEventCallback extends ITetheringEventCallback.Stub {
+ private final ArrayList<Network> mActualUpstreams = new ArrayList<>();
+
+ public void expectUpstreamChanged(Network... networks) {
+ final ArrayList<Network> expectedUpstreams =
+ new ArrayList<Network>(Arrays.asList(networks));
+ for (Network upstream : expectedUpstreams) {
+ // throws OOB if no expectations
+ assertEquals(mActualUpstreams.remove(0), upstream);
+ }
+ assertNoCallback();
+ }
+
+ @Override
+ public void onUpstreamChanged(Network network) {
+ mActualUpstreams.add(network);
+ }
+
+ public void assertNoCallback() {
+ assertTrue(mActualUpstreams.isEmpty());
+ }
+ }
+
+ @Test
+ public void testRegisterTetheringEventCallback() throws Exception {
+ TestTetheringEventCallback callback1 = new TestTetheringEventCallback();
+ TestTetheringEventCallback callback2 = new TestTetheringEventCallback();
+
+ // 1. Register one callback and run usb tethering.
+ mTethering.registerTetheringEventCallback(callback1);
+ mLooper.dispatchAll();
+ callback1.expectUpstreamChanged(new Network[] {null});
+ NetworkState upstreamState = buildMobileDualStackUpstreamState();
+ runUsbTethering(upstreamState);
+ callback1.expectUpstreamChanged(upstreamState.network);
+ // 2. Register second callback.
+ mTethering.registerTetheringEventCallback(callback2);
+ mLooper.dispatchAll();
+ callback2.expectUpstreamChanged(upstreamState.network);
+ // 3. Disable usb tethering.
+ mTethering.stopTethering(TETHERING_USB);
+ mLooper.dispatchAll();
+ sendUsbBroadcast(false, false, false);
+ mLooper.dispatchAll();
+ callback1.expectUpstreamChanged(new Network[] {null});
+ callback2.expectUpstreamChanged(new Network[] {null});
+ // 4. Unregister first callback and run hotspot.
+ mTethering.unregisterTetheringEventCallback(callback1);
+ mLooper.dispatchAll();
+ when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
+ when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
+ .thenReturn(upstreamState);
+ when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
+ mTethering.startTethering(TETHERING_WIFI, null, false);
+ mLooper.dispatchAll();
+ mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true);
+ sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED);
+ mLooper.dispatchAll();
+ callback1.assertNoCallback();
+ callback2.expectUpstreamChanged(upstreamState.network);
+ }
// TODO: Test that a request for hotspot mode doesn't interfere with an
// already operating tethering mode interface.
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 6dd838c..4fd00f7 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -3604,7 +3604,7 @@
android.Manifest.permission.NETWORK_SETUP_WIZARD,
android.Manifest.permission.NETWORK_STACK
})
- public void connect(WifiConfiguration config, ActionListener listener) {
+ public void connect(@NonNull WifiConfiguration config, @Nullable ActionListener listener) {
if (config == null) throw new IllegalArgumentException("config cannot be null");
// Use INVALID_NETWORK_ID for arg1 when passing a config object
// arg1 is used to pass network id when the network already exists
@@ -3630,7 +3630,7 @@
android.Manifest.permission.NETWORK_SETUP_WIZARD,
android.Manifest.permission.NETWORK_STACK
})
- public void connect(int networkId, ActionListener listener) {
+ public void connect(int networkId, @Nullable ActionListener listener) {
if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative");
getChannel().sendMessage(CONNECT_NETWORK, networkId, putListener(listener));
}
@@ -3661,7 +3661,7 @@
android.Manifest.permission.NETWORK_SETUP_WIZARD,
android.Manifest.permission.NETWORK_STACK
})
- public void save(WifiConfiguration config, ActionListener listener) {
+ public void save(@NonNull WifiConfiguration config, @Nullable ActionListener listener) {
if (config == null) throw new IllegalArgumentException("config cannot be null");
getChannel().sendMessage(SAVE_NETWORK, 0, putListener(listener), config);
}
@@ -3685,7 +3685,7 @@
android.Manifest.permission.NETWORK_SETUP_WIZARD,
android.Manifest.permission.NETWORK_STACK
})
- public void forget(int netId, ActionListener listener) {
+ public void forget(int netId, @Nullable ActionListener listener) {
if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
getChannel().sendMessage(FORGET_NETWORK, netId, putListener(listener));
}
@@ -3705,7 +3705,7 @@
android.Manifest.permission.NETWORK_SETUP_WIZARD,
android.Manifest.permission.NETWORK_STACK
})
- public void disable(int netId, ActionListener listener) {
+ public void disable(int netId, @Nullable ActionListener listener) {
if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
getChannel().sendMessage(DISABLE_NETWORK, netId, putListener(listener));
}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
index 358bf31..8b56b3f 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -408,7 +408,7 @@
* @return Instance of {@link NetworkSpecifier}.
* @throws IllegalStateException on invalid params set.
*/
- public @NonNull NetworkSpecifier build() {
+ public @NonNull WifiNetworkSpecifier build() {
if (!hasSetAnyPattern()) {
throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/"
+ "setBssid should be invoked for specifier");