Merge "Use opPackageName to filter accounts in getAccountsAsUserForPakage method."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 71e6af7..e728897 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -242,7 +242,7 @@
$(call add-clean-step, rm -f $(OUT_DIR)/target/common/obj/APPS/FeatureSplit2_intermediates/src/com/android/test/split/feature/R.java)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/hardware)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/core/java/android/os/storage/*)
-
+$(call add-clean-step, rm -rf $(OUT_DIR)/host/common/obj/JAVA_LIBRARIES/platformprotos_intermediates)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
# ******************************************************************
diff --git a/api/current.txt b/api/current.txt
index 6a62fde..4981c43 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -20,6 +20,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
@@ -298,8 +299,6 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
- field public static final int autoFillHint = 16844121; // 0x1010559
- field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -312,6 +311,8 @@
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
+ field public static final int autofillHint = 16844121; // 0x1010559
+ field public static final int autofillMode = 16844116; // 0x1010554
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -1051,6 +1052,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
field public static final int reparentWithOverlay = 16843965; // 0x10104bd
@@ -1778,6 +1780,7 @@
public static final class R.id {
ctor public R.id();
field public static final int accessibilityActionContextClick = 16908348; // 0x102003c
+ field public static final int accessibilityActionMoveWindow = 16908354; // 0x1020042
field public static final int accessibilityActionScrollDown = 16908346; // 0x102003a
field public static final int accessibilityActionScrollLeft = 16908345; // 0x1020039
field public static final int accessibilityActionScrollRight = 16908347; // 0x102003b
@@ -6551,9 +6554,12 @@
public class AssistStructure implements android.os.Parcelable {
ctor public AssistStructure();
method public int describeContents();
+ method public long getAcquisitionEndTime();
+ method public long getAcquisitionStartTime();
method public android.content.ComponentName getActivityComponent();
method public android.app.assist.AssistStructure.WindowNode getWindowNodeAt(int);
method public int getWindowNodeCount();
+ method public boolean isHomeActivity();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.assist.AssistStructure> CREATOR;
}
@@ -6561,11 +6567,10 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public int getAutoFillHint();
- method public android.view.autofill.AutoFillId getAutoFillId();
- method public java.lang.String[] getAutoFillOptions();
- method public deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public android.view.autofill.AutofillId getAutofillId();
+ method public java.lang.String[] getAutofillOptions();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6607,6 +6612,7 @@
method public boolean isFocusable();
method public boolean isFocused();
method public boolean isLongClickable();
+ method public boolean isOpaque();
method public boolean isSelected();
field public static final int TEXT_COLOR_UNDEFINED = 1; // 0x1
field public static final int TEXT_STYLE_BOLD = 1; // 0x1
@@ -7986,7 +7992,7 @@
public static final class AdvertisingSetParameters.Builder {
ctor public AdvertisingSetParameters.Builder();
method public android.bluetooth.le.AdvertisingSetParameters build();
- method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymouus(boolean);
+ method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymous(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setConnectable(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setIncludeTxPower(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setInterval(int);
@@ -8183,18 +8189,17 @@
package android.companion {
- public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
+ public final class AssociationRequest implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
}
- public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
- method public android.companion.AssociationRequest<F> build();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
- method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
- method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
+ public static final class AssociationRequest.Builder {
+ ctor public AssociationRequest.Builder();
+ method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
+ method public android.companion.AssociationRequest build();
+ method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
}
public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8213,6 +8218,7 @@
public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
+ method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
}
@@ -8221,11 +8227,13 @@
ctor public BluetoothLEDeviceFilter.Builder();
method public android.companion.BluetoothLEDeviceFilter build();
method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
- method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
+ method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
method public void disassociate(java.lang.String);
method public java.util.List<java.lang.String> getAssociations();
field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8240,6 +8248,18 @@
public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
}
+ public final class WifiDeviceFilter implements android.companion.DeviceFilter {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
+ }
+
+ public static final class WifiDeviceFilter.Builder {
+ ctor public WifiDeviceFilter.Builder();
+ method public android.companion.WifiDeviceFilter build();
+ method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ }
+
}
package android.content {
@@ -8803,7 +8823,9 @@
method public abstract deprecated android.graphics.drawable.Drawable peekWallpaper();
method public void registerComponentCallbacks(android.content.ComponentCallbacks);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public abstract deprecated void removeStickyBroadcast(android.content.Intent);
method public abstract deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public abstract void revokeUriPermission(android.net.Uri, int);
@@ -8992,7 +9014,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public deprecated android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public deprecated void removeStickyBroadcast(android.content.Intent);
method public deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -9250,8 +9274,8 @@
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
field public static final java.lang.String ACTION_DIAL = "android.intent.action.DIAL";
field public static final java.lang.String ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
field public static final java.lang.String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
@@ -9495,6 +9519,7 @@
field public static final int FLAG_RECEIVER_NO_ABORT = 134217728; // 0x8000000
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
+ field public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 2097152; // 0x200000
field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
field public static final int URI_ALLOW_UNSAFE = 4; // 0x4
field public static final int URI_ANDROID_APP_SCHEME = 2; // 0x2
@@ -12504,6 +12529,7 @@
public class BitmapShader extends android.graphics.Shader {
ctor public BitmapShader(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
+ method public void set(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
}
public class BlurMaskFilter extends android.graphics.MaskFilter {
@@ -12905,6 +12931,8 @@
public class ComposeShader extends android.graphics.Shader {
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
}
public class CornerPathEffect extends android.graphics.PathEffect {
@@ -12980,6 +13008,8 @@
public class LinearGradient extends android.graphics.Shader {
ctor public LinearGradient(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public LinearGradient(float, float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int, int, android.graphics.Shader.TileMode);
}
public class MaskFilter {
@@ -13498,6 +13528,8 @@
public class RadialGradient extends android.graphics.Shader {
ctor public RadialGradient(float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public RadialGradient(float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int, int, android.graphics.Shader.TileMode);
}
public final class Rect implements android.os.Parcelable {
@@ -13637,7 +13669,7 @@
}
public class Shader {
- ctor public Shader();
+ ctor public deprecated Shader();
method public boolean getLocalMatrix(android.graphics.Matrix);
method public void setLocalMatrix(android.graphics.Matrix);
}
@@ -13682,6 +13714,8 @@
public class SweepGradient extends android.graphics.Shader {
ctor public SweepGradient(float, float, int[], float[]);
ctor public SweepGradient(float, float, int, int);
+ method public void set(float, float, int[], float[]);
+ method public void set(float, float, int, int);
}
public class Typeface {
@@ -13709,9 +13743,12 @@
public static abstract interface Typeface.FontRequestCallback {
method public abstract void onTypefaceRequestFailed(int);
method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = 1; // 0x1
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 2; // 0x2
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = 0; // 0x0
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
}
public class Xfermode {
@@ -20986,7 +21023,7 @@
}
public class AudioManager {
- method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public deprecated int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
@@ -21023,7 +21060,7 @@
method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent);
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
- method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public deprecated int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
method public int requestAudioFocus(android.media.AudioFocusRequest);
method public deprecated void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
@@ -25146,7 +25183,9 @@
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
+ method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
+ method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent);
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
@@ -25155,6 +25194,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -26134,6 +26175,16 @@
package android.net.wifi {
+ public final class IconInfo implements android.os.Parcelable {
+ ctor public IconInfo(java.lang.String, byte[]);
+ ctor public IconInfo(android.net.wifi.IconInfo);
+ method public int describeContents();
+ method public byte[] getData();
+ method public java.lang.String getFilename();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.wifi.IconInfo> CREATOR;
+ }
+
public class ScanResult implements android.os.Parcelable {
method public int describeContents();
method public boolean is80211mcResponder();
@@ -26333,7 +26384,7 @@
public class WifiManager {
method public int addNetwork(android.net.wifi.WifiConfiguration);
- method public boolean addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
+ method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public static int calculateSignalLevel(int, int);
method public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
method public static int compareSignalLevel(int, int);
@@ -26362,7 +26413,7 @@
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
- method public boolean removePasspointConfiguration(java.lang.String);
+ method public void removePasspointConfiguration(java.lang.String);
method public deprecated boolean saveConfiguration();
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
@@ -26377,26 +26428,21 @@
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
+ field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
+ field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
+ field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
+ field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
+ field public static final java.lang.String EXTRA_ICON_INFO = "android.net.wifi.extra.ICON_INFO";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_BSSID = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_ESS = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_ESS";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REASON_URL = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REASON_URL";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_BSSID = "android.net.wifi.extra.PASSPOINT_ICON_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_DATA = "android.net.wifi.extra.PASSPOINT_ICON_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_FILENAME = "android.net.wifi.extra.PASSPOINT_ICON_FILENAME";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_BSSID = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_DATA = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
+ field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -26479,7 +26525,8 @@
}
public class DiscoverySession {
- method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
+ method public java.lang.String createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -26567,7 +26614,8 @@
}
public class WifiAwareSession {
- method public java.lang.String createNetworkSpecifier(int, byte[], byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(int, byte[]);
+ method public java.lang.String createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
@@ -26613,7 +26661,6 @@
method public void setUsageLimitStartTimeInMs(long);
method public void setUsageLimitTimeLimitInMinutes(long);
method public void setUsageLimitUsageTimePeriodInMinutes(long);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -26654,7 +26701,6 @@
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential> CREATOR;
}
@@ -26667,7 +26713,6 @@
method public java.lang.String getCertType();
method public void setCertSha256Fingerprint(byte[]);
method public void setCertType(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR;
}
@@ -26680,7 +26725,6 @@
method public java.lang.String getImsi();
method public void setEapType(int);
method public void setImsi(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR;
}
@@ -26703,7 +26747,6 @@
method public void setPassword(java.lang.String);
method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
}
@@ -26728,7 +26771,6 @@
method public void setMatchAnyOis(long[]);
method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
@@ -26755,7 +26797,6 @@
method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
}
@@ -26772,7 +26813,6 @@
method public void setFqdn(java.lang.String);
method public void setFqdnExactMatch(boolean);
method public void setPriority(int);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
}
@@ -26797,7 +26837,6 @@
method public void setUpdateIntervalInMinutes(long);
method public void setUpdateMethod(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
@@ -31878,6 +31917,7 @@
method public boolean hasKey();
method public boolean isEnabled();
method public boolean isPersistent();
+ method public boolean isRecycleEnabled();
method public boolean isSelectable();
method protected void notifyChanged();
method public void notifyDependencyChange(boolean);
@@ -31917,6 +31957,7 @@
method public void setOrder(int);
method public void setPersistent(boolean);
method public void setPreferenceDataStore(android.preference.PreferenceDataStore);
+ method public void setRecycleEnabled(boolean);
method public void setSelectable(boolean);
method public void setShouldDisableView(boolean);
method public void setSummary(java.lang.CharSequence);
@@ -34086,21 +34127,21 @@
method public static android.net.Uri buildRootsUri(java.lang.String);
method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
method public static android.net.Uri buildTreeDocumentUri(java.lang.String, java.lang.String);
- method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
- method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle);
- method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
- method public static java.util.List<java.lang.String> findDocumentPath(android.content.ContentResolver, android.net.Uri);
+ method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+ method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
+ method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
method public static java.lang.String getDocumentId(android.net.Uri);
- method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
+ method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
method public static java.lang.String getRootId(android.net.Uri);
method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
method public static java.lang.String getTreeDocumentId(android.net.Uri);
method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
method public static boolean isTreeUri(android.net.Uri);
- method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri);
- method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String);
+ method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
field public static final java.lang.String ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
field public static final java.lang.String EXTRA_ERROR = "error";
field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF";
@@ -34206,6 +34247,11 @@
public static final class FontsContract.Columns implements android.provider.BaseColumns {
ctor public FontsContract.Columns();
+ field public static final java.lang.String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
field public static final java.lang.String STYLE = "font_style";
field public static final java.lang.String TTC_INDEX = "font_ttc_index";
field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
@@ -34603,6 +34649,7 @@
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
+ field public static final java.lang.String ACTION_NIGHT_DISPLAY_SETTINGS = "android.settings.NIGHT_DISPLAY_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
@@ -36688,15 +36735,15 @@
package android.service.autofill {
- public abstract class AutoFillService extends android.app.Service {
- ctor public AutoFillService();
+ public abstract class AutofillService extends android.app.Service {
+ ctor public AutofillService();
method public final void disableSelf();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -36710,7 +36757,7 @@
ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue);
}
public final class FillCallback {
@@ -36750,7 +36797,7 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int);
- method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutofillId...);
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
@@ -39788,7 +39835,7 @@
method public int getSimState();
method public int getSimState(int);
method public java.lang.String getSubscriberId();
- method public java.lang.String getVisualVoicemailPackageName(android.telecom.PhoneAccountHandle);
+ method public java.lang.String getVisualVoicemailPackageName();
method public java.lang.String getVoiceMailAlphaTag();
method public java.lang.String getVoiceMailNumber();
method public int getVoiceNetworkType();
@@ -39928,9 +39975,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.VisualVoicemailSmsFilterSettings> CREATOR;
- field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM";
- field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff
- field public static final java.util.List<java.lang.String> DEFAULT_ORIGINATING_NUMBERS;
field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff
field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe
field public final java.lang.String clientPrefix;
@@ -40459,7 +40503,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public void removeStickyBroadcast(android.content.Intent);
method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -44961,8 +45007,8 @@
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
- method public void autoFill(android.view.autofill.AutoFillValue);
- method public void autoFillVirtual(int, android.view.autofill.AutoFillValue);
+ method public void autofill(android.view.autofill.AutofillValue);
+ method public void autofillVirtual(int, android.view.autofill.AutofillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -45016,7 +45062,7 @@
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public void dispatchPointerCaptureChanged(boolean);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
@@ -45052,11 +45098,10 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
- method public int getAutoFillHint();
- method public int getAutoFillMode();
- method public final deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public int getAutofillHint();
+ method public int getAutofillMode();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -45142,7 +45187,7 @@
method public float getPivotX();
method public float getPivotY();
method public android.view.PointerIcon getPointerIcon();
- method public int getResolvedAutoFillMode();
+ method public int getResolvedAutofillMode();
method public android.content.res.Resources getResources();
method public final boolean getRevealOnFocusHint();
method public final int getRight();
@@ -45301,8 +45346,8 @@
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
- method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
method public void onProvideStructure(android.view.ViewStructure);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
@@ -45374,8 +45419,8 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
- method public void setAutoFillHint(int);
- method public void setAutoFillMode(int);
+ method public void setAutofillHint(int);
+ method public void setAutofillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -45517,28 +45562,28 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
+ field public static final int AUTOFILL_HINT_EMAIL_ADDRESS = 1; // 0x1
+ field public static final int AUTOFILL_HINT_NAME = 2; // 0x2
+ field public static final int AUTOFILL_HINT_NONE = 0; // 0x0
+ field public static final int AUTOFILL_HINT_PASSWORD = 8; // 0x8
+ field public static final int AUTOFILL_HINT_PHONE = 16; // 0x10
+ field public static final int AUTOFILL_HINT_POSTAL_ADDRESS = 32; // 0x20
+ field public static final int AUTOFILL_HINT_POSTAL_CODE = 64; // 0x40
+ field public static final int AUTOFILL_HINT_USERNAME = 4; // 0x4
+ field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2
field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4
field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3
field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0
field public static final int AUTOFILL_TYPE_TEXT = 1; // 0x1
field public static final int AUTOFILL_TYPE_TOGGLE = 2; // 0x2
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
- field public static final int AUTO_FILL_HINT_EMAIL_ADDRESS = 1; // 0x1
- field public static final int AUTO_FILL_HINT_NAME = 2; // 0x2
- field public static final int AUTO_FILL_HINT_NONE = 0; // 0x0
- field public static final int AUTO_FILL_HINT_PASSWORD = 8; // 0x8
- field public static final int AUTO_FILL_HINT_PHONE = 16; // 0x10
- field public static final int AUTO_FILL_HINT_POSTAL_ADDRESS = 32; // 0x20
- field public static final int AUTO_FILL_HINT_POSTAL_CODE = 64; // 0x40
- field public static final int AUTO_FILL_HINT_USERNAME = 4; // 0x4
- field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
- field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
- field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -46100,7 +46145,7 @@
method public abstract int getLayoutDirection();
method public abstract android.view.ViewParent getParent();
method public abstract android.view.ViewParent getParentForAccessibility();
- method public default int getResolvedAutoFillMode();
+ method public default int getResolvedAutofillMode();
method public abstract int getTextAlignment();
method public abstract int getTextDirection();
method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect);
@@ -46179,7 +46224,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
- method public abstract android.view.ViewStructure asyncNewChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure asyncNewChildForAutofill(int, int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -46188,15 +46233,14 @@
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
- method public abstract android.view.ViewStructure newChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure newChildForAutofill(int, int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
- method public abstract void setAutoFillHint(int);
- method public abstract void setAutoFillOptions(java.lang.String[]);
- method public abstract deprecated void setAutoFillType(android.view.autofill.AutoFillType);
- method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
+ method public abstract void setAutofillHint(int);
+ method public abstract void setAutofillOptions(java.lang.String[]);
method public abstract void setAutofillType(int);
+ method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -46213,6 +46257,7 @@
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setInputType(int);
method public abstract void setLongClickable(boolean);
+ method public abstract void setOpaque(boolean);
method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
@@ -46930,6 +46975,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -46986,6 +47033,7 @@
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_EXPAND;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_FOCUS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_LONG_CLICK;
+ field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_MOVE_WINDOW;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_PASTE;
@@ -47110,6 +47158,7 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
+ method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
@@ -47445,60 +47494,47 @@
package android.view.autofill {
- public final class AutoFillId implements android.os.Parcelable {
+ public final class AutofillId implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillId> CREATOR;
}
- public final class AutoFillManager {
- method public void registerCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void reset();
- method public void startAutoFillRequest(android.view.View);
- method public void startAutoFillRequestOnVirtualView(android.view.View, int, android.graphics.Rect);
- method public void stopAutoFillRequest(android.view.View);
- method public void stopAutoFillRequestOnVirtualView(android.view.View, int);
- method public void unregisterCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void valueChanged(android.view.View);
- method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
+ public final class AutofillManager {
+ method public void cancel();
+ method public void commit();
+ method public void notifyValueChanged(android.view.View);
+ method public void notifyViewEntered(android.view.View);
+ method public void notifyViewExited(android.view.View);
+ method public void notifyVirtualValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
+ method public void notifyVirtualViewEntered(android.view.View, int, android.graphics.Rect);
+ method public void notifyVirtualViewExited(android.view.View, int);
+ method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
+ method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
}
- public static abstract class AutoFillManager.AutofillCallback {
- ctor public AutoFillManager.AutofillCallback();
+ public static abstract class AutofillManager.AutofillCallback {
+ ctor public AutofillManager.AutofillCallback();
method public void onAutofillEvent(android.view.View, int);
method public void onAutofillEventVirtual(android.view.View, int, int);
field public static final int EVENT_INPUT_HIDDEN = 2; // 0x2
field public static final int EVENT_INPUT_SHOWN = 1; // 0x1
}
- public final class AutoFillType implements android.os.Parcelable {
+ public final class AutofillValue implements android.os.Parcelable {
method public int describeContents();
- method public static android.view.autofill.AutoFillType forDate();
- method public static android.view.autofill.AutoFillType forList();
- method public static android.view.autofill.AutoFillType forText();
- method public static android.view.autofill.AutoFillType forToggle();
- method public boolean isDate();
- method public boolean isList();
- method public boolean isText();
- method public boolean isToggle();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
- }
-
- public final class AutoFillValue implements android.os.Parcelable {
- method public int describeContents();
- method public static android.view.autofill.AutoFillValue forDate(long);
- method public static android.view.autofill.AutoFillValue forList(int);
- method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
- method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public static android.view.autofill.AutofillValue forDate(long);
+ method public static android.view.autofill.AutofillValue forList(int);
+ method public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutofillValue forToggle(boolean);
method public long getDateValue();
method public int getListValue();
method public java.lang.CharSequence getTextValue();
method public boolean getToggleValue();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillValue> CREATOR;
}
}
@@ -48766,6 +48802,7 @@
field public static final int ERROR_TIMEOUT = -8; // 0xfffffff8
field public static final int ERROR_TOO_MANY_REQUESTS = -15; // 0xfffffff1
field public static final int ERROR_UNKNOWN = -1; // 0xffffffff
+ field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 339f40b..fbfee83 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -30,6 +30,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
@@ -159,6 +160,7 @@
field public static final java.lang.String MOUNT_UNMOUNT_FILESYSTEMS = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS";
field public static final java.lang.String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
field public static final java.lang.String NFC = "android.permission.NFC";
+ field public static final java.lang.String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
field public static final java.lang.String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
field public static final java.lang.String PACKAGE_USAGE_STATS = "android.permission.PACKAGE_USAGE_STATS";
field public static final java.lang.String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
@@ -410,8 +412,6 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
- field public static final int autoFillHint = 16844121; // 0x1010559
- field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -424,6 +424,8 @@
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
+ field public static final int autofillHint = 16844121; // 0x1010559
+ field public static final int autofillMode = 16844116; // 0x1010554
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -1163,6 +1165,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
field public static final int reparentWithOverlay = 16843965; // 0x10104bd
@@ -1894,6 +1897,7 @@
public static final class R.id {
ctor public R.id();
field public static final int accessibilityActionContextClick = 16908348; // 0x102003c
+ field public static final int accessibilityActionMoveWindow = 16908354; // 0x1020042
field public static final int accessibilityActionScrollDown = 16908346; // 0x102003a
field public static final int accessibilityActionScrollLeft = 16908345; // 0x1020039
field public static final int accessibilityActionScrollRight = 16908347; // 0x102003b
@@ -6800,9 +6804,12 @@
public class AssistStructure implements android.os.Parcelable {
ctor public AssistStructure();
method public int describeContents();
+ method public long getAcquisitionEndTime();
+ method public long getAcquisitionStartTime();
method public android.content.ComponentName getActivityComponent();
method public android.app.assist.AssistStructure.WindowNode getWindowNodeAt(int);
method public int getWindowNodeCount();
+ method public boolean isHomeActivity();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.assist.AssistStructure> CREATOR;
}
@@ -6810,11 +6817,10 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public int getAutoFillHint();
- method public android.view.autofill.AutoFillId getAutoFillId();
- method public java.lang.String[] getAutoFillOptions();
- method public deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public android.view.autofill.AutofillId getAutofillId();
+ method public java.lang.String[] getAutofillOptions();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6856,6 +6862,7 @@
method public boolean isFocusable();
method public boolean isFocused();
method public boolean isLongClickable();
+ method public boolean isOpaque();
method public boolean isSelected();
field public static final int TEXT_COLOR_UNDEFINED = 1; // 0x1
field public static final int TEXT_STYLE_BOLD = 1; // 0x1
@@ -8464,7 +8471,7 @@
public static final class AdvertisingSetParameters.Builder {
ctor public AdvertisingSetParameters.Builder();
method public android.bluetooth.le.AdvertisingSetParameters build();
- method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymouus(boolean);
+ method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymous(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setConnectable(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setIncludeTxPower(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setInterval(int);
@@ -8683,18 +8690,17 @@
package android.companion {
- public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
+ public final class AssociationRequest implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
}
- public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
- method public android.companion.AssociationRequest<F> build();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
- method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
- method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
+ public static final class AssociationRequest.Builder {
+ ctor public AssociationRequest.Builder();
+ method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
+ method public android.companion.AssociationRequest build();
+ method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
}
public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8713,6 +8719,7 @@
public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
+ method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
}
@@ -8721,11 +8728,13 @@
ctor public BluetoothLEDeviceFilter.Builder();
method public android.companion.BluetoothLEDeviceFilter build();
method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
- method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
+ method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
method public void disassociate(java.lang.String);
method public java.util.List<java.lang.String> getAssociations();
field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8740,6 +8749,18 @@
public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
}
+ public final class WifiDeviceFilter implements android.companion.DeviceFilter {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
+ }
+
+ public static final class WifiDeviceFilter.Builder {
+ ctor public WifiDeviceFilter.Builder();
+ method public android.companion.WifiDeviceFilter build();
+ method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ }
+
}
package android.content {
@@ -9307,7 +9328,9 @@
method public abstract deprecated android.graphics.drawable.Drawable peekWallpaper();
method public void registerComponentCallbacks(android.content.ComponentCallbacks);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public abstract deprecated void removeStickyBroadcast(android.content.Intent);
method public abstract deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public abstract void revokeUriPermission(android.net.Uri, int);
@@ -9510,7 +9533,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public deprecated android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public deprecated void removeStickyBroadcast(android.content.Intent);
method public deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -9771,8 +9796,8 @@
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
field public static final java.lang.String ACTION_DIAL = "android.intent.action.DIAL";
field public static final java.lang.String ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
field public static final java.lang.String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
@@ -10035,6 +10060,7 @@
field public static final int FLAG_RECEIVER_NO_ABORT = 134217728; // 0x8000000
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
+ field public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 2097152; // 0x200000
field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
field public static final int URI_ALLOW_UNSAFE = 4; // 0x4
field public static final int URI_ANDROID_APP_SCHEME = 2; // 0x2
@@ -13240,6 +13266,7 @@
public class BitmapShader extends android.graphics.Shader {
ctor public BitmapShader(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
+ method public void set(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
}
public class BlurMaskFilter extends android.graphics.MaskFilter {
@@ -13641,6 +13668,8 @@
public class ComposeShader extends android.graphics.Shader {
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
}
public class CornerPathEffect extends android.graphics.PathEffect {
@@ -13716,6 +13745,8 @@
public class LinearGradient extends android.graphics.Shader {
ctor public LinearGradient(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public LinearGradient(float, float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int, int, android.graphics.Shader.TileMode);
}
public class MaskFilter {
@@ -14234,6 +14265,8 @@
public class RadialGradient extends android.graphics.Shader {
ctor public RadialGradient(float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public RadialGradient(float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int, int, android.graphics.Shader.TileMode);
}
public final class Rect implements android.os.Parcelable {
@@ -14373,7 +14406,7 @@
}
public class Shader {
- ctor public Shader();
+ ctor public deprecated Shader();
method public boolean getLocalMatrix(android.graphics.Matrix);
method public void setLocalMatrix(android.graphics.Matrix);
}
@@ -14418,6 +14451,8 @@
public class SweepGradient extends android.graphics.Shader {
ctor public SweepGradient(float, float, int[], float[]);
ctor public SweepGradient(float, float, int, int);
+ method public void set(float, float, int[], float[]);
+ method public void set(float, float, int, int);
}
public class Typeface {
@@ -14445,9 +14480,12 @@
public static abstract interface Typeface.FontRequestCallback {
method public abstract void onTypefaceRequestFailed(int);
method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = 1; // 0x1
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 2; // 0x2
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = 0; // 0x0
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
}
public class Xfermode {
@@ -22750,7 +22788,7 @@
}
public class AudioManager {
- method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public deprecated int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
@@ -22790,7 +22828,7 @@
method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent);
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
- method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public deprecated int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
method public int requestAudioFocus(android.media.AudioFocusRequest);
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
@@ -26957,7 +26995,6 @@
method public android.metrics.LogMaker clearPackageName();
method public android.metrics.LogMaker clearSubtype();
method public android.metrics.LogMaker clearTaggedData(int);
- method public android.metrics.LogMaker clearTimestamp();
method public android.metrics.LogMaker clearType();
method public void deserialize(java.lang.Object[]);
method public int getCategory();
@@ -26965,6 +27002,7 @@
method public java.lang.String getCounterName();
method public int getCounterValue();
method public java.lang.String getPackageName();
+ method public int getProcessId();
method public int getSubtype();
method public java.lang.Object getTaggedData(int);
method public long getTimestamp();
@@ -26974,13 +27012,8 @@
method public boolean isValidValue(java.lang.Object);
method public java.lang.Object[] serialize();
method public android.metrics.LogMaker setCategory(int);
- method public android.metrics.LogMaker setCounterBucket(int);
- method public android.metrics.LogMaker setCounterBucket(long);
- method public android.metrics.LogMaker setCounterName(java.lang.String);
- method public android.metrics.LogMaker setCounterValue(int);
method public android.metrics.LogMaker setPackageName(java.lang.String);
method public android.metrics.LogMaker setSubtype(int);
- method public android.metrics.LogMaker setTimestamp(long);
method public android.metrics.LogMaker setType(int);
}
@@ -27269,7 +27302,9 @@
method public static deprecated boolean isNetworkTypeValid(int);
method public boolean isTetheringSupported();
method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
+ method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
+ method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent);
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
@@ -27278,6 +27313,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -27684,7 +27721,6 @@
method public boolean clearScores() throws java.lang.SecurityException;
method public void disableScoring() throws java.lang.SecurityException;
method public java.lang.String getActiveScorerPackage();
- method public android.net.RecommendationResult requestRecommendation(android.net.RecommendationRequest) throws java.lang.SecurityException;
method public boolean setActiveScorer(java.lang.String) throws java.lang.SecurityException;
method public boolean updateScores(android.net.ScoredNetwork[]) throws java.lang.SecurityException;
field public static final java.lang.String ACTION_CHANGE_ACTIVE = "android.net.scoring.CHANGE_ACTIVE";
@@ -28427,6 +28463,16 @@
field public boolean truncated;
}
+ public final class IconInfo implements android.os.Parcelable {
+ ctor public IconInfo(java.lang.String, byte[]);
+ ctor public IconInfo(android.net.wifi.IconInfo);
+ method public int describeContents();
+ method public byte[] getData();
+ method public java.lang.String getFilename();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.wifi.IconInfo> CREATOR;
+ }
+
public class RttManager {
method public void disableResponder(android.net.wifi.RttManager.ResponderCallback);
method public void enableResponder(android.net.wifi.RttManager.ResponderCallback);
@@ -28853,7 +28899,7 @@
public class WifiManager {
method public int addNetwork(android.net.wifi.WifiConfiguration);
- method public boolean addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
+ method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public static int calculateSignalLevel(int, int);
method public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
method public static int compareSignalLevel(int, int);
@@ -28893,7 +28939,7 @@
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
- method public boolean removePasspointConfiguration(java.lang.String);
+ method public void removePasspointConfiguration(java.lang.String);
method public deprecated boolean saveConfiguration();
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
@@ -28916,29 +28962,24 @@
field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
field public static final java.lang.String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
+ field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
+ field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
field public static final java.lang.String EXTRA_CHANGE_REASON = "changeReason";
+ field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
+ field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
+ field public static final java.lang.String EXTRA_ICON_INFO = "android.net.wifi.extra.ICON_INFO";
field public static final java.lang.String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_BSSID = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_ESS = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_ESS";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REASON_URL = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REASON_URL";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_BSSID = "android.net.wifi.extra.PASSPOINT_ICON_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_DATA = "android.net.wifi.extra.PASSPOINT_ICON_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_FILENAME = "android.net.wifi.extra.PASSPOINT_ICON_FILENAME";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_BSSID = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_DATA = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
+ field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_AP_STATE = "wifi_state";
field public static final java.lang.String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
field public static final java.lang.String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
@@ -29179,7 +29220,9 @@
}
public class DiscoverySession {
- method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
+ method public java.lang.String createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
+ method public java.lang.String createNetworkSpecifierPmk(android.net.wifi.aware.PeerHandle, byte[]);
method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -29267,7 +29310,9 @@
}
public class WifiAwareSession {
- method public java.lang.String createNetworkSpecifier(int, byte[], byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(int, byte[]);
+ method public java.lang.String createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
+ method public java.lang.String createNetworkSpecifierPmk(int, byte[], byte[]);
method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
@@ -29313,7 +29358,6 @@
method public void setUsageLimitStartTimeInMs(long);
method public void setUsageLimitTimeLimitInMinutes(long);
method public void setUsageLimitUsageTimePeriodInMinutes(long);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -29354,7 +29398,6 @@
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential> CREATOR;
}
@@ -29367,7 +29410,6 @@
method public java.lang.String getCertType();
method public void setCertSha256Fingerprint(byte[]);
method public void setCertType(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR;
}
@@ -29380,7 +29422,6 @@
method public java.lang.String getImsi();
method public void setEapType(int);
method public void setImsi(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR;
}
@@ -29403,7 +29444,6 @@
method public void setPassword(java.lang.String);
method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
}
@@ -29428,7 +29468,6 @@
method public void setMatchAnyOis(long[]);
method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
@@ -29455,7 +29494,6 @@
method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
}
@@ -29472,7 +29510,6 @@
method public void setFqdn(java.lang.String);
method public void setFqdnExactMatch(boolean);
method public void setPriority(int);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
}
@@ -29497,7 +29534,6 @@
method public void setUpdateIntervalInMinutes(long);
method public void setUpdateMethod(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
@@ -34729,6 +34765,7 @@
method public boolean hasKey();
method public boolean isEnabled();
method public boolean isPersistent();
+ method public boolean isRecycleEnabled();
method public boolean isSelectable();
method protected void notifyChanged();
method public void notifyDependencyChange(boolean);
@@ -34768,6 +34805,7 @@
method public void setOrder(int);
method public void setPersistent(boolean);
method public void setPreferenceDataStore(android.preference.PreferenceDataStore);
+ method public void setRecycleEnabled(boolean);
method public void setSelectable(boolean);
method public void setShouldDisableView(boolean);
method public void setSummary(java.lang.CharSequence);
@@ -36993,21 +37031,21 @@
method public static android.net.Uri buildRootsUri(java.lang.String);
method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
method public static android.net.Uri buildTreeDocumentUri(java.lang.String, java.lang.String);
- method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
- method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle);
- method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
- method public static java.util.List<java.lang.String> findDocumentPath(android.content.ContentResolver, android.net.Uri);
+ method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+ method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
+ method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
method public static java.lang.String getDocumentId(android.net.Uri);
- method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
+ method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
method public static java.lang.String getRootId(android.net.Uri);
method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
method public static java.lang.String getTreeDocumentId(android.net.Uri);
method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
method public static boolean isTreeUri(android.net.Uri);
- method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri);
- method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String);
+ method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
field public static final java.lang.String ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
field public static final java.lang.String EXTRA_ERROR = "error";
field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF";
@@ -37113,6 +37151,11 @@
public static final class FontsContract.Columns implements android.provider.BaseColumns {
ctor public FontsContract.Columns();
+ field public static final java.lang.String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
field public static final java.lang.String STYLE = "font_style";
field public static final java.lang.String TTC_INDEX = "font_ttc_index";
field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
@@ -37614,6 +37657,7 @@
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
+ field public static final java.lang.String ACTION_NIGHT_DISPLAY_SETTINGS = "android.settings.NIGHT_DISPLAY_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
@@ -39723,15 +39767,15 @@
package android.service.autofill {
- public abstract class AutoFillService extends android.app.Service {
- ctor public AutoFillService();
+ public abstract class AutofillService extends android.app.Service {
+ ctor public AutofillService();
method public final void disableSelf();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -39745,7 +39789,7 @@
ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue);
}
public final class FillCallback {
@@ -39785,7 +39829,7 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int);
- method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutofillId...);
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
@@ -43193,7 +43237,7 @@
method public int getSimState(int);
method public java.lang.String getSubscriberId();
method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
- method public java.lang.String getVisualVoicemailPackageName(android.telecom.PhoneAccountHandle);
+ method public java.lang.String getVisualVoicemailPackageName();
method public java.lang.String getVoiceMailAlphaTag();
method public java.lang.String getVoiceMailNumber();
method public int getVoiceNetworkType();
@@ -43359,9 +43403,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.VisualVoicemailSmsFilterSettings> CREATOR;
- field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM";
- field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff
- field public static final java.util.List<java.lang.String> DEFAULT_ORIGINATING_NUMBERS;
field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff
field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe
field public final java.lang.String clientPrefix;
@@ -43902,7 +43943,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public void removeStickyBroadcast(android.content.Intent);
method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -48423,8 +48466,8 @@
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
- method public void autoFill(android.view.autofill.AutoFillValue);
- method public void autoFillVirtual(int, android.view.autofill.AutoFillValue);
+ method public void autofill(android.view.autofill.AutofillValue);
+ method public void autofillVirtual(int, android.view.autofill.AutofillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -48478,7 +48521,7 @@
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public void dispatchPointerCaptureChanged(boolean);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
@@ -48514,11 +48557,10 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
- method public int getAutoFillHint();
- method public int getAutoFillMode();
- method public final deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public int getAutofillHint();
+ method public int getAutofillMode();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -48604,7 +48646,7 @@
method public float getPivotX();
method public float getPivotY();
method public android.view.PointerIcon getPointerIcon();
- method public int getResolvedAutoFillMode();
+ method public int getResolvedAutofillMode();
method public android.content.res.Resources getResources();
method public final boolean getRevealOnFocusHint();
method public final int getRight();
@@ -48763,8 +48805,8 @@
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
- method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
method public void onProvideStructure(android.view.ViewStructure);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
@@ -48836,8 +48878,8 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
- method public void setAutoFillHint(int);
- method public void setAutoFillMode(int);
+ method public void setAutofillHint(int);
+ method public void setAutofillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -48979,28 +49021,28 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
+ field public static final int AUTOFILL_HINT_EMAIL_ADDRESS = 1; // 0x1
+ field public static final int AUTOFILL_HINT_NAME = 2; // 0x2
+ field public static final int AUTOFILL_HINT_NONE = 0; // 0x0
+ field public static final int AUTOFILL_HINT_PASSWORD = 8; // 0x8
+ field public static final int AUTOFILL_HINT_PHONE = 16; // 0x10
+ field public static final int AUTOFILL_HINT_POSTAL_ADDRESS = 32; // 0x20
+ field public static final int AUTOFILL_HINT_POSTAL_CODE = 64; // 0x40
+ field public static final int AUTOFILL_HINT_USERNAME = 4; // 0x4
+ field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2
field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4
field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3
field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0
field public static final int AUTOFILL_TYPE_TEXT = 1; // 0x1
field public static final int AUTOFILL_TYPE_TOGGLE = 2; // 0x2
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
- field public static final int AUTO_FILL_HINT_EMAIL_ADDRESS = 1; // 0x1
- field public static final int AUTO_FILL_HINT_NAME = 2; // 0x2
- field public static final int AUTO_FILL_HINT_NONE = 0; // 0x0
- field public static final int AUTO_FILL_HINT_PASSWORD = 8; // 0x8
- field public static final int AUTO_FILL_HINT_PHONE = 16; // 0x10
- field public static final int AUTO_FILL_HINT_POSTAL_ADDRESS = 32; // 0x20
- field public static final int AUTO_FILL_HINT_POSTAL_CODE = 64; // 0x40
- field public static final int AUTO_FILL_HINT_USERNAME = 4; // 0x4
- field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
- field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
- field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -49562,7 +49604,7 @@
method public abstract int getLayoutDirection();
method public abstract android.view.ViewParent getParent();
method public abstract android.view.ViewParent getParentForAccessibility();
- method public default int getResolvedAutoFillMode();
+ method public default int getResolvedAutofillMode();
method public abstract int getTextAlignment();
method public abstract int getTextDirection();
method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect);
@@ -49641,7 +49683,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
- method public abstract android.view.ViewStructure asyncNewChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure asyncNewChildForAutofill(int, int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -49650,15 +49692,14 @@
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
- method public abstract android.view.ViewStructure newChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure newChildForAutofill(int, int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
- method public abstract void setAutoFillHint(int);
- method public abstract void setAutoFillOptions(java.lang.String[]);
- method public abstract deprecated void setAutoFillType(android.view.autofill.AutoFillType);
- method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
+ method public abstract void setAutofillHint(int);
+ method public abstract void setAutofillOptions(java.lang.String[]);
method public abstract void setAutofillType(int);
+ method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -49675,6 +49716,7 @@
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setInputType(int);
method public abstract void setLongClickable(boolean);
+ method public abstract void setOpaque(boolean);
method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
@@ -50395,6 +50437,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -50451,6 +50495,7 @@
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_EXPAND;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_FOCUS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_LONG_CLICK;
+ field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_MOVE_WINDOW;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_PASTE;
@@ -50575,6 +50620,7 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
+ method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
@@ -50910,60 +50956,47 @@
package android.view.autofill {
- public final class AutoFillId implements android.os.Parcelable {
+ public final class AutofillId implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillId> CREATOR;
}
- public final class AutoFillManager {
- method public void registerCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void reset();
- method public void startAutoFillRequest(android.view.View);
- method public void startAutoFillRequestOnVirtualView(android.view.View, int, android.graphics.Rect);
- method public void stopAutoFillRequest(android.view.View);
- method public void stopAutoFillRequestOnVirtualView(android.view.View, int);
- method public void unregisterCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void valueChanged(android.view.View);
- method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
+ public final class AutofillManager {
+ method public void cancel();
+ method public void commit();
+ method public void notifyValueChanged(android.view.View);
+ method public void notifyViewEntered(android.view.View);
+ method public void notifyViewExited(android.view.View);
+ method public void notifyVirtualValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
+ method public void notifyVirtualViewEntered(android.view.View, int, android.graphics.Rect);
+ method public void notifyVirtualViewExited(android.view.View, int);
+ method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
+ method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
}
- public static abstract class AutoFillManager.AutofillCallback {
- ctor public AutoFillManager.AutofillCallback();
+ public static abstract class AutofillManager.AutofillCallback {
+ ctor public AutofillManager.AutofillCallback();
method public void onAutofillEvent(android.view.View, int);
method public void onAutofillEventVirtual(android.view.View, int, int);
field public static final int EVENT_INPUT_HIDDEN = 2; // 0x2
field public static final int EVENT_INPUT_SHOWN = 1; // 0x1
}
- public final class AutoFillType implements android.os.Parcelable {
+ public final class AutofillValue implements android.os.Parcelable {
method public int describeContents();
- method public static android.view.autofill.AutoFillType forDate();
- method public static android.view.autofill.AutoFillType forList();
- method public static android.view.autofill.AutoFillType forText();
- method public static android.view.autofill.AutoFillType forToggle();
- method public boolean isDate();
- method public boolean isList();
- method public boolean isText();
- method public boolean isToggle();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
- }
-
- public final class AutoFillValue implements android.os.Parcelable {
- method public int describeContents();
- method public static android.view.autofill.AutoFillValue forDate(long);
- method public static android.view.autofill.AutoFillValue forList(int);
- method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
- method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public static android.view.autofill.AutofillValue forDate(long);
+ method public static android.view.autofill.AutofillValue forList(int);
+ method public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutofillValue forToggle(boolean);
method public long getDateValue();
method public int getListValue();
method public java.lang.CharSequence getTextValue();
method public boolean getToggleValue();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillValue> CREATOR;
}
}
@@ -52356,6 +52389,7 @@
field public static final int ERROR_TIMEOUT = -8; // 0xfffffff8
field public static final int ERROR_TOO_MANY_REQUESTS = -15; // 0xfffffff1
field public static final int ERROR_UNKNOWN = -1; // 0xffffffff
+ field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
}
@@ -52572,7 +52606,7 @@
method public abstract boolean onKeyUp(int, android.view.KeyEvent);
method public abstract void onMeasure(int, int);
method public abstract void onOverScrolled(int, int, boolean, boolean);
- method public default void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public default void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
method public abstract void onProvideVirtualStructure(android.view.ViewStructure);
method public abstract void onScrollChanged(int, int, int, int);
method public abstract void onSizeChanged(int, int, int, int);
diff --git a/api/test-current.txt b/api/test-current.txt
index fc96532..3be7f67 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -20,6 +20,7 @@
field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS";
field public static final java.lang.String BIND_ACCESSIBILITY_SERVICE = "android.permission.BIND_ACCESSIBILITY_SERVICE";
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
+ field public static final java.lang.String BIND_AUTOFILL = "android.permission.BIND_AUTOFILL";
field public static final java.lang.String BIND_AUTO_FILL = "android.permission.BIND_AUTO_FILL";
field public static final deprecated java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE";
field public static final java.lang.String BIND_CARRIER_SERVICES = "android.permission.BIND_CARRIER_SERVICES";
@@ -298,8 +299,6 @@
field public static final int authorities = 16842776; // 0x1010018
field public static final int autoAdvanceViewId = 16843535; // 0x101030f
field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
- field public static final int autoFillHint = 16844121; // 0x1010559
- field public static final int autoFillMode = 16844116; // 0x1010554
field public static final int autoLink = 16842928; // 0x10100b0
field public static final int autoMirrored = 16843754; // 0x10103ea
field public static final int autoRemoveFromRecents = 16843847; // 0x1010447
@@ -312,6 +311,8 @@
field public static final deprecated int autoText = 16843114; // 0x101016a
field public static final int autoUrlDetect = 16843404; // 0x101028c
field public static final int autoVerify = 16844014; // 0x10104ee
+ field public static final int autofillHint = 16844121; // 0x1010559
+ field public static final int autofillMode = 16844116; // 0x1010554
field public static final int background = 16842964; // 0x10100d4
field public static final int backgroundDimAmount = 16842802; // 0x1010032
field public static final int backgroundDimEnabled = 16843295; // 0x101021f
@@ -1051,6 +1052,7 @@
field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
field public static final int readPermission = 16842759; // 0x1010007
field public static final int recognitionService = 16843932; // 0x101049c
+ field public static final int recycleEnabled = 16844124; // 0x101055c
field public static final int relinquishTaskIdentity = 16843894; // 0x1010476
field public static final int reparent = 16843964; // 0x10104bc
field public static final int reparentWithOverlay = 16843965; // 0x10104bd
@@ -1778,6 +1780,7 @@
public static final class R.id {
ctor public R.id();
field public static final int accessibilityActionContextClick = 16908348; // 0x102003c
+ field public static final int accessibilityActionMoveWindow = 16908354; // 0x1020042
field public static final int accessibilityActionScrollDown = 16908346; // 0x102003a
field public static final int accessibilityActionScrollLeft = 16908345; // 0x1020039
field public static final int accessibilityActionScrollRight = 16908347; // 0x102003b
@@ -6578,9 +6581,12 @@
public class AssistStructure implements android.os.Parcelable {
ctor public AssistStructure();
method public int describeContents();
+ method public long getAcquisitionEndTime();
+ method public long getAcquisitionStartTime();
method public android.content.ComponentName getActivityComponent();
method public android.app.assist.AssistStructure.WindowNode getWindowNodeAt(int);
method public int getWindowNodeCount();
+ method public boolean isHomeActivity();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.assist.AssistStructure> CREATOR;
}
@@ -6588,11 +6594,10 @@
public static class AssistStructure.ViewNode {
method public float getAlpha();
method public int getAutoFillHint();
- method public android.view.autofill.AutoFillId getAutoFillId();
- method public java.lang.String[] getAutoFillOptions();
- method public deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public android.view.autofill.AutofillId getAutofillId();
+ method public java.lang.String[] getAutofillOptions();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.app.assist.AssistStructure.ViewNode getChildAt(int);
method public int getChildCount();
method public java.lang.String getClassName();
@@ -6634,6 +6639,7 @@
method public boolean isFocusable();
method public boolean isFocused();
method public boolean isLongClickable();
+ method public boolean isOpaque();
method public boolean isSelected();
field public static final int TEXT_COLOR_UNDEFINED = 1; // 0x1
field public static final int TEXT_STYLE_BOLD = 1; // 0x1
@@ -8013,7 +8019,7 @@
public static final class AdvertisingSetParameters.Builder {
ctor public AdvertisingSetParameters.Builder();
method public android.bluetooth.le.AdvertisingSetParameters build();
- method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymouus(boolean);
+ method public android.bluetooth.le.AdvertisingSetParameters.Builder setAnonymous(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setConnectable(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setIncludeTxPower(boolean);
method public android.bluetooth.le.AdvertisingSetParameters.Builder setInterval(int);
@@ -8210,18 +8216,17 @@
package android.companion {
- public final class AssociationRequest<F extends android.companion.DeviceFilter> implements android.os.Parcelable {
+ public final class AssociationRequest implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.AssociationRequest> CREATOR;
}
- public static final class AssociationRequest.Builder<F extends android.companion.DeviceFilter> {
- method public android.companion.AssociationRequest<F> build();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothDeviceFilter> createForBluetoothDevice();
- method public static android.companion.AssociationRequest.Builder<android.companion.BluetoothLEDeviceFilter> createForBluetoothLEDevice();
- method public android.companion.AssociationRequest.Builder<F> setDeviceFilter(F);
- method public android.companion.AssociationRequest.Builder<F> setSingleDevice(boolean);
+ public static final class AssociationRequest.Builder {
+ ctor public AssociationRequest.Builder();
+ method public android.companion.AssociationRequest.Builder addDeviceFilter(android.companion.DeviceFilter<?>);
+ method public android.companion.AssociationRequest build();
+ method public android.companion.AssociationRequest.Builder setSingleDevice(boolean);
}
public final class BluetoothDeviceFilter implements android.companion.DeviceFilter {
@@ -8240,6 +8245,7 @@
public final class BluetoothLEDeviceFilter implements android.companion.DeviceFilter {
method public int describeContents();
+ method public static int getRenamePrefixLengthLimit();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.companion.BluetoothLEDeviceFilter> CREATOR;
}
@@ -8248,11 +8254,13 @@
ctor public BluetoothLEDeviceFilter.Builder();
method public android.companion.BluetoothLEDeviceFilter build();
method public android.companion.BluetoothLEDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRawDataFilter(byte[], byte[]);
+ method public android.companion.BluetoothLEDeviceFilter.Builder setRename(java.lang.String, java.lang.String, int, int, boolean);
method public android.companion.BluetoothLEDeviceFilter.Builder setScanFilter(android.bluetooth.le.ScanFilter);
}
public final class CompanionDeviceManager {
- method public void associate(android.companion.AssociationRequest<?>, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
+ method public void associate(android.companion.AssociationRequest, android.companion.CompanionDeviceManager.Callback, android.os.Handler);
method public void disassociate(java.lang.String);
method public java.util.List<java.lang.String> getAssociations();
field public static final java.lang.String EXTRA_DEVICE = "android.companion.extra.DEVICE";
@@ -8267,6 +8275,18 @@
public abstract interface DeviceFilter<D extends android.os.Parcelable> implements android.os.Parcelable {
}
+ public final class WifiDeviceFilter implements android.companion.DeviceFilter {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.companion.WifiDeviceFilter> CREATOR;
+ }
+
+ public static final class WifiDeviceFilter.Builder {
+ ctor public WifiDeviceFilter.Builder();
+ method public android.companion.WifiDeviceFilter build();
+ method public android.companion.WifiDeviceFilter.Builder setNamePattern(java.util.regex.Pattern);
+ }
+
}
package android.content {
@@ -8832,7 +8852,9 @@
method public abstract deprecated android.graphics.drawable.Drawable peekWallpaper();
method public void registerComponentCallbacks(android.content.ComponentCallbacks);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public abstract deprecated void removeStickyBroadcast(android.content.Intent);
method public abstract deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public abstract void revokeUriPermission(android.net.Uri, int);
@@ -9022,7 +9044,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public deprecated android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public deprecated void removeStickyBroadcast(android.content.Intent);
method public deprecated void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -9280,8 +9304,8 @@
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
field public static final java.lang.String ACTION_DEFAULT = "android.intent.action.VIEW";
field public static final java.lang.String ACTION_DELETE = "android.intent.action.DELETE";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
- field public static final java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
+ field public static final deprecated java.lang.String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
field public static final java.lang.String ACTION_DIAL = "android.intent.action.DIAL";
field public static final java.lang.String ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT";
field public static final java.lang.String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
@@ -9525,6 +9549,7 @@
field public static final int FLAG_RECEIVER_NO_ABORT = 134217728; // 0x8000000
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
+ field public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 2097152; // 0x200000
field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
field public static final int URI_ALLOW_UNSAFE = 4; // 0x4
field public static final int URI_ANDROID_APP_SCHEME = 2; // 0x2
@@ -12542,6 +12567,7 @@
public class BitmapShader extends android.graphics.Shader {
ctor public BitmapShader(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
+ method public void set(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
}
public class BlurMaskFilter extends android.graphics.MaskFilter {
@@ -12943,6 +12969,8 @@
public class ComposeShader extends android.graphics.Shader {
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
+ method public void set(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
}
public class CornerPathEffect extends android.graphics.PathEffect {
@@ -13018,6 +13046,8 @@
public class LinearGradient extends android.graphics.Shader {
ctor public LinearGradient(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public LinearGradient(float, float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, float, int, int, android.graphics.Shader.TileMode);
}
public class MaskFilter {
@@ -13536,6 +13566,8 @@
public class RadialGradient extends android.graphics.Shader {
ctor public RadialGradient(float, float, float, int[], float[], android.graphics.Shader.TileMode);
ctor public RadialGradient(float, float, float, int, int, android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int[], float[], android.graphics.Shader.TileMode);
+ method public void set(float, float, float, int, int, android.graphics.Shader.TileMode);
}
public final class Rect implements android.os.Parcelable {
@@ -13675,7 +13707,7 @@
}
public class Shader {
- ctor public Shader();
+ ctor public deprecated Shader();
method public boolean getLocalMatrix(android.graphics.Matrix);
method public void setLocalMatrix(android.graphics.Matrix);
}
@@ -13720,6 +13752,8 @@
public class SweepGradient extends android.graphics.Shader {
ctor public SweepGradient(float, float, int[], float[]);
ctor public SweepGradient(float, float, int, int);
+ method public void set(float, float, int[], float[]);
+ method public void set(float, float, int, int);
}
public class Typeface {
@@ -13747,9 +13781,12 @@
public static abstract interface Typeface.FontRequestCallback {
method public abstract void onTypefaceRequestFailed(int);
method public abstract void onTypefaceRetrieved(android.graphics.Typeface);
- field public static final int FAIL_REASON_FONT_LOAD_ERROR = 1; // 0x1
- field public static final int FAIL_REASON_FONT_NOT_FOUND = 2; // 0x2
- field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = 0; // 0x0
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
}
public class Xfermode {
@@ -21087,7 +21124,7 @@
}
public class AudioManager {
- method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
+ method public deprecated int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
method public int abandonAudioFocusRequest(android.media.AudioFocusRequest);
method public void adjustStreamVolume(int, int, int);
method public void adjustSuggestedStreamVolume(int, int, int);
@@ -21124,7 +21161,7 @@
method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent);
method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient);
method public deprecated boolean registerRemoteController(android.media.RemoteController);
- method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
+ method public deprecated int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
method public int requestAudioFocus(android.media.AudioFocusRequest);
method public deprecated void setBluetoothA2dpOn(boolean);
method public void setBluetoothScoOn(boolean);
@@ -25247,7 +25284,9 @@
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
+ method public void registerDefaultNetworkCallback(android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
+ method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent);
method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
@@ -25256,6 +25295,8 @@
method public boolean requestBandwidthUpdate(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
+ method public void requestNetwork(android.net.NetworkRequest, int, android.net.ConnectivityManager.NetworkCallback, android.os.Handler);
method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
@@ -26235,6 +26276,16 @@
package android.net.wifi {
+ public final class IconInfo implements android.os.Parcelable {
+ ctor public IconInfo(java.lang.String, byte[]);
+ ctor public IconInfo(android.net.wifi.IconInfo);
+ method public int describeContents();
+ method public byte[] getData();
+ method public java.lang.String getFilename();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.net.wifi.IconInfo> CREATOR;
+ }
+
public class ScanResult implements android.os.Parcelable {
method public int describeContents();
method public boolean is80211mcResponder();
@@ -26434,7 +26485,7 @@
public class WifiManager {
method public int addNetwork(android.net.wifi.WifiConfiguration);
- method public boolean addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
+ method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
method public static int calculateSignalLevel(int, int);
method public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
method public static int compareSignalLevel(int, int);
@@ -26463,7 +26514,7 @@
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
- method public boolean removePasspointConfiguration(java.lang.String);
+ method public void removePasspointConfiguration(java.lang.String);
method public deprecated boolean saveConfiguration();
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
@@ -26478,26 +26529,21 @@
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
+ field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
+ field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
+ field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
+ field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
+ field public static final java.lang.String EXTRA_ICON_INFO = "android.net.wifi.extra.ICON_INFO";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_BSSID = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_ESS = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_ESS";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REASON_URL = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REASON_URL";
- field public static final java.lang.String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY = "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_BSSID = "android.net.wifi.extra.PASSPOINT_ICON_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_DATA = "android.net.wifi.extra.PASSPOINT_ICON_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_ICON_FILENAME = "android.net.wifi.extra.PASSPOINT_ICON_FILENAME";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_BSSID = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_DATA = "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_DATA";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD";
- field public static final java.lang.String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL = "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
+ field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
+ field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -26580,7 +26626,8 @@
}
public class DiscoverySession {
- method public java.lang.String createNetworkSpecifier(android.net.wifi.aware.PeerHandle, byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(android.net.wifi.aware.PeerHandle);
+ method public java.lang.String createNetworkSpecifierPassphrase(android.net.wifi.aware.PeerHandle, java.lang.String);
method public void destroy();
method public void sendMessage(android.net.wifi.aware.PeerHandle, int, byte[]);
}
@@ -26668,7 +26715,8 @@
}
public class WifiAwareSession {
- method public java.lang.String createNetworkSpecifier(int, byte[], byte[]);
+ method public java.lang.String createNetworkSpecifierOpen(int, byte[]);
+ method public java.lang.String createNetworkSpecifierPassphrase(int, byte[], java.lang.String);
method public void destroy();
method public void publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
method public void subscribe(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler);
@@ -26714,7 +26762,6 @@
method public void setUsageLimitStartTimeInMs(long);
method public void setUsageLimitTimeLimitInMinutes(long);
method public void setUsageLimitUsageTimePeriodInMinutes(long);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
}
@@ -26755,7 +26802,6 @@
method public void setRealm(java.lang.String);
method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential> CREATOR;
}
@@ -26768,7 +26814,6 @@
method public java.lang.String getCertType();
method public void setCertSha256Fingerprint(byte[]);
method public void setCertType(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR;
}
@@ -26781,7 +26826,6 @@
method public java.lang.String getImsi();
method public void setEapType(int);
method public void setImsi(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR;
}
@@ -26804,7 +26848,6 @@
method public void setPassword(java.lang.String);
method public void setSoftTokenApp(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
}
@@ -26829,7 +26872,6 @@
method public void setMatchAnyOis(long[]);
method public void setOtherHomePartners(java.lang.String[]);
method public void setRoamingConsortiumOis(long[]);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
}
@@ -26856,7 +26898,6 @@
method public void setPolicyUpdate(android.net.wifi.hotspot2.pps.UpdateParameter);
method public void setPreferredRoamingPartnerList(java.util.List<android.net.wifi.hotspot2.pps.Policy.RoamingPartner>);
method public void setRequiredProtoPortMap(java.util.Map<java.lang.Integer, java.lang.String>);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy> CREATOR;
}
@@ -26873,7 +26914,6 @@
method public void setFqdn(java.lang.String);
method public void setFqdnExactMatch(boolean);
method public void setPriority(int);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Policy.RoamingPartner> CREATOR;
}
@@ -26898,7 +26938,6 @@
method public void setUpdateIntervalInMinutes(long);
method public void setUpdateMethod(java.lang.String);
method public void setUsername(java.lang.String);
- method public boolean validate();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.UpdateParameter> CREATOR;
field public static final long UPDATE_CHECK_INTERVAL_NEVER = 4294967295L; // 0xffffffffL
@@ -32002,6 +32041,7 @@
method public boolean hasKey();
method public boolean isEnabled();
method public boolean isPersistent();
+ method public boolean isRecycleEnabled();
method public boolean isSelectable();
method protected void notifyChanged();
method public void notifyDependencyChange(boolean);
@@ -32041,6 +32081,7 @@
method public void setOrder(int);
method public void setPersistent(boolean);
method public void setPreferenceDataStore(android.preference.PreferenceDataStore);
+ method public void setRecycleEnabled(boolean);
method public void setSelectable(boolean);
method public void setShouldDisableView(boolean);
method public void setSummary(java.lang.CharSequence);
@@ -34213,21 +34254,21 @@
method public static android.net.Uri buildRootsUri(java.lang.String);
method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String);
method public static android.net.Uri buildTreeDocumentUri(java.lang.String, java.lang.String);
- method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String);
- method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle);
- method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
- method public static java.util.List<java.lang.String> findDocumentPath(android.content.ContentResolver, android.net.Uri);
+ method public static android.net.Uri copyDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
+ method public static android.content.IntentSender createWebLinkIntent(android.content.ContentResolver, android.net.Uri, android.os.Bundle) throws java.io.FileNotFoundException;
+ method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.provider.DocumentsContract.Path findDocumentPath(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException;
method public static java.lang.String getDocumentId(android.net.Uri);
- method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
+ method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal) throws java.io.FileNotFoundException;
method public static java.lang.String getRootId(android.net.Uri);
method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
method public static java.lang.String getTreeDocumentId(android.net.Uri);
method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
method public static boolean isTreeUri(android.net.Uri);
- method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri);
- method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri);
- method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String);
+ method public static android.net.Uri moveDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
field public static final java.lang.String ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
field public static final java.lang.String EXTRA_ERROR = "error";
field public static final java.lang.String EXTRA_EXCLUDE_SELF = "android.provider.extra.EXCLUDE_SELF";
@@ -34333,6 +34374,11 @@
public static final class FontsContract.Columns implements android.provider.BaseColumns {
ctor public FontsContract.Columns();
+ field public static final java.lang.String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
field public static final java.lang.String STYLE = "font_style";
field public static final java.lang.String TTC_INDEX = "font_ttc_index";
field public static final java.lang.String VARIATION_SETTINGS = "font_variation_settings";
@@ -34731,6 +34777,7 @@
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
+ field public static final java.lang.String ACTION_NIGHT_DISPLAY_SETTINGS = "android.settings.NIGHT_DISPLAY_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
@@ -34860,7 +34907,7 @@
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final deprecated java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
field public static final java.lang.String ANDROID_ID = "android_id";
- field public static final java.lang.String AUTO_FILL_SERVICE = "auto_fill_service";
+ field public static final java.lang.String AUTOFILL_SERVICE = "autofill_service";
field public static final deprecated java.lang.String BACKGROUND_DATA = "background_data";
field public static final deprecated java.lang.String BLUETOOTH_ON = "bluetooth_on";
field public static final android.net.Uri CONTENT_URI;
@@ -36832,15 +36879,15 @@
package android.service.autofill {
- public abstract class AutoFillService extends android.app.Service {
- ctor public AutoFillService();
+ public abstract class AutofillService extends android.app.Service {
+ ctor public AutofillService();
method public final void disableSelf();
method public final android.os.IBinder onBind(android.content.Intent);
method public void onConnected();
method public void onDisconnected();
method public abstract void onFillRequest(android.app.assist.AssistStructure, android.os.Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback);
method public abstract void onSaveRequest(android.app.assist.AssistStructure, android.os.Bundle, android.service.autofill.SaveCallback);
- field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
+ field public static final java.lang.String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
@@ -36854,7 +36901,7 @@
ctor public Dataset.Builder(android.widget.RemoteViews);
method public android.service.autofill.Dataset build();
method public android.service.autofill.Dataset.Builder setAuthentication(android.content.IntentSender);
- method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutoFillId, android.view.autofill.AutoFillValue);
+ method public android.service.autofill.Dataset.Builder setValue(android.view.autofill.AutofillId, android.view.autofill.AutofillValue);
}
public final class FillCallback {
@@ -36894,7 +36941,7 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int);
- method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutoFillId...);
+ method public android.service.autofill.SaveInfo.Builder addSavableIds(android.view.autofill.AutofillId...);
method public android.service.autofill.SaveInfo build();
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(java.lang.CharSequence, android.content.IntentSender);
@@ -39977,7 +40024,7 @@
method public int getSimState();
method public int getSimState(int);
method public java.lang.String getSubscriberId();
- method public java.lang.String getVisualVoicemailPackageName(android.telecom.PhoneAccountHandle);
+ method public java.lang.String getVisualVoicemailPackageName();
method public java.lang.String getVoiceMailAlphaTag();
method public java.lang.String getVoiceMailNumber();
method public int getVoiceNetworkType();
@@ -40117,9 +40164,6 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.VisualVoicemailSmsFilterSettings> CREATOR;
- field public static final java.lang.String DEFAULT_CLIENT_PREFIX = "//VVM";
- field public static final int DEFAULT_DESTINATION_PORT = -1; // 0xffffffff
- field public static final java.util.List<java.lang.String> DEFAULT_ORIGINATING_NUMBERS;
field public static final int DESTINATION_PORT_ANY = -1; // 0xffffffff
field public static final int DESTINATION_PORT_DATA_SMS = -2; // 0xfffffffe
field public final java.lang.String clientPrefix;
@@ -40649,7 +40693,9 @@
method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public android.graphics.drawable.Drawable peekWallpaper();
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, boolean);
method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, boolean);
method public void removeStickyBroadcast(android.content.Intent);
method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
method public void revokeUriPermission(android.net.Uri, int);
@@ -45321,8 +45367,8 @@
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
method public void announceForAccessibility(java.lang.CharSequence);
- method public void autoFill(android.view.autofill.AutoFillValue);
- method public void autoFillVirtual(int, android.view.autofill.AutoFillValue);
+ method public void autofill(android.view.autofill.AutofillValue);
+ method public void autofillVirtual(int, android.view.autofill.AutofillValue);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -45376,7 +45422,7 @@
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public void dispatchPointerCaptureChanged(boolean);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void dispatchProvideAutoFillStructure(android.view.ViewStructure, int);
+ method public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
method public void dispatchProvideStructure(android.view.ViewStructure);
method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
@@ -45412,11 +45458,10 @@
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
- method public int getAutoFillHint();
- method public int getAutoFillMode();
- method public final deprecated android.view.autofill.AutoFillType getAutoFillType();
- method public android.view.autofill.AutoFillValue getAutoFillValue();
+ method public int getAutofillHint();
+ method public int getAutofillMode();
method public int getAutofillType();
+ method public android.view.autofill.AutofillValue getAutofillValue();
method public android.graphics.drawable.Drawable getBackground();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
@@ -45502,7 +45547,7 @@
method public float getPivotX();
method public float getPivotY();
method public android.view.PointerIcon getPointerIcon();
- method public int getResolvedAutoFillMode();
+ method public int getResolvedAutofillMode();
method public android.content.res.Resources getResources();
method public final boolean getRevealOnFocusHint();
method public final int getRight();
@@ -45662,8 +45707,8 @@
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPointerCaptureChange(boolean);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- method public void onProvideAutoFillStructure(android.view.ViewStructure, int);
- method public void onProvideAutoFillVirtualStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillStructure(android.view.ViewStructure, int);
+ method public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
method public void onProvideStructure(android.view.ViewStructure);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
@@ -45737,8 +45782,8 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
- method public void setAutoFillHint(int);
- method public void setAutoFillMode(int);
+ method public void setAutofillHint(int);
+ method public void setAutofillMode(int);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -45880,28 +45925,28 @@
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
+ field public static final int AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
+ field public static final int AUTOFILL_HINT_EMAIL_ADDRESS = 1; // 0x1
+ field public static final int AUTOFILL_HINT_NAME = 2; // 0x2
+ field public static final int AUTOFILL_HINT_NONE = 0; // 0x0
+ field public static final int AUTOFILL_HINT_PASSWORD = 8; // 0x8
+ field public static final int AUTOFILL_HINT_PHONE = 16; // 0x10
+ field public static final int AUTOFILL_HINT_POSTAL_ADDRESS = 32; // 0x20
+ field public static final int AUTOFILL_HINT_POSTAL_CODE = 64; // 0x40
+ field public static final int AUTOFILL_HINT_USERNAME = 4; // 0x4
+ field public static final int AUTOFILL_MODE_AUTO = 1; // 0x1
+ field public static final int AUTOFILL_MODE_INHERIT = 0; // 0x0
+ field public static final int AUTOFILL_MODE_MANUAL = 2; // 0x2
field public static final int AUTOFILL_TYPE_DATE = 4; // 0x4
field public static final int AUTOFILL_TYPE_LIST = 3; // 0x3
field public static final int AUTOFILL_TYPE_NONE = 0; // 0x0
field public static final int AUTOFILL_TYPE_TEXT = 1; // 0x1
field public static final int AUTOFILL_TYPE_TOGGLE = 2; // 0x2
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 512; // 0x200
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 4096; // 0x1000
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 1024; // 0x400
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 2048; // 0x800
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_NUMBER = 128; // 0x80
- field public static final int AUTO_FILL_HINT_CREDIT_CARD_SECURITY_CODE = 256; // 0x100
- field public static final int AUTO_FILL_HINT_EMAIL_ADDRESS = 1; // 0x1
- field public static final int AUTO_FILL_HINT_NAME = 2; // 0x2
- field public static final int AUTO_FILL_HINT_NONE = 0; // 0x0
- field public static final int AUTO_FILL_HINT_PASSWORD = 8; // 0x8
- field public static final int AUTO_FILL_HINT_PHONE = 16; // 0x10
- field public static final int AUTO_FILL_HINT_POSTAL_ADDRESS = 32; // 0x20
- field public static final int AUTO_FILL_HINT_POSTAL_CODE = 64; // 0x40
- field public static final int AUTO_FILL_HINT_USERNAME = 4; // 0x4
- field public static final int AUTO_FILL_MODE_AUTO = 1; // 0x1
- field public static final int AUTO_FILL_MODE_INHERIT = 0; // 0x0
- field public static final int AUTO_FILL_MODE_MANUAL = 2; // 0x2
field public static final int DRAG_FLAG_GLOBAL = 256; // 0x100
field public static final int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION = 64; // 0x40
field public static final int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION = 128; // 0x80
@@ -46467,7 +46512,7 @@
method public abstract int getLayoutDirection();
method public abstract android.view.ViewParent getParent();
method public abstract android.view.ViewParent getParentForAccessibility();
- method public default int getResolvedAutoFillMode();
+ method public default int getResolvedAutofillMode();
method public abstract int getTextAlignment();
method public abstract int getTextDirection();
method public abstract deprecated void invalidateChild(android.view.View, android.graphics.Rect);
@@ -46546,7 +46591,7 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
- method public abstract android.view.ViewStructure asyncNewChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure asyncNewChildForAutofill(int, int, int);
method public abstract int getChildCount();
method public abstract android.os.Bundle getExtras();
method public abstract java.lang.CharSequence getHint();
@@ -46555,15 +46600,14 @@
method public abstract int getTextSelectionStart();
method public abstract boolean hasExtras();
method public abstract android.view.ViewStructure newChild(int);
- method public abstract android.view.ViewStructure newChildForAutoFill(int, int, int);
+ method public abstract android.view.ViewStructure newChildForAutofill(int, int, int);
method public abstract void setAccessibilityFocused(boolean);
method public abstract void setActivated(boolean);
method public abstract void setAlpha(float);
- method public abstract void setAutoFillHint(int);
- method public abstract void setAutoFillOptions(java.lang.String[]);
- method public abstract deprecated void setAutoFillType(android.view.autofill.AutoFillType);
- method public abstract void setAutoFillValue(android.view.autofill.AutoFillValue);
+ method public abstract void setAutofillHint(int);
+ method public abstract void setAutofillOptions(java.lang.String[]);
method public abstract void setAutofillType(int);
+ method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
method public abstract void setCheckable(boolean);
method public abstract void setChecked(boolean);
method public abstract void setChildCount(int);
@@ -46580,6 +46624,7 @@
method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
method public abstract void setInputType(int);
method public abstract void setLongClickable(boolean);
+ method public abstract void setOpaque(boolean);
method public abstract void setSanitized(boolean);
method public abstract void setSelected(boolean);
method public abstract void setText(java.lang.CharSequence);
@@ -47298,6 +47343,8 @@
field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y = "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
@@ -47354,6 +47401,7 @@
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_EXPAND;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_FOCUS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_LONG_CLICK;
+ field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_MOVE_WINDOW;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_PASTE;
@@ -47478,6 +47526,7 @@
method public android.view.accessibility.AccessibilityNodeInfo getRoot();
method public java.lang.CharSequence getTitle();
method public int getType();
+ method public boolean inPictureInPicture();
method public boolean isAccessibilityFocused();
method public boolean isActive();
method public boolean isFocused();
@@ -47814,60 +47863,47 @@
package android.view.autofill {
- public final class AutoFillId implements android.os.Parcelable {
+ public final class AutofillId implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillId> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillId> CREATOR;
}
- public final class AutoFillManager {
- method public void registerCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void reset();
- method public void startAutoFillRequest(android.view.View);
- method public void startAutoFillRequestOnVirtualView(android.view.View, int, android.graphics.Rect);
- method public void stopAutoFillRequest(android.view.View);
- method public void stopAutoFillRequestOnVirtualView(android.view.View, int);
- method public void unregisterCallback(android.view.autofill.AutoFillManager.AutofillCallback);
- method public void valueChanged(android.view.View);
- method public void virtualValueChanged(android.view.View, int, android.view.autofill.AutoFillValue);
+ public final class AutofillManager {
+ method public void cancel();
+ method public void commit();
+ method public void notifyValueChanged(android.view.View);
+ method public void notifyViewEntered(android.view.View);
+ method public void notifyViewExited(android.view.View);
+ method public void notifyVirtualValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
+ method public void notifyVirtualViewEntered(android.view.View, int, android.graphics.Rect);
+ method public void notifyVirtualViewExited(android.view.View, int);
+ method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
+ method public void unregisterCallback(android.view.autofill.AutofillManager.AutofillCallback);
field public static final java.lang.String EXTRA_ASSIST_STRUCTURE = "android.view.autofill.extra.ASSIST_STRUCTURE";
field public static final java.lang.String EXTRA_AUTHENTICATION_RESULT = "android.view.autofill.extra.AUTHENTICATION_RESULT";
}
- public static abstract class AutoFillManager.AutofillCallback {
- ctor public AutoFillManager.AutofillCallback();
+ public static abstract class AutofillManager.AutofillCallback {
+ ctor public AutofillManager.AutofillCallback();
method public void onAutofillEvent(android.view.View, int);
method public void onAutofillEventVirtual(android.view.View, int, int);
field public static final int EVENT_INPUT_HIDDEN = 2; // 0x2
field public static final int EVENT_INPUT_SHOWN = 1; // 0x1
}
- public final class AutoFillType implements android.os.Parcelable {
+ public final class AutofillValue implements android.os.Parcelable {
method public int describeContents();
- method public static android.view.autofill.AutoFillType forDate();
- method public static android.view.autofill.AutoFillType forList();
- method public static android.view.autofill.AutoFillType forText();
- method public static android.view.autofill.AutoFillType forToggle();
- method public boolean isDate();
- method public boolean isList();
- method public boolean isText();
- method public boolean isToggle();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillType> CREATOR;
- }
-
- public final class AutoFillValue implements android.os.Parcelable {
- method public int describeContents();
- method public static android.view.autofill.AutoFillValue forDate(long);
- method public static android.view.autofill.AutoFillValue forList(int);
- method public static android.view.autofill.AutoFillValue forText(java.lang.CharSequence);
- method public static android.view.autofill.AutoFillValue forToggle(boolean);
+ method public static android.view.autofill.AutofillValue forDate(long);
+ method public static android.view.autofill.AutofillValue forList(int);
+ method public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
+ method public static android.view.autofill.AutofillValue forToggle(boolean);
method public long getDateValue();
method public int getListValue();
method public java.lang.CharSequence getTextValue();
method public boolean getToggleValue();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.view.autofill.AutoFillValue> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillValue> CREATOR;
}
}
@@ -49135,6 +49171,7 @@
field public static final int ERROR_TIMEOUT = -8; // 0xfffffff8
field public static final int ERROR_TOO_MANY_REQUESTS = -15; // 0xfffffff1
field public static final int ERROR_UNKNOWN = -1; // 0xffffffff
+ field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
}
diff --git a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
index b0ab235..6538515 100644
--- a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
+++ b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
@@ -101,7 +101,7 @@
IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
int ret = -1;
try {
- ret = wm.getRotation();
+ ret = wm.getDefaultDisplayRotation();
} catch (RemoteException e) {
Log.e(LOG_TAG, "Error getting screen rotation", e);
throw new RuntimeException(e);
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index b4e119e..64d7d4c 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -1438,7 +1438,7 @@
*/
public AccessibilityNodeInfo findFocus(int focus) {
return AccessibilityInteractionClient.getInstance().findFocus(mConnectionId,
- AccessibilityNodeInfo.ANY_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID, focus);
+ AccessibilityWindowInfo.ANY_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID, focus);
}
/**
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 0193c5f..78c29e8 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -16,9 +16,9 @@
package android.app;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.ToolbarActionBar;
@@ -690,7 +690,7 @@
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback, WindowControllerCallback,
- AutoFillManager.AutoFillClient {
+ AutofillManager.AutofillClient {
private static final String TAG = "Activity";
private static final boolean DEBUG_LIFECYCLE = false;
@@ -1783,7 +1783,7 @@
mTranslucentCallback = null;
mCalled = true;
if (isFinishing() && mAutoFillResetNeeded) {
- getSystemService(AutoFillManager.class).reset();
+ getSystemService(AutofillManager.class).commit();
}
}
@@ -7042,7 +7042,7 @@
}
} else if (who.startsWith(AUTO_FILL_AUTH_WHO_PREFIX)) {
Intent resultData = (resultCode == Activity.RESULT_OK) ? data : null;
- getSystemService(AutoFillManager.class).onAuthenticationResult(resultData);
+ getSystemService(AutofillManager.class).onAuthenticationResult(resultData);
} else {
Fragment frag = mFragments.findFragmentByWho(who);
if (frag != null) {
@@ -7185,22 +7185,22 @@
/** @hide */
@Override
- public void autoFill(List<AutoFillId> ids, List<AutoFillValue> values) {
+ public void autofill(List<AutofillId> ids, List<AutofillValue> values) {
final View root = getWindow().getDecorView();
final int itemCount = ids.size();
for (int i = 0; i < itemCount; i++) {
- final AutoFillId id = ids.get(i);
- final AutoFillValue value = values.get(i);
+ final AutofillId id = ids.get(i);
+ final AutofillValue value = values.get(i);
final int viewId = id.getViewId();
final View view = root.findViewByAccessibilityIdTraversal(viewId);
if (view == null) {
- Log.w(TAG, "autoFill(): no View with id " + viewId);
+ Log.w(TAG, "autofill(): no View with id " + viewId);
continue;
}
if (id.isVirtual()) {
- view.autoFillVirtual(id.getVirtualChildId(), value);
+ view.autofillVirtual(id.getVirtualChildId(), value);
} else {
- view.autoFill(value);
+ view.autofill(value);
}
}
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index cae37c6..043e0ab 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -133,7 +133,7 @@
public final static boolean ENABLE_TASK_SNAPSHOTS;
static {
- ENABLE_TASK_SNAPSHOTS = SystemProperties.getBoolean("persist.enable_task_snapshots", false);
+ ENABLE_TASK_SNAPSHOTS = SystemProperties.getBoolean("persist.enable_task_snapshots", true);
}
static final class UidObserver extends IUidObserver.Stub {
@@ -144,7 +144,7 @@
}
@Override
- public void onUidStateChanged(int uid, int procState) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
mListener.onUidImportance(uid, RunningAppProcessInfo.procStateToImportance(procState));
}
@@ -502,8 +502,8 @@
/** @hide requestType for assist context: generate full AssistStructure. */
public static final int ASSIST_CONTEXT_FULL = 1;
- /** @hide requestType for assist context: generate full AssistStructure for auto-fill. */
- public static final int ASSIST_CONTEXT_AUTO_FILL = 2;
+ /** @hide requestType for assist context: generate full AssistStructure for autofill. */
+ public static final int ASSIST_CONTEXT_AUTOFILL = 2;
/** @hide Flag for registerUidObserver: report changes in process state. */
public static final int UID_OBSERVER_PROCSTATE = 1<<0;
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index fa64a0f..b36b664 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -25,6 +25,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.service.voice.IVoiceInteractionSession;
+import android.util.SparseIntArray;
import com.android.internal.app.IVoiceInteractor;
@@ -47,9 +48,9 @@
/**
* Type for {@link #notifyAppTransitionStarting}: The transition was started because we drew
- * the starting window.
+ * the splash screen.
*/
- public static final int APP_TRANSITION_STARTING_WINDOW = 1;
+ public static final int APP_TRANSITION_SPLASH_SCREEN = 1;
/**
* Type for {@link #notifyAppTransitionStarting}: The transition was started because we all
@@ -64,6 +65,12 @@
public static final int APP_TRANSITION_TIMEOUT = 3;
/**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because of a
+ * we drew a task snapshot.
+ */
+ public static final int APP_TRANSITION_SNAPSHOT = 4;
+
+ /**
* Grant Uri permissions from one app to another. This method only extends
* permission grants if {@code callingUid} has permission to them.
*/
@@ -122,19 +129,13 @@
IVoiceInteractor mInteractor);
/**
- * Callback for window manager to let activity manager know that the starting window has been
- * drawn
- */
- public abstract void notifyStartingWindowDrawn();
-
- /**
* Callback for window manager to let activity manager know that we are finally starting the
* app transition;
*
- * @param reason The reason why the app transition started. Must be one of the APP_TRANSITION_*
- * values.
+ * @param reasons A map from stack id to a reason integer why the transition was started,, which
+ * must be one of the APP_TRANSITION_* values.
*/
- public abstract void notifyAppTransitionStarting(int reason);
+ public abstract void notifyAppTransitionStarting(SparseIntArray reasons);
/**
* Callback for window manager to let activity manager know that the app transition was
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index ce9d91f..44cc5b4 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2913,13 +2913,13 @@
}
public void handleRequestAssistContextExtras(RequestAssistContextExtras cmd) {
- // Filling for auto-fill has a few differences:
+ // Filling for autofill has a few differences:
// - it does not need an AssistContent
// - it does not call onProvideAssistData()
// - it needs an IAutoFillCallback
- boolean forAutoFill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTO_FILL;
+ boolean forAutofill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTOFILL;
- // TODO(b/33197203): decide if lastSessionId logic applies to auto-fill sessions
+ // TODO(b/33197203): decide if lastSessionId logic applies to autofill sessions
if (mLastSessionId != cmd.sessionId) {
// Clear the existing structures
mLastSessionId = cmd.sessionId;
@@ -2934,25 +2934,26 @@
Bundle data = new Bundle();
AssistStructure structure = null;
- AssistContent content = forAutoFill ? null : new AssistContent();
+ AssistContent content = forAutofill ? null : new AssistContent();
+ final long startTime = SystemClock.uptimeMillis();
ActivityClientRecord r = mActivities.get(cmd.activityToken);
Uri referrer = null;
if (r != null) {
- if (!forAutoFill) {
+ if (!forAutofill) {
r.activity.getApplication().dispatchOnProvideAssistData(r.activity, data);
r.activity.onProvideAssistData(data);
referrer = r.activity.onProvideReferrer();
}
- if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutoFill) {
- structure = new AssistStructure(r.activity, forAutoFill);
+ if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutofill) {
+ structure = new AssistStructure(r.activity, forAutofill);
Intent activityIntent = r.activity.getIntent();
- // TODO(b/33197203): re-evaluate conditions below for auto-fill. In particular,
+ // TODO(b/33197203): re-evaluate conditions below for autofill. In particular,
// FLAG_SECURE might be allowed on AUTO_FILL but not on AUTO_FILL_SAVE)
boolean notSecure = r.window == null ||
(r.window.getAttributes().flags
& WindowManager.LayoutParams.FLAG_SECURE) == 0;
if (activityIntent != null && notSecure) {
- if (!forAutoFill) {
+ if (!forAutofill) {
Intent intent = new Intent(activityIntent);
intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION));
@@ -2960,11 +2961,11 @@
content.setDefaultIntent(intent);
}
} else {
- if (!forAutoFill) {
+ if (!forAutofill) {
content.setDefaultIntent(new Intent());
}
}
- if (!forAutoFill) {
+ if (!forAutofill) {
r.activity.onProvideAssistContent(content);
}
}
@@ -2973,7 +2974,11 @@
structure = new AssistStructure();
}
- // TODO(b/33197203): decide if lastSessionId logic applies to auto-fill sessions
+ // TODO(b/33197203): decide if lastSessionId logic applies to autofill sessions
+
+ structure.setAcquisitionStartTime(startTime);
+ structure.setAcquisitionEndTime(SystemClock.uptimeMillis());
+
mLastAssistStructures.add(new WeakReference<>(structure));
IActivityManager mgr = ActivityManager.getService();
try {
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 0ab4b80..ede9281 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1327,21 +1327,34 @@
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
+ boolean visibleToInstantApps) {
+ return registerReceiver(receiver, filter, null, null, visibleToInstantApps);
+ }
+
+ @Override
+ public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
return registerReceiverInternal(receiver, getUserId(),
- filter, broadcastPermission, scheduler, getOuterContext());
+ filter, broadcastPermission, scheduler, getOuterContext(), false);
+ }
+
+ @Override
+ public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
+ String broadcastPermission, Handler scheduler, boolean visibleToInstantApps) {
+ return registerReceiverInternal(receiver, getUserId(),
+ filter, broadcastPermission, scheduler, getOuterContext(), visibleToInstantApps);
}
@Override
public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
IntentFilter filter, String broadcastPermission, Handler scheduler) {
return registerReceiverInternal(receiver, user.getIdentifier(),
- filter, broadcastPermission, scheduler, getOuterContext());
+ filter, broadcastPermission, scheduler, getOuterContext(), false);
}
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
IntentFilter filter, String broadcastPermission,
- Handler scheduler, Context context) {
+ Handler scheduler, Context context, boolean visibleToInstantApps) {
IIntentReceiver rd = null;
if (receiver != null) {
if (mPackageInfo != null && context != null) {
@@ -1362,7 +1375,7 @@
try {
final Intent intent = ActivityManager.getService().registerReceiver(
mMainThread.getApplicationThread(), mBasePackageName, rd, filter,
- broadcastPermission, userId);
+ broadcastPermission, userId, visibleToInstantApps);
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index dad2061..77edaea 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -100,7 +100,7 @@
boolean finishActivity(in IBinder token, int code, in Intent data, int finishTask);
Intent registerReceiver(in IApplicationThread caller, in String callerPackage,
in IIntentReceiver receiver, in IntentFilter filter,
- in String requiredPermission, int userId);
+ in String requiredPermission, int userId, boolean visibleToInstantApps);
void unregisterReceiver(in IIntentReceiver receiver);
int broadcastIntent(in IApplicationThread caller, in Intent intent,
in String resolvedType, in IIntentReceiver resultTo, int resultCode,
@@ -475,7 +475,7 @@
void reportSizeConfigurations(in IBinder token, in int[] horizontalSizeConfiguration,
in int[] verticalSizeConfigurations, in int[] smallestWidthConfigurations);
boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate,
- in Rect initialBounds, boolean moveHomeStackFront);
+ in Rect initialBounds);
void suppressResizeConfigChanges(boolean suppress);
void moveTasksToFullscreenStack(int fromStackId, boolean onTop);
boolean moveTopActivityToPinnedStack(int stackId, in Rect bounds);
@@ -588,7 +588,7 @@
boolean updateDisplayOverrideConfiguration(in Configuration values, int displayId);
void unregisterTaskStackListener(ITaskStackListener listener);
void moveStackToDisplay(int stackId, int displayId);
- boolean requestAutoFillData(in IResultReceiver receiver, in Bundle receiverExtras,
+ boolean requestAutofillData(in IResultReceiver receiver, in Bundle receiverExtras,
in IBinder activityToken);
void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback);
int restartUserInBackground(int userId);
diff --git a/core/java/android/app/IUidObserver.aidl b/core/java/android/app/IUidObserver.aidl
index 64cb9b1..ae64875 100644
--- a/core/java/android/app/IUidObserver.aidl
+++ b/core/java/android/app/IUidObserver.aidl
@@ -20,8 +20,13 @@
oneway interface IUidObserver {
/**
* General report of a state change of an uid.
+ *
+ * @param uid The uid for which the state change is being reported.
+ * @param procState The updated process state for the uid.
+ * @param procStateSeq The sequence no. associated with process state change of the uid,
+ * see UidRecord.procStateSeq for details.
*/
- void onUidStateChanged(int uid, int procState);
+ void onUidStateChanged(int uid, int procState, long procStateSeq);
/**
* Report that there are no longer any processes running for a uid.
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index d37e209..2296838 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -424,7 +424,8 @@
* This is a no-op for channels that already exist.
*
* @param channel the channel to create. Note that the created channel may differ from this
- * value. If the channel already exists, it will not be modified.
+ * value. If the provided channel is malformed, a RemoteException will be
+ * thrown. If the channel already exists, it will not be modified.
*/
public void createNotificationChannel(@NonNull NotificationChannel channel) {
createNotificationChannels(Arrays.asList(channel));
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index f330a4b..4ae0617 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -114,7 +114,7 @@
import android.os.storage.StorageManager;
import android.print.IPrintManager;
import android.print.PrintManager;
-import android.view.autofill.AutoFillManager;
+import android.view.autofill.AutofillManager;
import android.view.autofill.IAutoFillManager;
import android.service.persistentdata.IPersistentDataBlockService;
import android.service.persistentdata.PersistentDataBlockManager;
@@ -821,13 +821,13 @@
IBinder b = ServiceManager.getServiceOrThrow(Context.FONT_SERVICE);
return new FontManager(IFontManager.Stub.asInterface(b));
}});
- registerService(Context.AUTO_FILL_MANAGER_SERVICE, AutoFillManager.class,
- new CachedServiceFetcher<AutoFillManager>() {
+ registerService(Context.AUTOFILL_MANAGER_SERVICE, AutofillManager.class,
+ new CachedServiceFetcher<AutofillManager>() {
@Override
- public AutoFillManager createService(ContextImpl ctx) throws ServiceNotFoundException {
- IBinder b = ServiceManager.getServiceOrThrow(Context.AUTO_FILL_MANAGER_SERVICE);
+ public AutofillManager createService(ContextImpl ctx) throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(Context.AUTOFILL_MANAGER_SERVICE);
IAutoFillManager service = IAutoFillManager.Stub.asInterface(b);
- return new AutoFillManager(ctx.getOuterContext(), service);
+ return new AutofillManager(ctx.getOuterContext(), service);
}});
registerService(Context.VR_SERVICE, VrManager.class, new CachedServiceFetcher<VrManager>() {
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 1d6f42e..18e7599 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -381,7 +381,7 @@
*/
public AccessibilityNodeInfo findFocus(int focus) {
return AccessibilityInteractionClient.getInstance().findFocus(mConnectionId,
- AccessibilityNodeInfo.ANY_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID, focus);
+ AccessibilityWindowInfo.ANY_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID, focus);
}
/**
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 2c1ee8e..9960df6 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -367,7 +367,7 @@
if (mWindowManager.isRotationFrozen()) {
// Calling out with a lock held is fine since if the system
// process is gone the client calling in will be killed.
- mInitialFrozenRotation = mWindowManager.getRotation();
+ mInitialFrozenRotation = mWindowManager.getDefaultDisplayRotation();
}
} catch (RemoteException re) {
/* ignore */
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 2e0ca02..1f2ed00 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -24,6 +24,8 @@
import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillType;
import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import java.util.ArrayList;
import java.util.Arrays;
@@ -45,6 +47,7 @@
boolean mHaveData;
ComponentName mActivityComponent;
+ private boolean mIsHomeActivity;
final ArrayList<WindowNode> mWindowNodes = new ArrayList<>();
@@ -56,10 +59,54 @@
Rect mTmpRect = new Rect();
boolean mSanitizeOnWrite = false;
+ private long mAcquisitionStartTime;
+ private long mAcquisitionEndTime;
static final int TRANSACTION_XFER = Binder.FIRST_CALL_TRANSACTION+1;
static final String DESCRIPTOR = "android.app.AssistStructure";
+ /** @hide */
+ public void setAcquisitionStartTime(long acquisitionStartTime) {
+ mAcquisitionStartTime = acquisitionStartTime;
+ }
+
+ /** @hide */
+ public void setAcquisitionEndTime(long acquisitionEndTime) {
+ mAcquisitionEndTime = acquisitionEndTime;
+ }
+
+ /**
+ * @hide
+ * Set the home activity flag.
+ */
+ public void setHomeActivity(boolean isHomeActivity) {
+ mIsHomeActivity = isHomeActivity;
+ }
+
+ /**
+ * Returns the time when the activity started generating assist data to build the
+ * AssistStructure. The time is as specified by {@link SystemClock#uptimeMillis()}.
+ *
+ * @see #getAcquisitionEndTime()
+ * @return Returns the acquisition start time of the assist data, in milliseconds.
+ */
+ public long getAcquisitionStartTime() {
+ ensureData();
+ return mAcquisitionStartTime;
+ }
+
+ /**
+ * Returns the time when the activity finished generating assist data to build the
+ * AssistStructure. The time is as specified by {@link SystemClock#uptimeMillis()}.
+ *
+ * @see #getAcquisitionStartTime()
+ * @return Returns the acquisition end time of the assist data, in milliseconds.
+ */
+ public long getAcquisitionEndTime() {
+ ensureData();
+ return mAcquisitionEndTime;
+ }
+
final static class SendChannel extends Binder {
volatile AssistStructure mAssistStructure;
@@ -123,6 +170,8 @@
mSanitizeOnWrite = as.mSanitizeOnWrite;
mWriteStructure = as.waitForReady();
ComponentName.writeToParcel(as.mActivityComponent, out);
+ out.writeLong(as.mAcquisitionStartTime);
+ out.writeLong(as.mAcquisitionEndTime);
mNumWindows = as.mWindowNodes.size();
if (mWriteStructure && mNumWindows > 0) {
out.writeInt(mNumWindows);
@@ -275,6 +324,8 @@
void go() {
fetchData();
mActivityComponent = ComponentName.readFromParcel(mCurParcel);
+ mAcquisitionStartTime = mCurParcel.readLong();
+ mAcquisitionEndTime = mCurParcel.readLong();
final int N = mCurParcel.readInt();
if (N > 0) {
if (DEBUG_PARCEL) Log.d(TAG, "Creating PooledStringReader @ "
@@ -424,7 +475,7 @@
if ((root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) != 0) {
if (forAutoFill) {
// NOTE: flags are currently not supported, hence 0
- view.onProvideAutoFillStructure(builder, 0);
+ view.onProvideAutofillStructure(builder, 0);
} else {
// This is a secure window, so it doesn't want a screenshot, and that
// means we should also not copy out its view hierarchy for Assist
@@ -435,7 +486,7 @@
}
if (forAutoFill) {
// NOTE: flags are currently not supported, hence 0
- view.dispatchProvideAutoFillStructure(builder, 0);
+ view.dispatchProvideAutofillStructure(builder, 0);
} else {
view.dispatchProvideStructure(builder);
}
@@ -537,11 +588,11 @@
// TODO(b/33197203): once we have more flags, it might be better to store the individual
// fields (viewId and childId) of the field.
- AutoFillId mAutoFillId;
+ AutofillId mAutofillId;
@View.AutofillType int mAutofillType;
- @View.AutoFillHint int mAutoFillHint;
- AutoFillValue mAutoFillValue;
- String[] mAutoFillOptions;
+ @View.AutofillHint int mAutofillHint;
+ AutofillValue mAutofillValue;
+ String[] mAutofillOptions;
boolean mSanitized;
int mX;
@@ -567,12 +618,13 @@
static final int FLAGS_ACCESSIBILITY_FOCUSED = 0x00001000;
static final int FLAGS_ACTIVATED = 0x00002000;
static final int FLAGS_CONTEXT_CLICKABLE = 0x00004000;
+ static final int FLAGS_OPAQUE = 0x00008000;
- // TODO(b/33197203): auto-fill data is made of many fields and ideally we should verify
+ // TODO(b/33197203): autofill data is made of many fields and ideally we should verify
// one-by-one to optimize what's sent over, but there isn't enough flag bits for that, we'd
// need to create a 'flags2' or 'autoFillFlags' field and add these flags there.
// So, to keep thinkg simpler for now, let's just use on flag for all of them...
- static final int FLAGS_HAS_AUTO_FILL_DATA = 0x80000000;
+ static final int FLAGS_HAS_AUTOFILL_DATA = 0x80000000;
static final int FLAGS_HAS_MATRIX = 0x40000000;
static final int FLAGS_HAS_ALPHA = 0x20000000;
static final int FLAGS_HAS_ELEVATION = 0x10000000;
@@ -620,13 +672,13 @@
}
}
}
- if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0) {
+ if ((flags&FLAGS_HAS_AUTOFILL_DATA) != 0) {
mSanitized = in.readInt() == 1;
- mAutoFillId = in.readParcelable(null);
+ mAutofillId = in.readParcelable(null);
mAutofillType = in.readInt();
- mAutoFillHint = in.readInt();
- mAutoFillValue = in.readParcelable(null);
- mAutoFillOptions = in.readStringArray();
+ mAutofillHint = in.readInt();
+ mAutofillValue = in.readParcelable(null);
+ mAutofillOptions = in.readStringArray();
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
mX = in.readInt();
@@ -686,15 +738,15 @@
int writeSelfToParcel(Parcel out, PooledStringWriter pwriter, boolean sanitizeOnWrite,
float[] tmpMatrix) {
- // Guard used to skip non-sanitized data when writing for auto-fill.
+ // Guard used to skip non-sanitized data when writing for autofill.
boolean writeSensitive = true;
int flags = mFlags & ~FLAGS_ALL_CONTROL;
if (mId != View.NO_ID) {
flags |= FLAGS_HAS_ID;
}
- if (mAutoFillId != null) {
- flags |= FLAGS_HAS_AUTO_FILL_DATA;
+ if (mAutofillId != null) {
+ flags |= FLAGS_HAS_AUTOFILL_DATA;
}
if ((mX&~0x7fff) != 0 || (mY&~0x7fff) != 0
|| (mWidth&~0x7fff) != 0 | (mHeight&~0x7fff) != 0) {
@@ -737,8 +789,8 @@
pwriter.writeString(mClassName);
int writtenFlags = flags;
- if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0 && (mSanitized || !sanitizeOnWrite)) {
- // Remove 'checked' from sanitized auto-fill request.
+ if ((flags&FLAGS_HAS_AUTOFILL_DATA) != 0 && (mSanitized || !sanitizeOnWrite)) {
+ // Remove 'checked' from sanitized autofill request.
writtenFlags = flags & ~FLAGS_CHECKED;
}
@@ -753,15 +805,15 @@
}
}
}
- if ((flags&FLAGS_HAS_AUTO_FILL_DATA) != 0) {
+ if ((flags&FLAGS_HAS_AUTOFILL_DATA) != 0) {
writeSensitive = mSanitized || !sanitizeOnWrite;
out.writeInt(mSanitized ? 1 : 0);
- out.writeParcelable(mAutoFillId, 0);
+ out.writeParcelable(mAutofillId, 0);
out.writeInt(mAutofillType);
- out.writeInt(mAutoFillHint);
- final AutoFillValue sanitizedValue = writeSensitive ? mAutoFillValue : null;
+ out.writeInt(mAutofillHint);
+ final AutofillValue sanitizedValue = writeSensitive ? mAutofillValue : null;
out.writeParcelable(sanitizedValue, 0);
- out.writeStringArray(mAutoFillOptions);
+ out.writeStringArray(mAutofillOptions);
}
if ((flags&FLAGS_HAS_LARGE_COORDS) != 0) {
out.writeInt(mX);
@@ -840,17 +892,26 @@
}
/**
- * Gets the id that can be used to auto-fill the view contents.
- *
- * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
- * for assist.
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use getAutoFilltype
*/
- // TODO(b/33197203, b/33802548): add CTS/unit test
+ @Deprecated
public AutoFillId getAutoFillId() {
- return mAutoFillId;
+ return AutoFillId.forDaRealId(mAutofillId);
}
/**
+ * Gets the id that can be used to autofill the view contents.
+ *
+ * <p>It's only set when the {@link AssistStructure} is used for autofilling purposes, not
+ * for assist.
+ */
+ public AutofillId getAutofillId() {
+ return mAutofillId;
+ }
+
+ /**
+ * @hide
* @deprecated TODO(b/35956626): remove once clients use getAutoFilltype()
*/
@Deprecated
@@ -870,9 +931,9 @@
}
/**
- * Gets the the type of value that can be used to auto-fill the view contents.
+ * Gets the the type of value that can be used to autofill the view contents.
*
- * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * <p>It's only set when the {@link AssistStructure} is used for autofilling purposes, not
* for assist.
*/
public @View.AutofillType int getAutofillType() {
@@ -880,41 +941,48 @@
}
/**
- * Describes the content of a view so that a auto-fill service can fill in the appropriate
+ * Describes the content of a view so that a autofill service can fill in the appropriate
* data.
*
- * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * <p>It's only set when the {@link AssistStructure} is used for autofilling purposes, not
* for assist.</p>
*
* @return The hint for this view
*/
- // TODO(b/35364993): add CTS/unit test
- @View.AutoFillHint public int getAutoFillHint() {
- return mAutoFillHint;
+ @View.AutofillHint public int getAutoFillHint() {
+ return mAutofillHint;
+ }
+
+ /**
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use getAutoFilltype
+ */
+ @Deprecated
+ public AutoFillValue getAutoFillValue() {
+ return AutoFillValue.forDaRealValue(mAutofillValue);
}
/**
* Gets the the value of this view.
*
- * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * <p>It's only set when the {@link AssistStructure} is used for autofilling purposes, not
* for assist.
*/
- // TODO(b/33197203, b/33802548): add CTS/unit test
- public AutoFillValue getAutoFillValue() {
- return mAutoFillValue;
+ public AutofillValue getAutofillValue() {
+ return mAutofillValue;
}
/**
- * Gets the options that can be used to auto-fill this structure.
+ * Gets the options that can be used to autofill this structure.
*
- * <p>Typically used by nodes whose {@link AutoFillType} is a list to indicate the meaning
- * of each possible value in the list.
+ * <p>Typically used by nodes whose {@link View#getAutofillType()} is a list to indicate
+ * the meaning of each possible value in the list.
*
- * <p>It's only set when the {@link AssistStructure} is used for auto-filling purposes, not
+ * <p>It's only set when the {@link AssistStructure} is used for autofilling purposes, not
* for assist.
*/
- public String[] getAutoFillOptions() {
- return mAutoFillOptions;
+ public String[] getAutofillOptions() {
+ return mAutofillOptions;
}
/**
@@ -932,18 +1000,18 @@
}
/**
- * Updates the {@link AutoFillValue} of this structure.
+ * Updates the {@link AutofillValue} of this structure.
*
* <p>Should be used just before sending the structure to the
- * {@link android.service.autofill.AutoFillService} for saving, since it will override the
+ * {@link android.service.autofill.AutofillService} for saving, since it will override the
* initial value.
*
* @hide
*/
- public void updateAutoFillValue(AutoFillValue value) {
- mAutoFillValue = value;
+ public void updateAutofillValue(AutofillValue value) {
+ mAutofillValue = value;
// TODO(b/33197203, b/33802548): decide whether to set text as well (so it would work
- // with "legacy" views) or just the auto-fill value
+ // with "legacy" views) or just the autofill value
final CharSequence text = value.getTextValue();
if (text != null) {
mText.mText = text;
@@ -1102,6 +1170,11 @@
}
/**
+ * Returns true if this node is opaque.
+ */
+ public boolean isOpaque() { return (mFlags&ViewNode.FLAGS_OPAQUE) != 0; }
+
+ /**
* Returns true if this node is something the user can perform a long click/press on.
*/
public boolean isLongClickable() {
@@ -1142,8 +1215,8 @@
* <li>Child nodes that represent hyperlinks (contains the hyperlink URL).
* </ol>
*
- * <strong>WARNING:</strong> a {@link android.service.autofill.AutoFillService} should only
- * use this URL for auto-fill purposes when it trusts the app generating it (i.e., the app
+ * <strong>WARNING:</strong> a {@link android.service.autofill.AutofillService} should only
+ * use this URL for autofill purposes when it trusts the app generating it (i.e., the app
* defined by {@link AssistStructure#getActivityComponent()}).
*/
public String getUrl() {
@@ -1394,6 +1467,12 @@
}
@Override
+ public void setOpaque(boolean opaque) {
+ mNode.mFlags = (mNode.mFlags & ~ViewNode.FLAGS_OPAQUE)
+ | (opaque ? ViewNode.FLAGS_OPAQUE : 0);
+ }
+
+ @Override
public void setClassName(String className) {
mNode.mClassName = className;
}
@@ -1504,15 +1583,15 @@
return mNode.mChildren != null ? mNode.mChildren.length : 0;
}
- private void setAutoFillId(ViewNode child, boolean forAutoFill, int virtualId) {
+ private void setAutofillId(ViewNode child, boolean forAutoFill, int virtualId) {
if (forAutoFill) {
- child.mAutoFillId = new AutoFillId(mNode.mAutoFillId, virtualId);
+ child.mAutofillId = new AutofillId(mNode.mAutofillId, virtualId);
}
}
private ViewStructure newChild(int index, boolean forAutoFill, int virtualId, int flags) {
ViewNode node = new ViewNode();
- setAutoFillId(node, forAutoFill, virtualId);
+ setAutofillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
return new ViewNodeBuilder(mAssist, node, false);
}
@@ -1520,7 +1599,7 @@
private ViewStructure asyncNewChild(int index, boolean forAutoFill, int virtualId) {
synchronized (mAssist) {
ViewNode node = new ViewNode();
- setAutoFillId(node, forAutoFill, virtualId);
+ setAutofillId(node, forAutoFill, virtualId);
mNode.mChildren[index] = node;
ViewNodeBuilder builder = new ViewNodeBuilder(mAssist, node, true);
mAssist.mPendingAsyncChildren.add(builder);
@@ -1535,7 +1614,7 @@
// TODO(b/33197203, b/33802548): add CTS/unit test
@Override
- public ViewStructure newChildForAutoFill(int index, int virtualId, int flags) {
+ public ViewStructure newChildForAutofill(int index, int virtualId, int flags) {
return newChild(index, true, virtualId, flags);
}
@@ -1545,7 +1624,7 @@
}
@Override
- public ViewStructure asyncNewChildForAutoFill(int index, int virtualId, int flags) {
+ public ViewStructure asyncNewChildForAutofill(int index, int virtualId, int flags) {
return asyncNewChild(index, true, virtualId);
}
@@ -1569,28 +1648,13 @@
}
@Override
- public void setAutoFillId(int viewId) {
- mNode.mAutoFillId = new AutoFillId(viewId);
+ public void setAutofillId(int viewId) {
+ mNode.mAutofillId = new AutofillId(viewId);
}
@Override
- public AutoFillId getAutoFillId() {
- return mNode.mAutoFillId;
- }
-
- @Override
- public void setAutoFillType(AutoFillType type) {
- if (type == null) return;
-
- if (type.isText()) {
- mNode.mAutofillType = View.AUTOFILL_TYPE_TEXT;
- } else if (type.isToggle()) {
- mNode.mAutofillType = View.AUTOFILL_TYPE_TOGGLE;
- } else if (type.isList()) {
- mNode.mAutofillType = View.AUTOFILL_TYPE_LIST;
- } else if (type.isDate()) {
- mNode.mAutofillType = View.AUTOFILL_TYPE_DATE;
- }
+ public AutofillId getAutofillId() {
+ return mNode.mAutofillId;
}
@Override
@@ -1599,18 +1663,18 @@
}
@Override
- public void setAutoFillHint(@View.AutoFillHint int hint) {
- mNode.mAutoFillHint = hint;
+ public void setAutofillHint(@View.AutofillHint int hint) {
+ mNode.mAutofillHint = hint;
}
@Override
- public void setAutoFillValue(AutoFillValue value) {
- mNode.mAutoFillValue = value;
+ public void setAutofillValue(AutofillValue value) {
+ mNode.mAutofillValue = value;
}
@Override
- public void setAutoFillOptions(String[] options) {
- mNode.mAutoFillOptions = options;
+ public void setAutofillOptions(String[] options) {
+ mNode.mAutofillOptions = options;
}
@Override
@@ -1648,13 +1712,14 @@
/** @hide */
public AssistStructure(Parcel in) {
+ mIsHomeActivity = in.readInt() == 1;
mReceiveChannel = in.readStrongBinder();
}
/**
* Helper method used to sanitize the structure before it's written to a parcel.
*
- * <p>Used just on auto-fill.
+ * <p>Used just on autofill.
* @hide
*/
public void sanitizeForParceling(boolean sanitize) {
@@ -1739,16 +1804,16 @@
if (node.isAssistBlocked()) {
Log.i(TAG, prefix + " BLOCKED");
}
- AutoFillId autoFillId = node.getAutoFillId();
- if (autoFillId == null) {
- Log.i(TAG, prefix + " NO AUTO-FILL ID");
+ AutofillId autofillId = node.getAutofillId();
+ if (autofillId == null) {
+ Log.i(TAG, prefix + " NO autofill ID");
} else {
- Log.i(TAG, prefix + "AutoFill info: id= " + autoFillId
+ Log.i(TAG, prefix + "Autofill info: id= " + autofillId
+ ", type=" + node.getAutofillType()
- + ", options=" + Arrays.toString(node.getAutoFillOptions())
+ + ", options=" + Arrays.toString(node.getAutofillOptions())
+ ", inputType=" + node.getInputType()
+ ", hint=" + Integer.toHexString(node.getAutoFillHint())
- + ", value=" + node.getAutoFillValue()
+ + ", value=" + node.getAutofillValue()
+ ", sanitized=" + node.isSanitized());
}
@@ -1772,6 +1837,15 @@
}
/**
+ * Returns whether the activity associated with this AssistStructure was the home activity
+ * at the time the assist data was acquired.
+ * @return Whether the activity was the home activity.
+ */
+ public boolean isHomeActivity() {
+ return mIsHomeActivity;
+ }
+
+ /**
* Return the number of window contents that have been collected in this assist data.
*/
public int getWindowNodeCount() {
@@ -1833,6 +1907,7 @@
@Override
public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mIsHomeActivity ? 1 : 0);
if (mHaveData) {
// This object holds its data. We want to write a send channel that the
// other side can use to retrieve that data.
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 76c0293..5d1550f 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -24,6 +24,7 @@
boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 081ccd9..8276229 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -195,4 +195,13 @@
throw e.rethrowFromSystemServer();
}
}
+
+ /** {@hide} */
+ public long getCacheQuotaBytes(String volumeUuid, int uid) {
+ try {
+ return mService.getCacheQuotaBytes(volumeUuid, uid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index d36692a..488511b 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1447,9 +1447,9 @@
}
/**
- * Return true if LE Periodic Advertising feature is supported.
+ * Return true if LE Extended Advertising feature is supported.
*
- * @return true if chipset supports LE Periodic Advertising feature
+ * @return true if chipset supports LE Extended Advertising feature
*/
public boolean isLeExtendedAdvertisingSupported() {
if (!getLeAccess()) return false;
diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
index 03a01e1..453dd70 100644
--- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java
+++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
@@ -284,7 +284,7 @@
*
* @param isAnonymous wether anonymous advertising should be used.
*/
- public Builder setAnonymouus(boolean isAnonymous) {
+ public Builder setAnonymous(boolean isAnonymous) {
this.isAnonymous = isAnonymous;
return this;
}
diff --git a/core/java/android/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java
index b89c64a..457096b 100644
--- a/core/java/android/bluetooth/le/ScanFilter.java
+++ b/core/java/android/bluetooth/le/ScanFilter.java
@@ -23,6 +23,8 @@
import android.os.ParcelUuid;
import android.os.Parcelable;
+import com.android.internal.util.BitUtils;
+
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -345,15 +347,7 @@
// Check if the uuid pattern matches the particular service uuid.
private static boolean matchesServiceUuid(UUID uuid, UUID mask, UUID data) {
- if (mask == null) {
- return uuid.equals(data);
- }
- if ((uuid.getLeastSignificantBits() & mask.getLeastSignificantBits()) !=
- (data.getLeastSignificantBits() & mask.getLeastSignificantBits())) {
- return false;
- }
- return ((uuid.getMostSignificantBits() & mask.getMostSignificantBits()) ==
- (data.getMostSignificantBits() & mask.getMostSignificantBits()));
+ return BitUtils.maskedEquals(data, uuid, mask);
}
// Check whether the data pattern matches the parsed data.
diff --git a/core/java/android/bluetooth/le/ScanResult.java b/core/java/android/bluetooth/le/ScanResult.java
index 583ddd2..745cd16 100644
--- a/core/java/android/bluetooth/le/ScanResult.java
+++ b/core/java/android/bluetooth/le/ScanResult.java
@@ -67,12 +67,12 @@
public static final int SID_NOT_PRESENT = 0xFF;
/**
- * Mask for checking wether event type represents legacy advertisement.
+ * Mask for checking whether event type represents legacy advertisement.
*/
private static final int ET_LEGACY_MASK = 0x10;
/**
- * Mask for checking wether event type represents connectable advertisement.
+ * Mask for checking whether event type represents connectable advertisement.
*/
private static final int ET_CONNECTABLE_MASK = 0x01;
diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java
index d477f43..56f5d44 100644
--- a/core/java/android/companion/AssociationRequest.java
+++ b/core/java/android/companion/AssociationRequest.java
@@ -16,20 +16,21 @@
package android.companion;
-import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.OneTimeUseBuilder;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
+import com.android.internal.util.ArrayUtils;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* A request for the user to select a companion device to associate with.
*
- * You can optionally set a {@link Builder#setDeviceFilter filter} for which devices to show to the
+ * You can optionally set {@link Builder#addDeviceFilter filters} for which devices to show to the
* user to select from.
* The exact type and fields of the filter you can set depend on the
* medium type. See {@link Builder}'s static factory methods for specific protocols that are
@@ -37,38 +38,22 @@
*
* You can also set {@link Builder#setSingleDevice single device} to request a popup with single
* device to be shown instead of a list to choose from
- *
- * @param <F> Device filter type
*/
-public final class AssociationRequest<F extends DeviceFilter> implements Parcelable {
-
- /** @hide */
- public static final int MEDIUM_TYPE_BLUETOOTH = 0;
- /** @hide */
- public static final int MEDIUM_TYPE_BLUETOOTH_LE = 1;
- /** @hide */
- public static final int MEDIUM_TYPE_WIFI = 2;
-
- /** @hide */
- @IntDef({MEDIUM_TYPE_BLUETOOTH, MEDIUM_TYPE_BLUETOOTH_LE, MEDIUM_TYPE_WIFI})
- @Retention(RetentionPolicy.SOURCE)
- public @interface MediumType {}
+public final class AssociationRequest implements Parcelable {
private final boolean mSingleDevice;
- private final int mMediumType;
- private final F mDeviceFilter;
+ private final List<DeviceFilter<?>> mDeviceFilters;
- private AssociationRequest(boolean singleDevice, int mMediumType, F deviceFilter) {
+ private AssociationRequest(
+ boolean singleDevice, @Nullable List<DeviceFilter<?>> deviceFilters) {
this.mSingleDevice = singleDevice;
- this.mMediumType = mMediumType;
- this.mDeviceFilter = deviceFilter;
+ this.mDeviceFilters = ArrayUtils.emptyIfNull(deviceFilters);
}
private AssociationRequest(Parcel in) {
this(
in.readByte() != 0,
- in.readInt(),
- in.readParcelable(AssociationRequest.class.getClassLoader()));
+ in.readParcelableList(new ArrayList<>(), AssociationRequest.class.getClassLoader()));
}
/** @hide */
@@ -77,22 +62,15 @@
}
/** @hide */
- @MediumType
- public int getMediumType() {
- return mMediumType;
- }
-
- /** @hide */
- @Nullable
- public F getDeviceFilter() {
- return mDeviceFilter;
+ @NonNull
+ public List<DeviceFilter<?>> getDeviceFilters() {
+ return mDeviceFilters;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte((byte) (mSingleDevice ? 1 : 0));
- dest.writeInt(mMediumType);
- dest.writeParcelable(mDeviceFilter, flags);
+ dest.writeParcelableList(mDeviceFilters, flags);
}
@Override
@@ -114,45 +92,19 @@
/**
* A builder for {@link AssociationRequest}
- *
- * @param <F> the type of filter for the request.
*/
- public static final class Builder<F extends DeviceFilter>
- extends OneTimeUseBuilder<AssociationRequest<F>> {
+ public static final class Builder extends OneTimeUseBuilder<AssociationRequest> {
private boolean mSingleDevice = false;
- @MediumType private int mMediumType;
- @Nullable private F mDeviceFilter = null;
+ @Nullable private ArrayList<DeviceFilter<?>> mDeviceFilters = null;
- private Builder() {}
-
- /**
- * Create a new builder for an association request with a Bluetooth LE device
- */
- @NonNull
- public static Builder<BluetoothLEDeviceFilter> createForBluetoothLEDevice() {
- return new Builder<BluetoothLEDeviceFilter>()
- .setMediumType(MEDIUM_TYPE_BLUETOOTH_LE);
- }
-
- /**
- * Create a new builder for an association request with a Bluetooth(non-LE) device
- */
- @NonNull
- public static Builder<BluetoothDeviceFilter> createForBluetoothDevice() {
- return new Builder<BluetoothDeviceFilter>()
- .setMediumType(MEDIUM_TYPE_BLUETOOTH);
- }
-
- //TODO implement, once specific filter classes are available
-// public static Builder<> createForWiFiDevice()
-// public static Builder<> createForNanDevice()
+ public Builder() {}
/**
* @param singleDevice if true, scanning for a device will stop as soon as at least one
* fitting device is found
*/
@NonNull
- public Builder<F> setSingleDevice(boolean singleDevice) {
+ public Builder setSingleDevice(boolean singleDevice) {
checkNotUsed();
this.mSingleDevice = singleDevice;
return this;
@@ -163,29 +115,20 @@
* user
*/
@NonNull
- public Builder<F> setDeviceFilter(@Nullable F deviceFilter) {
+ public Builder addDeviceFilter(@Nullable DeviceFilter<?> deviceFilter) {
checkNotUsed();
- this.mDeviceFilter = deviceFilter;
- return this;
- }
-
- /**
- * @param deviceType A type of medium over which to discover devices
- *
- * @see MediumType
- */
- @NonNull
- private Builder<F> setMediumType(@MediumType int deviceType) {
- mMediumType = deviceType;
+ if (deviceFilter != null) {
+ mDeviceFilters = ArrayUtils.add(mDeviceFilters, deviceFilter);
+ }
return this;
}
/** @inheritDoc */
@NonNull
@Override
- public AssociationRequest<F> build() {
+ public AssociationRequest build() {
markUsed();
- return new AssociationRequest<>(mSingleDevice, mMediumType, mDeviceFilter);
+ return new AssociationRequest(mSingleDevice, mDeviceFilters);
}
}
}
diff --git a/core/java/android/companion/BluetoothDeviceFilter.java b/core/java/android/companion/BluetoothDeviceFilter.java
index 5a69955..0f16b7b 100644
--- a/core/java/android/companion/BluetoothDeviceFilter.java
+++ b/core/java/android/companion/BluetoothDeviceFilter.java
@@ -16,6 +16,7 @@
package android.companion;
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal;
import static android.companion.BluetoothDeviceFilterUtils.matchesAddress;
import static android.companion.BluetoothDeviceFilterUtils.matchesName;
import static android.companion.BluetoothDeviceFilterUtils.matchesServiceUuids;
@@ -40,8 +41,6 @@
*/
public final class BluetoothDeviceFilter implements DeviceFilter<BluetoothDevice> {
- private static BluetoothDeviceFilter NO_OP;
-
private final Pattern mNamePattern;
private final String mAddress;
private final List<ParcelUuid> mServiceUuids;
@@ -67,22 +66,7 @@
}
private static List<ParcelUuid> readUuids(Parcel in) {
- final ArrayList<ParcelUuid> list = new ArrayList<>();
- in.readParcelableList(list, ParcelUuid.class.getClassLoader());
- return list;
- }
-
- /** @hide */
- @NonNull
- public static BluetoothDeviceFilter nullsafe(@Nullable BluetoothDeviceFilter nullable) {
- return nullable != null ? nullable : noOp();
- }
-
- /** @hide */
- @NonNull
- public static BluetoothDeviceFilter noOp() {
- if (NO_OP == null) NO_OP = new Builder().build();
- return NO_OP;
+ return in.readParcelableList(new ArrayList<>(), ParcelUuid.class.getClassLoader());
}
/** @hide */
@@ -94,6 +78,18 @@
}
/** @hide */
+ @Override
+ public String getDeviceDisplayName(BluetoothDevice device) {
+ return getDeviceDisplayNameInternal(device);
+ }
+
+ /** @hide */
+ @Override
+ public int getMediumType() {
+ return DeviceFilter.MEDIUM_TYPE_BLUETOOTH;
+ }
+
+ /** @hide */
@Nullable
public Pattern getNamePattern() {
return mNamePattern;
diff --git a/core/java/android/companion/BluetoothDeviceFilterUtils.java b/core/java/android/companion/BluetoothDeviceFilterUtils.java
index 289f995..8a316f1 100644
--- a/core/java/android/companion/BluetoothDeviceFilterUtils.java
+++ b/core/java/android/companion/BluetoothDeviceFilterUtils.java
@@ -23,7 +23,9 @@
import android.annotation.Nullable;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanFilter;
+import android.net.wifi.ScanResult;
import android.os.ParcelUuid;
+import android.os.Parcelable;
import android.util.Log;
import java.util.Arrays;
@@ -96,12 +98,47 @@
return result;
}
- private static void debugLogMatchResult(
- boolean result, BluetoothDevice device, Object criteria) {
- Log.i(LOG_TAG, getDeviceDisplayName(device) + (result ? " ~ " : " !~ ") + criteria);
+ static boolean matchesName(@Nullable Pattern namePattern, ScanResult device) {
+ boolean result;
+ if (namePattern == null) {
+ result = true;
+ } else if (device == null) {
+ result = false;
+ } else {
+ final String name = device.SSID;
+ result = name != null && namePattern.matcher(name).find();
+ }
+ if (DEBUG) debugLogMatchResult(result, device, namePattern);
+ return result;
}
- public static String getDeviceDisplayName(@NonNull BluetoothDevice device) {
+ private static void debugLogMatchResult(
+ boolean result, BluetoothDevice device, Object criteria) {
+ Log.i(LOG_TAG, getDeviceDisplayNameInternal(device) + (result ? " ~ " : " !~ ") + criteria);
+ }
+
+ private static void debugLogMatchResult(
+ boolean result, ScanResult device, Object criteria) {
+ Log.i(LOG_TAG, getDeviceDisplayNameInternal(device) + (result ? " ~ " : " !~ ") + criteria);
+ }
+
+ public static String getDeviceDisplayNameInternal(@NonNull BluetoothDevice device) {
return firstNotEmpty(device.getAliasName(), device.getAddress());
}
+
+ public static String getDeviceDisplayNameInternal(@NonNull ScanResult device) {
+ return firstNotEmpty(device.SSID, device.BSSID);
+ }
+
+ public static String getDeviceMacAddress(@NonNull Parcelable device) {
+ if (device instanceof BluetoothDevice) {
+ return ((BluetoothDevice) device).getAddress();
+ } else if (device instanceof ScanResult) {
+ return ((ScanResult) device).BSSID;
+ } else if (device instanceof android.bluetooth.le.ScanResult) {
+ return getDeviceMacAddress(((android.bluetooth.le.ScanResult) device).getDevice());
+ } else {
+ throw new IllegalArgumentException("Unknown device type: " + device);
+ }
+ }
}
diff --git a/core/java/android/companion/BluetoothLEDeviceFilter.java b/core/java/android/companion/BluetoothLEDeviceFilter.java
index 4a481ca..e057fbc 100644
--- a/core/java/android/companion/BluetoothLEDeviceFilter.java
+++ b/core/java/android/companion/BluetoothLEDeviceFilter.java
@@ -16,18 +16,25 @@
package android.companion;
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal;
import static android.companion.BluetoothDeviceFilterUtils.patternFromString;
import static android.companion.BluetoothDeviceFilterUtils.patternToString;
+import static com.android.internal.util.Preconditions.checkArgument;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SuppressLint;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanRecord;
+import android.bluetooth.le.ScanResult;
import android.os.Parcel;
import android.provider.OneTimeUseBuilder;
+import android.text.TextUtils;
+import com.android.internal.util.BitUtils;
import com.android.internal.util.ObjectUtils;
+import com.android.internal.util.Preconditions;
import java.util.regex.Pattern;
@@ -36,36 +43,33 @@
*
* @see ScanFilter
*/
-public final class BluetoothLEDeviceFilter implements DeviceFilter<BluetoothDevice> {
+public final class BluetoothLEDeviceFilter implements DeviceFilter<ScanResult> {
- private static BluetoothLEDeviceFilter NO_OP;
+ private static final int RENAME_PREFIX_LENGTH_LIMIT = 10;
private final Pattern mNamePattern;
private final ScanFilter mScanFilter;
+ private final byte[] mRawDataFilter;
+ private final byte[] mRawDataFilterMask;
+ private final String mRenamePrefix;
+ private final String mRenameSuffix;
+ private final int mRenameBytesFrom;
+ private final int mRenameBytesTo;
+ private final boolean mRenameBytesReverseOrder;
- private BluetoothLEDeviceFilter(Pattern namePattern, ScanFilter scanFilter) {
+ private BluetoothLEDeviceFilter(Pattern namePattern, ScanFilter scanFilter,
+ byte[] rawDataFilter, byte[] rawDataFilterMask, String renamePrefix,
+ String renameSuffix, int renameBytesFrom, int renameBytesTo,
+ boolean renameBytesReverseOrder) {
mNamePattern = namePattern;
mScanFilter = ObjectUtils.firstNotNull(scanFilter, ScanFilter.EMPTY);
- }
-
- @SuppressLint("ParcelClassLoader")
- private BluetoothLEDeviceFilter(Parcel in) {
- this(
- patternFromString(in.readString()),
- in.readParcelable(null));
- }
-
- /** @hide */
- @NonNull
- public static BluetoothLEDeviceFilter nullsafe(@Nullable BluetoothLEDeviceFilter nullable) {
- return nullable != null ? nullable : noOp();
- }
-
- /** @hide */
- @NonNull
- public static BluetoothLEDeviceFilter noOp() {
- if (NO_OP == null) NO_OP = new Builder().build();
- return NO_OP;
+ mRawDataFilter = rawDataFilter;
+ mRawDataFilterMask = rawDataFilterMask;
+ mRenamePrefix = renamePrefix;
+ mRenameSuffix = renameSuffix;
+ mRenameBytesFrom = renameBytesFrom;
+ mRenameBytesTo = renameBytesTo;
+ mRenameBytesReverseOrder = renameBytesReverseOrder;
}
/** @hide */
@@ -81,12 +85,80 @@
}
/** @hide */
+ @Nullable
+ public byte[] getRawDataFilter() {
+ return mRawDataFilter;
+ }
+
+ /** @hide */
+ @Nullable
+ public byte[] getRawDataFilterMask() {
+ return mRawDataFilterMask;
+ }
+
+ /** @hide */
+ @Nullable
+ public String getRenamePrefix() {
+ return mRenamePrefix;
+ }
+
+ /** @hide */
+ @Nullable
+ public String getRenameSuffix() {
+ return mRenameSuffix;
+ }
+
+ /** @hide */
+ public int getRenameBytesFrom() {
+ return mRenameBytesFrom;
+ }
+
+ /** @hide */
+ public int getRenameBytesTo() {
+ return mRenameBytesTo;
+ }
+
+ /** @hide */
+ public boolean isRenameBytesReverseOrder() {
+ return mRenameBytesReverseOrder;
+ }
+
+ /** @hide */
@Override
- public boolean matches(BluetoothDevice device) {
+ @Nullable
+ public String getDeviceDisplayName(ScanResult sr) {
+ if (mRenameBytesFrom < 0) return getDeviceDisplayNameInternal(sr.getDevice());
+ final byte[] bytes = sr.getScanRecord().getBytes();
+ final StringBuilder sb = new StringBuilder(TextUtils.emptyIfNull(mRenamePrefix));
+ int startInclusive = mRenameBytesFrom;
+ int endInclusive = mRenameBytesTo - 1;
+ int initial = mRenameBytesReverseOrder ? endInclusive : startInclusive;
+ int step = mRenameBytesReverseOrder ? -1 : 1;
+ for (int i = initial; startInclusive <= i && i <= endInclusive; i+=step) {
+ sb.append(Byte.toHexString(bytes[i], true));
+ }
+ return sb.append(TextUtils.emptyIfNull(mRenameSuffix)).toString();
+ }
+
+ /** @hide */
+ @Override
+ public boolean matches(ScanResult device) {
+ return matches(device.getDevice())
+ && BitUtils.maskedEquals(device.getScanRecord().getBytes(),
+ mRawDataFilter, mRawDataFilterMask);
+ }
+
+ private boolean matches(BluetoothDevice device) {
return BluetoothDeviceFilterUtils.matches(getScanFilter(), device)
&& BluetoothDeviceFilterUtils.matchesName(getNamePattern(), device);
}
+ /** @hide */
+ @Override
+ public int getMediumType() {
+ return DeviceFilter.MEDIUM_TYPE_BLUETOOTH_LE;
+ }
+
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(patternToString(getNamePattern()));
@@ -102,7 +174,13 @@
= new Creator<BluetoothLEDeviceFilter>() {
@Override
public BluetoothLEDeviceFilter createFromParcel(Parcel in) {
- return new BluetoothLEDeviceFilter(in);
+ return new BluetoothLEDeviceFilter.Builder()
+ .setNamePattern(patternFromString(in.readString()))
+ .setScanFilter(in.readParcelable(null))
+ .setRawDataFilter(in.readBlob(), in.readBlob())
+ .setRename(in.readString(), in.readString(),
+ in.readInt(), in.readInt(), in.readBoolean())
+ .build();
}
@Override
@@ -111,16 +189,28 @@
}
};
+ public static int getRenamePrefixLengthLimit() {
+ return RENAME_PREFIX_LENGTH_LIMIT;
+ }
+
/**
* Builder for {@link BluetoothLEDeviceFilter}
*/
public static final class Builder extends OneTimeUseBuilder<BluetoothLEDeviceFilter> {
private ScanFilter mScanFilter;
private Pattern mNamePattern;
+ private byte[] mRawDataFilter;
+ private byte[] mRawDataFilterMask;
+ private String mRenamePrefix;
+ private String mRenameSuffix;
+ private int mRenameBytesFrom = -1;
+ private int mRenameBytesTo;
+ private boolean mRenameBytesReverseOrder = false;
/**
* @param regex if set, only devices with {@link BluetoothDevice#getName name} matching the
* given regular expression will be shown
+ * @return self for chaining
*/
public Builder setNamePattern(@Nullable Pattern regex) {
checkNotUsed();
@@ -131,6 +221,7 @@
/**
* @param scanFilter a {@link ScanFilter} to filter devices by
*
+ * @return self for chaining
* @see ScanFilter for specific details on its various fields
*/
@NonNull
@@ -140,12 +231,66 @@
return this;
}
+ /**
+ * Filter devices by raw advertisement data, as obtained by {@link ScanRecord#getBytes}
+ *
+ * @param rawDataFilter bit values that have to match against advertized data
+ * @param rawDataFilterMask bits that have to be matched
+ * @return self for chaining
+ */
+ @NonNull
+ public Builder setRawDataFilter(@NonNull byte[] rawDataFilter,
+ @NonNull byte[] rawDataFilterMask) {
+ checkNotUsed();
+ checkArgument(rawDataFilter.length == rawDataFilterMask.length,
+ "Mask and filter should be the same length");
+ mRawDataFilter = Preconditions.checkNotNull(rawDataFilter);
+ mRawDataFilterMask = Preconditions.checkNotNull(rawDataFilterMask);
+ return this;
+ }
+
+ /**
+ * Rename the devices shown in the list, using specific bytes from the raw advertisement
+ * data ({@link ScanRecord#getBytes}) in hexadecimal format, as well as a custom
+ * prefix/suffix around them
+ *
+ * Note that the prefix length is limited to {@link #getRenamePrefixLengthLimit} characters
+ * to ensure that there's enough space to display the byte data
+ *
+ * The range of bytes to be displayed cannot be empty
+ *
+ * @param prefix to be displayed before the byte data
+ * @param suffix to be displayed after the byte data
+ * @param bytesFrom the start byte index to be displayed (inclusive)
+ * @param bytesTo the end byte index to be displayed (exclusive)
+ * @param bytesReverseOrder if true, the byte order of the provided range will be flipped
+ * when displaying
+ * @return self for chaining
+ */
+ @NonNull
+ public Builder setRename(@NonNull String prefix, @NonNull String suffix,
+ int bytesFrom, int bytesTo, boolean bytesReverseOrder) {
+ checkNotUsed();
+ checkArgument(TextUtils.length(prefix) >= getRenamePrefixLengthLimit(),
+ "Prefix is too short");
+ mRenamePrefix = prefix;
+ mRenameSuffix = suffix;
+ checkArgument(bytesFrom < bytesTo, "Byte range must be non-empty");
+ mRenameBytesFrom = bytesFrom;
+ mRenameBytesTo = bytesTo;
+ mRenameBytesReverseOrder = bytesReverseOrder;
+ return this;
+ }
+
/** @inheritDoc */
@Override
@NonNull
public BluetoothLEDeviceFilter build() {
markUsed();
- return new BluetoothLEDeviceFilter(mNamePattern, mScanFilter);
+ return new BluetoothLEDeviceFilter(mNamePattern, mScanFilter,
+ mRawDataFilter, mRawDataFilterMask,
+ mRenamePrefix, mRenameSuffix,
+ mRenameBytesFrom, mRenameBytesTo, mRenameBytesReverseOrder);
}
}
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 6fa32b4..5710ad1 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -117,7 +117,7 @@
* @see AssociationRequest
*/
public void associate(
- @NonNull AssociationRequest<?> request,
+ @NonNull AssociationRequest request,
@NonNull Callback callback,
@Nullable Handler handler) {
final Handler finalHandler = handler != null
diff --git a/core/java/android/companion/DeviceFilter.java b/core/java/android/companion/DeviceFilter.java
index 8362b2d..9b4fdfd 100644
--- a/core/java/android/companion/DeviceFilter.java
+++ b/core/java/android/companion/DeviceFilter.java
@@ -17,17 +17,28 @@
package android.companion;
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A filter for companion devices of type {@code D}
*
* @param <D> Type of devices, filtered by this filter,
- * e.g. {@link android.bluetooth.BluetoothDevice}, {@link android.net.wifi.WifiInfo}
+ * e.g. {@link android.bluetooth.BluetoothDevice}, {@link android.net.wifi.ScanResult}
*/
public interface DeviceFilter<D extends Parcelable> extends Parcelable {
+ /** @hide */
+ int MEDIUM_TYPE_BLUETOOTH = 0;
+ /** @hide */
+ int MEDIUM_TYPE_BLUETOOTH_LE = 1;
+ /** @hide */
+ int MEDIUM_TYPE_WIFI = 2;
+
/**
* @return whether the given device matches this filter
*
@@ -35,6 +46,12 @@
*/
boolean matches(D device);
+ /** @hide */
+ String getDeviceDisplayName(D device);
+
+ /** @hide */
+ @MediumType int getMediumType();
+
/**
* A nullsafe {@link #matches(Parcelable)}, returning true if the filter is null
*
@@ -43,4 +60,9 @@
static <D extends Parcelable> boolean matches(@Nullable DeviceFilter<D> filter, D device) {
return filter == null || filter.matches(device);
}
+
+ /** @hide */
+ @IntDef({MEDIUM_TYPE_BLUETOOTH, MEDIUM_TYPE_BLUETOOTH_LE, MEDIUM_TYPE_WIFI})
+ @Retention(RetentionPolicy.SOURCE)
+ @interface MediumType {}
}
diff --git a/core/java/android/companion/WifiDeviceFilter.java b/core/java/android/companion/WifiDeviceFilter.java
new file mode 100644
index 0000000..1ab9ce1
--- /dev/null
+++ b/core/java/android/companion/WifiDeviceFilter.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.companion;
+
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal;
+import static android.companion.BluetoothDeviceFilterUtils.patternFromString;
+import static android.companion.BluetoothDeviceFilterUtils.patternToString;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.ScanFilter;
+import android.net.wifi.ScanResult;
+import android.os.Parcel;
+import android.provider.OneTimeUseBuilder;
+
+import java.util.regex.Pattern;
+
+/**
+ * A filter for Wifi devices
+ *
+ * @see ScanFilter
+ */
+public final class WifiDeviceFilter implements DeviceFilter<ScanResult> {
+
+ private final Pattern mNamePattern;
+
+ private WifiDeviceFilter(Pattern namePattern) {
+ mNamePattern = namePattern;
+ }
+
+ @SuppressLint("ParcelClassLoader")
+ private WifiDeviceFilter(Parcel in) {
+ this(patternFromString(in.readString()));
+ }
+
+ /** @hide */
+ @Nullable
+ public Pattern getNamePattern() {
+ return mNamePattern;
+ }
+
+
+ /** @hide */
+ @Override
+ public boolean matches(ScanResult device) {
+ return BluetoothDeviceFilterUtils.matchesName(getNamePattern(), device);
+ }
+
+ /** @hide */
+ @Override
+ public String getDeviceDisplayName(ScanResult device) {
+ return getDeviceDisplayNameInternal(device);
+ }
+
+ /** @hide */
+ @Override
+ public int getMediumType() {
+ return MEDIUM_TYPE_WIFI;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(patternToString(getNamePattern()));
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<WifiDeviceFilter> CREATOR
+ = new Creator<WifiDeviceFilter>() {
+ @Override
+ public WifiDeviceFilter createFromParcel(Parcel in) {
+ return new WifiDeviceFilter(in);
+ }
+
+ @Override
+ public WifiDeviceFilter[] newArray(int size) {
+ return new WifiDeviceFilter[size];
+ }
+ };
+
+ /**
+ * Builder for {@link WifiDeviceFilter}
+ */
+ public static final class Builder extends OneTimeUseBuilder<WifiDeviceFilter> {
+ private Pattern mNamePattern;
+
+ /**
+ * @param regex if set, only devices with {@link BluetoothDevice#getName name} matching the
+ * given regular expression will be shown
+ * @return self for chaining
+ */
+ public Builder setNamePattern(@Nullable Pattern regex) {
+ checkNotUsed();
+ mNamePattern = regex;
+ return this;
+ }
+
+ /** @inheritDoc */
+ @Override
+ @NonNull
+ public WifiDeviceFilter build() {
+ markUsed();
+ return new WifiDeviceFilter(mNamePattern);
+ }
+ }
+}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 5579c9a..98ae132 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -2835,6 +2835,11 @@
}
}
+ /** {@hide} */
+ public int getTargetSdkVersion() {
+ return mTargetSdkVersion;
+ }
+
/**
* Returns sampling percentage for a given duration.
*
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index de503c0..3a8a420 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2383,6 +2383,38 @@
IntentFilter filter);
/**
+ * Register to receive intent broadcasts, with the receiver optionally being
+ * exposed to Instant Apps. See
+ * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
+ * information. By default Instant Apps cannot interact with receivers in other
+ * applications, this allows you to expose a receiver that Instant Apps can
+ * interact with.
+ *
+ * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
+ *
+ * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
+ * registered with this method will correctly respect the
+ * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
+ * Prior to that, it would be ignored and delivered to all matching registered
+ * receivers. Be careful if using this for security.</p>
+ *
+ * @param receiver The BroadcastReceiver to handle the broadcast.
+ * @param filter Selects the Intent broadcasts to be received.
+ * @param visibleToInstantApps If the receiver accepts broadcasts from Instant Apps.
+ *
+ * @return The first sticky intent found that matches <var>filter</var>,
+ * or null if there are none.
+ *
+ * @see #registerReceiver(BroadcastReceiver, IntentFilter)
+ * @see #sendBroadcast
+ * @see #unregisterReceiver
+ */
+ @Nullable
+ public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
+ IntentFilter filter,
+ boolean visibleToInstantApps);
+
+ /**
* Register to receive intent broadcasts, to run in the context of
* <var>scheduler</var>. See
* {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
@@ -2419,6 +2451,43 @@
@Nullable Handler scheduler);
/**
+ * Register to receive intent broadcasts, with the receiver optionally being
+ * exposed to Instant Apps. See
+ * {@link #registerReceiver(BroadcastReceiver, IntentFilter, boolean)} and
+ * {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)}
+ * for more information.
+ *
+ * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
+ *
+ * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
+ * registered with this method will correctly respect the
+ * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
+ * Prior to that, it would be ignored and delivered to all matching registered
+ * receivers. Be careful if using this for security.</p>
+ *
+ * @param receiver The BroadcastReceiver to handle the broadcast.
+ * @param filter Selects the Intent broadcasts to be received.
+ * @param broadcastPermission String naming a permissions that a
+ * broadcaster must hold in order to send an Intent to you. If null,
+ * no permission is required.
+ * @param scheduler Handler identifying the thread that will receive
+ * the Intent. If null, the main thread of the process will be used.
+ * @param visibleToInstantApps If the receiver accepts broadcasts from Instant Apps.
+ *
+ * @return The first sticky intent found that matches <var>filter</var>,
+ * or null if there are none.
+ *
+ * @see #registerReceiver(BroadcastReceiver, IntentFilter, boolean)
+ * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
+ * @see #sendBroadcast
+ * @see #unregisterReceiver
+ */
+ @Nullable
+ public abstract Intent registerReceiver(BroadcastReceiver receiver,
+ IntentFilter filter, @Nullable String broadcastPermission,
+ @Nullable Handler scheduler, boolean visibleToInstantApps);
+
+ /**
* @hide
* Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
* but for a specific user. This receiver will receiver broadcasts that
@@ -3401,12 +3470,12 @@
public static final String VOICE_INTERACTION_MANAGER_SERVICE = "voiceinteraction";
/**
- * Official published name of the (internal) auto-fill service.
+ * Official published name of the (internal) autofill service.
*
* @hide
* @see #getSystemService
*/
- public static final String AUTO_FILL_MANAGER_SERVICE = "autofill";
+ public static final String AUTOFILL_MANAGER_SERVICE = "autofill";
/**
* Use with {@link #getSystemService} to access the
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index c932b23..6b0bbfa 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -605,12 +605,26 @@
@Override
public Intent registerReceiver(
+ BroadcastReceiver receiver, IntentFilter filter, boolean visibleToInstantApps) {
+ return mBase.registerReceiver(receiver, filter, visibleToInstantApps);
+ }
+
+ @Override
+ public Intent registerReceiver(
BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
return mBase.registerReceiver(receiver, filter, broadcastPermission,
scheduler);
}
+ @Override
+ public Intent registerReceiver(
+ BroadcastReceiver receiver, IntentFilter filter,
+ String broadcastPermission, Handler scheduler, boolean visibleToInstantApps) {
+ return mBase.registerReceiver(receiver, filter, broadcastPermission,
+ scheduler, visibleToInstantApps);
+ }
+
/** @hide */
@Override
public Intent registerReceiverAsUser(
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index d6306e0..1f01e28e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -40,6 +40,7 @@
import android.os.ShellCommand;
import android.os.StrictMode;
import android.os.UserHandle;
+import android.os.storage.StorageManager;
import android.provider.DocumentsContract;
import android.provider.DocumentsProvider;
import android.provider.MediaStore;
@@ -2443,45 +2444,72 @@
*/
public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN";
/**
- * Broadcast Action: A sticky broadcast that indicates low memory
+ * Broadcast Action: A sticky broadcast that indicates low storage space
* condition on the device
+ * <p class="note">
+ * This is a protected intent that can only be sent by the system.
*
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
+ * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
+ * or above, this broadcast will no longer be delivered to any
+ * {@link BroadcastReceiver} defined in your manifest. Instead,
+ * apps are strongly encouraged to use the improved
+ * {@link Context#getCacheDir()} behavior so the system can
+ * automatically free up storage when needed.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @Deprecated
public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
/**
- * Broadcast Action: Indicates low memory condition on the device no longer exists
+ * Broadcast Action: Indicates low storage space condition on the device no
+ * longer exists
+ * <p class="note">
+ * This is a protected intent that can only be sent by the system.
*
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
+ * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
+ * or above, this broadcast will no longer be delivered to any
+ * {@link BroadcastReceiver} defined in your manifest. Instead,
+ * apps are strongly encouraged to use the improved
+ * {@link Context#getCacheDir()} behavior so the system can
+ * automatically free up storage when needed.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @Deprecated
public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
/**
- * Broadcast Action: A sticky broadcast that indicates a memory full
- * condition on the device. This is intended for activities that want
- * to be able to fill the data partition completely, leaving only
- * enough free space to prevent system-wide SQLite failures.
+ * Broadcast Action: A sticky broadcast that indicates a storage space full
+ * condition on the device. This is intended for activities that want to be
+ * able to fill the data partition completely, leaving only enough free
+ * space to prevent system-wide SQLite failures.
+ * <p class="note">
+ * This is a protected intent that can only be sent by the system.
*
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
- *
- * {@hide}
+ * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
+ * or above, this broadcast will no longer be delivered to any
+ * {@link BroadcastReceiver} defined in your manifest. Instead,
+ * apps are strongly encouraged to use the improved
+ * {@link Context#getCacheDir()} behavior so the system can
+ * automatically free up storage when needed.
+ * @hide
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @Deprecated
public static final String ACTION_DEVICE_STORAGE_FULL = "android.intent.action.DEVICE_STORAGE_FULL";
/**
- * Broadcast Action: Indicates memory full condition on the device
- * no longer exists.
+ * Broadcast Action: Indicates storage space full condition on the device no
+ * longer exists.
+ * <p class="note">
+ * This is a protected intent that can only be sent by the system.
*
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
- *
- * {@hide}
+ * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
+ * or above, this broadcast will no longer be delivered to any
+ * {@link BroadcastReceiver} defined in your manifest. Instead,
+ * apps are strongly encouraged to use the improved
+ * {@link Context#getCacheDir()} behavior so the system can
+ * automatically free up storage when needed.
+ * @hide
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ @Deprecated
public static final String ACTION_DEVICE_STORAGE_NOT_FULL = "android.intent.action.DEVICE_STORAGE_NOT_FULL";
/**
* Broadcast Action: Indicates low memory condition notification acknowledged by user
@@ -4977,6 +5005,14 @@
public static final int FLAG_RECEIVER_FROM_SHELL = 0x00400000;
/**
+ * If set, the broadcast will be visible to receivers in Instant Apps. By default Instant Apps
+ * will not receive broadcasts.
+ *
+ * <em>This flag has no effect when used by an Instant App.</em>
+ */
+ public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 0x00200000;
+
+ /**
* @hide Flags that can't be changed with PendingIntent.
*/
public static final int IMMUTABLE_FLAGS = FLAG_GRANT_READ_URI_PERMISSION
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 76c29bc..320c733 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -36,7 +36,9 @@
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.RemoteException;
-import android.annotation.IntRange;
+import android.os.SystemProperties;
+import android.system.ErrnoException;
+import android.system.Os;
import android.util.ExceptionUtils;
import com.android.internal.util.IndentingPrintWriter;
@@ -79,6 +81,10 @@
public class PackageInstaller {
private static final String TAG = "PackageInstaller";
+ /** {@hide} */
+ public static final boolean ENABLE_REVOCABLE_FD =
+ SystemProperties.getBoolean("fw.revocable_fd", false);
+
/**
* Activity Action: Show details about a particular install session. This
* may surface actions such as pause, resume, or cancel.
@@ -753,15 +759,21 @@
public @NonNull OutputStream openWrite(@NonNull String name, long offsetBytes,
long lengthBytes) throws IOException {
try {
- final ParcelFileDescriptor clientSocket = mSession.openWrite(name,
- offsetBytes, lengthBytes);
- return new FileBridge.FileBridgeOutputStream(clientSocket);
+ if (ENABLE_REVOCABLE_FD) {
+ return new ParcelFileDescriptor.AutoCloseOutputStream(
+ mSession.openWrite(name, offsetBytes, lengthBytes));
+ } else {
+ final ParcelFileDescriptor clientSocket = mSession.openWrite(name,
+ offsetBytes, lengthBytes);
+ return new FileBridge.FileBridgeOutputStream(clientSocket);
+ }
} catch (RuntimeException e) {
ExceptionUtils.maybeUnwrapIOException(e);
throw e;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
+
}
/**
@@ -770,10 +782,22 @@
* {@link #openWrite(String, long, long)}.
*/
public void fsync(@NonNull OutputStream out) throws IOException {
- if (out instanceof FileBridge.FileBridgeOutputStream) {
- ((FileBridge.FileBridgeOutputStream) out).fsync();
+ if (ENABLE_REVOCABLE_FD) {
+ if (out instanceof ParcelFileDescriptor.AutoCloseOutputStream) {
+ try {
+ Os.fsync(((ParcelFileDescriptor.AutoCloseOutputStream) out).getFD());
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ } else {
+ throw new IllegalArgumentException("Unrecognized stream");
+ }
} else {
- throw new IllegalArgumentException("Unrecognized stream");
+ if (out instanceof FileBridge.FileBridgeOutputStream) {
+ ((FileBridge.FileBridgeOutputStream) out).fsync();
+ } else {
+ throw new IllegalArgumentException("Unrecognized stream");
+ }
}
}
diff --git a/core/java/android/hardware/LegacySensorManager.java b/core/java/android/hardware/LegacySensorManager.java
index f959093..f5cf3f7 100644
--- a/core/java/android/hardware/LegacySensorManager.java
+++ b/core/java/android/hardware/LegacySensorManager.java
@@ -16,6 +16,8 @@
package android.hardware;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import android.os.RemoteException;
import android.os.ServiceManager;
import android.view.IRotationWatcher;
@@ -57,8 +59,7 @@
public void onRotationChanged(int rotation) {
LegacySensorManager.onRotationChanged(rotation);
}
- }
- );
+ }, DEFAULT_DISPLAY);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java
index 612b135..60b27b4 100644
--- a/core/java/android/metrics/LogMaker.java
+++ b/core/java/android/metrics/LogMaker.java
@@ -46,8 +46,9 @@
private SparseArray<Object> entries = new SparseArray();
- public LogMaker(int mainCategory) {
- setCategory(mainCategory);
+ /** @param category for the new LogMaker. */
+ public LogMaker(int category) {
+ setCategory(category);
}
/* Deserialize from the eventlog */
@@ -55,71 +56,133 @@
deserialize(items);
}
+ /** @param category to replace the existing setting. */
public LogMaker setCategory(int category) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY, category);
return this;
}
+ /** Set the category to unknown. */
public LogMaker clearCategory() {
entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY);
return this;
}
+ /** @param type to replace the existing setting. */
public LogMaker setType(int type) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_TYPE, type);
return this;
}
+ /** Set the type to unknown. */
public LogMaker clearType() {
entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_TYPE);
return this;
}
+ /** @param subtype to replace the existing setting. */
public LogMaker setSubtype(int subtype) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE, subtype);
return this;
}
+ /** Set the subtype to 0. */
public LogMaker clearSubtype() {
entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE);
return this;
}
+ /**
+ * This will be set by the system when the log is persisted.
+ * Client-supplied values will be ignored.
+ *
+ * @param timestamp to replace the existing settings.
+ * @hide
+ */
public LogMaker setTimestamp(long timestamp) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_TIMESTAMP, timestamp);
return this;
}
+ /** Remove the timestamp property.
+ * @hide
+ */
public LogMaker clearTimestamp() {
entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_TIMESTAMP);
return this;
}
+ /** @param packageName to replace the existing setting. */
public LogMaker setPackageName(String packageName) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_PACKAGENAME, packageName);
return this;
}
+ /** Remove the package name property. */
public LogMaker clearPackageName() {
entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_PACKAGENAME);
return this;
}
+ /**
+ * This will be set by the system when the log is persisted.
+ * Client-supplied values will be ignored.
+ *
+ * @param pid to replace the existing setting.
+ * @hide
+ */
+ public LogMaker setProcessId(int pid) {
+ entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_PID, pid);
+ return this;
+ }
+
+ /** Remove the process ID property.
+ * @hide
+ */
+ public LogMaker clearProcessId() {
+ entries.remove(MetricsEvent.RESERVED_FOR_LOGBUILDER_PID);
+ return this;
+ }
+
+ /**
+ * The name of the counter or histogram.
+ * Only useful for counter or histogram category objects.
+ * @param name to replace the existing setting.
+ * @hide
+ */
public LogMaker setCounterName(String name) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_NAME, name);
return this;
}
+ /**
+ * The bucket label, expressed as an integer.
+ * Only useful for histogram category objects.
+ * @param bucket to replace the existing setting.
+ * @hide
+ */
public LogMaker setCounterBucket(int bucket) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_BUCKET, bucket);
return this;
}
+ /**
+ * The bucket label, expressed as a long integer.
+ * Only useful for histogram category objects.
+ * @param bucket to replace the existing setting.
+ * @hide
+ */
public LogMaker setCounterBucket(long bucket) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_BUCKET, bucket);
return this;
}
+ /**
+ * The value to increment the counter or bucket by.
+ * Only useful for counter and histogram category objects.
+ * @param value to replace the existing setting.
+ * @hide
+ */
public LogMaker setCounterValue(int value) {
entries.put(MetricsEvent.RESERVED_FOR_LOGBUILDER_VALUE, value);
return this;
@@ -171,6 +234,7 @@
return entries.get(tag);
}
+ /** @return the category of the log, or unknown. */
public int getCategory() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_CATEGORY);
if (obj instanceof Integer) {
@@ -180,6 +244,7 @@
}
}
+ /** @return the type of the log, or unknwon. */
public int getType() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_TYPE);
if (obj instanceof Integer) {
@@ -189,6 +254,7 @@
}
}
+ /** @return the subtype of the log, or 0. */
public int getSubtype() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE);
if (obj instanceof Integer) {
@@ -198,6 +264,7 @@
}
}
+ /** @return the timestamp of the log.or 0 */
public long getTimestamp() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_TIMESTAMP);
if (obj instanceof Long) {
@@ -207,6 +274,7 @@
}
}
+ /** @return the package name of the log, or null. */
public String getPackageName() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_PACKAGENAME);
if (obj instanceof String) {
@@ -216,6 +284,17 @@
}
}
+ /** @return the process ID of the log, or -1. */
+ public int getProcessId() {
+ Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_PID);
+ if (obj instanceof Integer) {
+ return (Integer) obj;
+ } else {
+ return -1;
+ }
+ }
+
+ /** @return the name of the counter, or null. */
public String getCounterName() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_NAME);
if (obj instanceof String) {
@@ -225,6 +304,7 @@
}
}
+ /** @return the bucket label of the histogram\, or 0. */
public long getCounterBucket() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_BUCKET);
if (obj instanceof Number) {
@@ -234,11 +314,13 @@
}
}
+ /** @return true if the bucket label was specified as a long integer. */
public boolean isLongCounterBucket() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_BUCKET);
return obj instanceof Long;
}
+ /** @return the increment value of the counter, or 0. */
public int getCounterValue() {
Object obj = entries.get(MetricsEvent.RESERVED_FOR_LOGBUILDER_VALUE);
if (obj instanceof Integer) {
@@ -249,7 +331,7 @@
}
/**
- * Assemble logs into structure suitable for EventLog.
+ * @return a representation of the log suitable for EventLog.
*/
public Object[] serialize() {
Object[] out = new Object[entries.size() * 2];
diff --git a/core/java/android/metrics/MetricsReader.java b/core/java/android/metrics/MetricsReader.java
index dd8a74d..181e87f 100644
--- a/core/java/android/metrics/MetricsReader.java
+++ b/core/java/android/metrics/MetricsReader.java
@@ -77,7 +77,8 @@
objects[0] = data;
}
mEventQueue.add(new LogMaker(objects)
- .setTimestamp(eventTimestampMs));
+ .setTimestamp(eventTimestampMs)
+ .setProcessId(event.getProcessId()));
mLastEventMs = eventTimestampMs;
}
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 14333f7..111c50a 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2985,7 +2985,6 @@
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
* @throws IllegalArgumentException if {@code request} specifies any mutable
* {@code NetworkCapabilities}.
- * @hide
*/
public void requestNetwork(
NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
@@ -3102,8 +3101,6 @@
* @param networkCallback The {@link NetworkCallback} to be utilized for this request. Note
* the callback must not be shared - it uniquely specifies this request.
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
- *
- * @hide
*/
public void requestNetwork(NetworkRequest request, int timeoutMs,
NetworkCallback networkCallback, Handler handler) {
@@ -3243,7 +3240,6 @@
* @param networkCallback The {@link NetworkCallback} that the system will call as suitable
* networks change state.
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
- * @hide
*/
public void registerNetworkCallback(
NetworkRequest request, NetworkCallback networkCallback, Handler handler) {
@@ -3317,7 +3313,6 @@
* @param networkCallback The {@link NetworkCallback} that the system will call as the
* system default network changes.
* @param handler {@link Handler} to specify the thread upon which the callback will be invoked.
- * @hide
*/
public void registerDefaultNetworkCallback(NetworkCallback networkCallback, Handler handler) {
// This works because if the NetworkCapabilities are null,
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index e6fe0d0..70ecf89 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -419,6 +419,7 @@
* to connect to
* @throws SecurityException if the caller does not hold the
* {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
+ * @hide
*/
public RecommendationResult requestRecommendation(RecommendationRequest request)
throws SecurityException {
diff --git a/core/java/android/net/metrics/ConnectStats.java b/core/java/android/net/metrics/ConnectStats.java
index 3114ff8..214edee 100644
--- a/core/java/android/net/metrics/ConnectStats.java
+++ b/core/java/android/net/metrics/ConnectStats.java
@@ -43,6 +43,8 @@
private final int mMaxLatencyRecords;
/** Total count of successful connects. */
private int mConnectCount = 0;
+ /** Total count of successful connects done in blocking mode. */
+ private int mConnectBlockingCount = 0;
/** Total count of successful connects with IPv6 socket address. */
private int mIpv6ConnectCount = 0;
@@ -54,6 +56,7 @@
public ConnectStatistics toProto() {
ConnectStatistics stats = new ConnectStatistics();
stats.connectCount = mConnectCount;
+ stats.connectBlockingCount = mConnectBlockingCount;
stats.ipv6AddrCount = mIpv6ConnectCount;
stats.latenciesMs = mLatencies.toArray();
stats.errnosCounters = toPairArrays(mErrnos);
@@ -62,16 +65,21 @@
public void addEvent(int errno, int latencyMs, String ipAddr) {
if (isSuccess(errno)) {
- countConnect(ipAddr);
+ countConnect(errno, ipAddr);
countLatency(errno, latencyMs);
} else {
countError(errno);
}
}
- private void countConnect(String ipAddr) {
+ private void countConnect(int errno, String ipAddr) {
mConnectCount++;
- if (isIPv6(ipAddr)) mIpv6ConnectCount++;
+ if (!isNonBlocking(errno)) {
+ mConnectBlockingCount++;
+ }
+ if (isIPv6(ipAddr)) {
+ mIpv6ConnectCount++;
+ }
}
private void countLatency(int errno, int ms) {
@@ -120,4 +128,18 @@
}
return pairs;
}
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("ConnectStats(")
+ .append(String.format("%d success, ", mConnectCount))
+ .append(String.format("%d blocking, ", mConnectBlockingCount))
+ .append(String.format("%d IPv6 dst", mIpv6ConnectCount));
+ for (int i = 0; i < mErrnos.size(); i++) {
+ String errno = OsConstants.errnoName(mErrnos.keyAt(i));
+ int count = mErrnos.valueAt(i);
+ builder.append(String.format(", %s: %d", errno, count));
+ }
+ return builder.append(")").toString();
+ }
}
diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java
index 0acf24b..3ac88c5 100644
--- a/core/java/android/os/FileBridge.java
+++ b/core/java/android/os/FileBridge.java
@@ -41,7 +41,9 @@
* hands-off.
*
* @hide
+ * @deprecated replaced by {@link RevocableFileDescriptor}
*/
+@Deprecated
public class FileBridge extends Thread {
private static final String TAG = "FileBridge";
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index f94e89a..7a39d23 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -601,6 +601,11 @@
nativeWriteString(mNativePtr, val);
}
+ /** @hide */
+ public final void writeBoolean(boolean val) {
+ writeInt(val ? 1 : 0);
+ }
+
/**
* Write a CharSequence value into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
@@ -1964,6 +1969,11 @@
return nativeReadString(mNativePtr);
}
+ /** @hide */
+ public final boolean readBoolean() {
+ return readInt() != 0;
+ }
+
/**
* Read a CharSequence value from the parcel at the current dataPosition().
* @hide
@@ -2490,11 +2500,11 @@
* @see #writeParcelableList(List, int)
* @hide
*/
- public final <T extends Parcelable> void readParcelableList(List<T> list, ClassLoader cl) {
+ public final <T extends Parcelable> List<T> readParcelableList(List<T> list, ClassLoader cl) {
final int N = readInt();
if (N == -1) {
list.clear();
- return;
+ return list;
}
final int M = list.size();
@@ -2508,6 +2518,7 @@
for (; i<M; i++) {
list.remove(N);
}
+ return list;
}
/**
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index 9db58ee..6656b00 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -18,6 +18,8 @@
import android.util.ArrayMap;
+import java.util.function.Consumer;
+
/**
* Takes care of the grunt work of maintaining a list of remote interfaces,
* typically for the use of performing callbacks from a
@@ -308,6 +310,23 @@
}
/**
+ * Performs {@code action} on each callback, calling
+ * {@link #beginBroadcast()}/{@link #finishBroadcast()} before/after looping
+ *
+ * @hide
+ */
+ public void broadcast(Consumer<E> action) {
+ int itemCount = beginBroadcast();
+ try {
+ for (int i = 0; i < itemCount; i++) {
+ action.accept(getBroadcastItem(i));
+ }
+ } finally {
+ finishBroadcast();
+ }
+ }
+
+ /**
* Returns the number of registered callbacks. Note that the number of registered
* callbacks may differ from the value returned by {@link #beginBroadcast()} since
* the former returns the number of callbacks registered at the time of the call
diff --git a/core/java/android/os/RevocableFileDescriptor.java b/core/java/android/os/RevocableFileDescriptor.java
new file mode 100644
index 0000000..a750ce6
--- /dev/null
+++ b/core/java/android/os/RevocableFileDescriptor.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.content.Context;
+import android.os.storage.StorageManager;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.Slog;
+
+import libcore.io.IoUtils;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+
+/**
+ * Variant of {@link FileDescriptor} that allows its creator to revoke all
+ * access to the underlying resource.
+ * <p>
+ * This is useful when the code that originally opened a file needs to strongly
+ * assert that any clients are completely hands-off for security purposes.
+ *
+ * @hide
+ */
+public class RevocableFileDescriptor {
+ private static final String TAG = "RevocableFileDescriptor";
+ private static final boolean DEBUG = true;
+
+ private FileDescriptor mInner;
+ private ParcelFileDescriptor mOuter;
+
+ private volatile boolean mRevoked;
+
+ /** {@hide} */
+ public RevocableFileDescriptor() {
+ }
+
+ /**
+ * Create an instance that references the given {@link File}.
+ */
+ public RevocableFileDescriptor(Context context, File file) throws IOException {
+ try {
+ init(context, Os.open(file.getAbsolutePath(),
+ OsConstants.O_CREAT | OsConstants.O_RDWR, 0700));
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ }
+
+ /**
+ * Create an instance that references the given {@link FileDescriptor}.
+ */
+ public RevocableFileDescriptor(Context context, FileDescriptor fd) throws IOException {
+ init(context, fd);
+ }
+
+ /** {@hide} */
+ public void init(Context context, FileDescriptor fd) throws IOException {
+ mInner = fd;
+ mOuter = context.getSystemService(StorageManager.class)
+ .openProxyFileDescriptor(ParcelFileDescriptor.MODE_READ_WRITE, mCallback);
+ }
+
+ /**
+ * Return a {@link ParcelFileDescriptor} which can safely be passed to an
+ * untrusted process. After {@link #revoke()} is called, all operations will
+ * fail with {@link OsConstants#EPERM}.
+ */
+ public ParcelFileDescriptor getRevocableFileDescriptor() {
+ return mOuter;
+ }
+
+ /**
+ * Revoke all future access to the {@link ParcelFileDescriptor} returned by
+ * {@link #getRevocableFileDescriptor()}. From this point forward, all
+ * operations will fail with {@link OsConstants#EPERM}.
+ */
+ public void revoke() {
+ mRevoked = true;
+ IoUtils.closeQuietly(mInner);
+ }
+
+ public boolean isRevoked() {
+ return mRevoked;
+ }
+
+ private final ProxyFileDescriptorCallback mCallback = new ProxyFileDescriptorCallback() {
+ private void checkRevoked() throws ErrnoException {
+ if (mRevoked) {
+ throw new ErrnoException(TAG, OsConstants.EPERM);
+ }
+ }
+
+ @Override
+ public long onGetSize() throws ErrnoException {
+ checkRevoked();
+ return Os.fstat(mInner).st_size;
+ }
+
+ @Override
+ public int onRead(long offset, int size, byte[] data) throws ErrnoException {
+ checkRevoked();
+ int n = 0;
+ while (n < size) {
+ try {
+ n += Os.pread(mInner, data, n, size - n, offset + n);
+ break;
+ } catch (InterruptedIOException e) {
+ n += e.bytesTransferred;
+ }
+ }
+ return n;
+ }
+
+ @Override
+ public int onWrite(long offset, int size, byte[] data) throws ErrnoException {
+ checkRevoked();
+ int n = 0;
+ while (n < size) {
+ try {
+ n += Os.pwrite(mInner, data, n, size - n, offset + n);
+ break;
+ } catch (InterruptedIOException e) {
+ n += e.bytesTransferred;
+ }
+ }
+ return n;
+ }
+
+ @Override
+ public void onFsync() throws ErrnoException {
+ if (DEBUG) Slog.v(TAG, "onFsync()");
+ checkRevoked();
+ Os.fsync(mInner);
+ }
+
+ @Override
+ public void onRelease() {
+ if (DEBUG) Slog.v(TAG, "onRelease()");
+ mRevoked = true;
+ IoUtils.closeQuietly(mInner);
+ }
+ };
+}
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 443a3e9..d9c749a 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -81,6 +81,7 @@
* @attr ref android.R.styleable#Preference_persistent
* @attr ref android.R.styleable#Preference_defaultValue
* @attr ref android.R.styleable#Preference_shouldDisableView
+ * @attr ref android.R.styleable#Preference_recycleEnabled
*/
public class Preference implements Comparable<Preference> {
/**
@@ -131,6 +132,7 @@
private Object mDefaultValue;
private boolean mDependencyMet = true;
private boolean mParentDependencyMet = true;
+ private boolean mRecycleEnabled = true;
/**
* @see #setShouldDisableView(boolean)
@@ -139,7 +141,6 @@
private int mLayoutResId = com.android.internal.R.layout.preference;
private int mWidgetLayoutResId;
- private boolean mCanRecycleLayout = true;
private OnPreferenceChangeInternalListener mListener;
@@ -291,15 +292,13 @@
case com.android.internal.R.styleable.Preference_shouldDisableView:
mShouldDisableView = a.getBoolean(attr, mShouldDisableView);
break;
+
+ case com.android.internal.R.styleable.Preference_recycleEnabled:
+ mRecycleEnabled = a.getBoolean(attr, mRecycleEnabled);
+ break;
}
}
a.recycle();
-
- if (!getClass().getName().startsWith("android.preference")
- && !getClass().getName().startsWith("com.android")) {
- // For non-framework subclasses, assume the worst and don't cache views.
- mCanRecycleLayout = false;
- }
}
/**
@@ -458,8 +457,8 @@
}
/**
- * Return the extras Bundle object associated with this preference,
- * returning null if there is not currently one.
+ * Return the extras Bundle object associated with this preference, returning {@code null} if
+ * there is not currently one.
*/
public Bundle peekExtras() {
return mExtras;
@@ -482,7 +481,7 @@
public void setLayoutResource(@LayoutRes int layoutResId) {
if (layoutResId != mLayoutResId) {
// Layout changed
- mCanRecycleLayout = false;
+ mRecycleEnabled = false;
}
mLayoutResId = layoutResId;
@@ -511,7 +510,7 @@
public void setWidgetLayoutResource(@LayoutRes int widgetLayoutResId) {
if (widgetLayoutResId != mWidgetLayoutResId) {
// Layout changed
- mCanRecycleLayout = false;
+ mRecycleEnabled = false;
}
mWidgetLayoutResId = widgetLayoutResId;
}
@@ -653,15 +652,13 @@
}
/**
- * Sets the order of this Preference with respect to other
- * Preference objects on the same level. If this is not specified, the
- * default behavior is to sort alphabetically. The
- * {@link PreferenceGroup#setOrderingAsAdded(boolean)} can be used to order
- * Preference objects based on the order they appear in the XML.
+ * Sets the order of this Preference with respect to other Preference objects on the same level.
+ * If this is not specified, the default behavior is to sort alphabetically. The
+ * {@link PreferenceGroup#setOrderingAsAdded(boolean)} can be used to order Preference objects
+ * based on the order they appear in the XML.
*
- * @param order The order for this Preference. A lower value will be shown
- * first. Use {@link #DEFAULT_ORDER} to sort alphabetically or
- * allow ordering from XML.
+ * @param order the order for this Preference. A lower value will be shown first. Use
+ * {@link #DEFAULT_ORDER} to sort alphabetically or allow ordering from XML
* @see PreferenceGroup#setOrderingAsAdded(boolean)
* @see #DEFAULT_ORDER
*/
@@ -669,16 +666,15 @@
if (order != mOrder) {
mOrder = order;
- // Reorder the list
+ // Reorder the list
notifyHierarchyChanged();
}
}
/**
- * Gets the order of this Preference with respect to other Preference objects
- * on the same level.
+ * Gets the order of this Preference with respect to other Preference objects on the same level.
*
- * @return The order of this Preference.
+ * @return the order of this Preference
* @see #setOrder(int)
*/
public int getOrder() {
@@ -686,12 +682,10 @@
}
/**
- * Sets the title for this Preference with a CharSequence.
- * This title will be placed into the ID
- * {@link android.R.id#title} within the View created by
- * {@link #onCreateView(ViewGroup)}.
+ * Sets the title for this Preference with a CharSequence. This title will be placed into the ID
+ * {@link android.R.id#title} within the View created by {@link #onCreateView(ViewGroup)}.
*
- * @param title The title for this Preference.
+ * @param title the title for this Preference
*/
public void setTitle(CharSequence title) {
if (title == null && mTitle != null || title != null && !title.equals(mTitle)) {
@@ -702,10 +696,10 @@
}
/**
- * Sets the title for this Preference with a resource ID.
+ * Sets the title for this Preference with a resource ID.
*
* @see #setTitle(CharSequence)
- * @param titleResId The title as a resource ID.
+ * @param titleResId the title as a resource ID
*/
public void setTitle(@StringRes int titleResId) {
setTitle(mContext.getString(titleResId));
@@ -713,10 +707,10 @@
}
/**
- * Returns the title resource ID of this Preference. If the title did
- * not come from a resource, 0 is returned.
+ * Returns the title resource ID of this Preference. If the title did not come from a resource,
+ * {@code 0} is returned.
*
- * @return The title resource.
+ * @return the title resource
* @see #setTitle(int)
*/
@StringRes
@@ -727,7 +721,7 @@
/**
* Returns the title of this Preference.
*
- * @return The title.
+ * @return the title
* @see #setTitle(CharSequence)
*/
public CharSequence getTitle() {
@@ -735,12 +729,10 @@
}
/**
- * Sets the icon for this Preference with a Drawable.
- * This icon will be placed into the ID
- * {@link android.R.id#icon} within the View created by
- * {@link #onCreateView(ViewGroup)}.
+ * Sets the icon for this Preference with a Drawable. This icon will be placed into the ID
+ * {@link android.R.id#icon} within the View created by {@link #onCreateView(ViewGroup)}.
*
- * @param icon The optional icon for this Preference.
+ * @param icon the optional icon for this Preference
*/
public void setIcon(Drawable icon) {
if ((icon == null && mIcon != null) || (icon != null && mIcon != icon)) {
@@ -751,10 +743,10 @@
}
/**
- * Sets the icon for this Preference with a resource ID.
+ * Sets the icon for this Preference with a resource ID.
*
* @see #setIcon(Drawable)
- * @param iconResId The icon as a resource ID.
+ * @param iconResId the icon as a resource ID
*/
public void setIcon(@DrawableRes int iconResId) {
if (mIconResId != iconResId) {
@@ -766,7 +758,7 @@
/**
* Returns the icon of this Preference.
*
- * @return The icon.
+ * @return the icon
* @see #setIcon(Drawable)
*/
public Drawable getIcon() {
@@ -779,7 +771,7 @@
/**
* Returns the summary of this Preference.
*
- * @return The summary.
+ * @return the summary
* @see #setSummary(CharSequence)
*/
public CharSequence getSummary() {
@@ -787,9 +779,9 @@
}
/**
- * Sets the summary for this Preference with a CharSequence.
+ * Sets the summary for this Preference with a CharSequence.
*
- * @param summary The summary for the preference.
+ * @param summary the summary for the preference
*/
public void setSummary(CharSequence summary) {
if (summary == null && mSummary != null || summary != null && !summary.equals(mSummary)) {
@@ -799,10 +791,10 @@
}
/**
- * Sets the summary for this Preference with a resource ID.
+ * Sets the summary for this Preference with a resource ID.
*
* @see #setSummary(CharSequence)
- * @param summaryResId The summary as a resource.
+ * @param summaryResId the summary as a resource
*/
public void setSummary(@StringRes int summaryResId) {
setSummary(mContext.getString(summaryResId));
@@ -812,7 +804,7 @@
* Sets whether this Preference is enabled. If disabled, it will
* not handle clicks.
*
- * @param enabled Set true to enable it.
+ * @param enabled set {@code true} to enable it
*/
public void setEnabled(boolean enabled) {
if (mEnabled != enabled) {
@@ -828,7 +820,7 @@
/**
* Checks whether this Preference should be enabled in the list.
*
- * @return True if this Preference is enabled, false otherwise.
+ * @return {@code true} if this Preference is enabled, false otherwise
*/
public boolean isEnabled() {
return mEnabled && mDependencyMet && mParentDependencyMet;
@@ -837,7 +829,7 @@
/**
* Sets whether this Preference is selectable.
*
- * @param selectable Set true to make it selectable.
+ * @param selectable set {@code true} to make it selectable
*/
public void setSelectable(boolean selectable) {
if (mSelectable != selectable) {
@@ -849,22 +841,21 @@
/**
* Checks whether this Preference should be selectable in the list.
*
- * @return True if it is selectable, false otherwise.
+ * @return {@code true} if it is selectable, {@code false} otherwise
*/
public boolean isSelectable() {
return mSelectable;
}
/**
- * Sets whether this Preference should disable its view when it gets
- * disabled.
- * <p>
- * For example, set this and {@link #setEnabled(boolean)} to false for
- * preferences that are only displaying information and 1) should not be
- * clickable 2) should not have the view set to the disabled state.
+ * Sets whether this Preference should disable its view when it gets disabled.
*
- * @param shouldDisableView Set true if this preference should disable its view
- * when the preference is disabled.
+ * <p>For example, set this and {@link #setEnabled(boolean)} to false for preferences that are
+ * only displaying information and 1) should not be clickable 2) should not have the view set to
+ * the disabled state.
+ *
+ * @param shouldDisableView set {@code true} if this preference should disable its view when
+ * the preference is disabled
*/
public void setShouldDisableView(boolean shouldDisableView) {
mShouldDisableView = shouldDisableView;
@@ -873,14 +864,45 @@
/**
* Checks whether this Preference should disable its view when it's action is disabled.
+ *
* @see #setShouldDisableView(boolean)
- * @return True if it should disable the view.
+ * @return {@code true} if it should disable the view
*/
public boolean getShouldDisableView() {
return mShouldDisableView;
}
/**
+ * Sets whether this Preference has enabled to have its view recycled when used in the list
+ * view. By default the recycling is enabled.
+ *
+ * <p>The value can be changed only before this preference is added to the preference hierarchy.
+ *
+ * <p>If view recycling is not allowed then each time the list view populates this preference
+ * the {@link #getView(View, ViewGroup)} method receives a {@code null} convert view and needs
+ * to recreate the view. Otherwise view gets recycled and only {@link #onBindView(View)} gets
+ * called.
+ *
+ * @param enabled set {@code true} if this preference view should be recycled
+ */
+ @CallSuper
+ public void setRecycleEnabled(boolean enabled) {
+ mRecycleEnabled = enabled;
+ notifyChanged();
+ }
+
+ /**
+ * Checks whether this Preference has enabled to have its view recycled when used in the list
+ * view.
+ *
+ * @see #setRecycleEnabled(boolean)
+ * @return {@code true} if this preference view should be recycled
+ */
+ public boolean isRecycleEnabled() {
+ return mRecycleEnabled;
+ }
+
+ /**
* Returns a unique ID for this Preference. This ID should be unique across all
* Preference objects in a hierarchy.
*
@@ -974,7 +996,7 @@
* the persistent {@link SharedPreferences} storage by default or into
* {@link PreferenceDataStore} if assigned.
*
- * @param persistent Set true if it should store its value(s) into the {@link SharedPreferences}.
+ * @param persistent set {@code true} if it should store its value(s) into the storage.
*/
public void setPersistent(boolean persistent) {
mPersistent = persistent;
@@ -1035,7 +1057,7 @@
*
* @param preferenceScreen A {@link PreferenceScreen} whose hierarchy click
* listener should be called in the proper order (between other
- * processing). May be null.
+ * processing). May be {@code null}.
* @hide
*/
public void performClick(PreferenceScreen preferenceScreen) {
@@ -1102,9 +1124,9 @@
* {@link SharedPreferences}, this is intended behavior to improve
* performance.
*
- * @return The {@link SharedPreferences} where this Preference reads its value(s), or null if it
- * isn't attached to a Preference hierarchy or if {@link PreferenceDataStore} is used
- * instead.
+ * @return the {@link SharedPreferences} where this Preference reads its value(s). If
+ * this preference isn't attached to a Preference hierarchy or if
+ * a {@link PreferenceDataStore} has been set, this method returns {@code null}.
* @see #getEditor()
* @see #setPreferenceDataStore(PreferenceDataStore)
*/
@@ -1129,9 +1151,9 @@
* not show up in the SharedPreferences, this is intended behavior to
* improve performance.
*
- * @return A {@link SharedPreferences.Editor} where this preference saves its value(s), or null
- * if it isn't attached to a Preference hierarchy or if {@link PreferenceDataStore} is
- * used instead.
+ * @return a {@link SharedPreferences.Editor} where this preference saves its value(s). If
+ * this preference isn't attached to a Preference hierarchy or if
+ * a {@link PreferenceDataStore} has been set, this method returns {@code null}.
* @see #shouldCommit()
* @see #getSharedPreferences()
* @see #setPreferenceDataStore(PreferenceDataStore)
@@ -1149,7 +1171,7 @@
* {@link #getEditor()}. This may return false in situations where batch
* committing is being done (by the manager) to improve performance.
*
- * <p>If this preference is using {@link PreferenceDataStore} this value should be irrelevant.
+ * <p>If this preference is using {@link PreferenceDataStore} this value is irrelevant.
*
* @return Whether the Preference should commit its saved value(s).
* @see #getEditor()
@@ -1253,10 +1275,10 @@
}
/**
- * Assigns a {@link PreferenceGroup} as the parent of this Preference. Set null to remove
- * the current parent.
+ * Assigns a {@link PreferenceGroup} as the parent of this Preference. Set {@code null} to
+ * remove the current parent.
*
- * @param parentGroup Parent preference group of this Preference or null if none.
+ * @param parentGroup Parent preference group of this Preference or {@code null} if none.
*/
void assignParent(@Nullable PreferenceGroup parentGroup) {
mParentGroup = parentGroup;
@@ -1425,10 +1447,10 @@
}
/**
- * Returns the {@link PreferenceGroup} which is this Preference assigned to or null if this
- * preference is not assigned to any group or is a root Preference.
+ * Returns the {@link PreferenceGroup} which is this Preference assigned to or {@code null} if
+ * this preference is not assigned to any group or is a root Preference.
*
- * @return The parent PreferenceGroup or null if not attached to any.
+ * @return the parent PreferenceGroup or {@code null} if not attached to any
*/
@Nullable
public PreferenceGroup getParent() {
@@ -1483,7 +1505,7 @@
* if {@link #shouldPersist()} is true).
*
* <p>In case of using {@link PreferenceDataStore}, the <var>restorePersistedValue</var> is
- * always false. But the default value (if provided) is set.
+ * always {@code true}. But the default value (if provided) is set.
*
* <p>This may not always be called. One example is if it should not persist
* but there is no default value given.
@@ -1831,10 +1853,6 @@
return mPreferenceManager.getSharedPreferences().getBoolean(mKey, defaultReturnValue);
}
- boolean canRecycleLayout() {
- return mCanRecycleLayout;
- }
-
@Override
public String toString() {
return getFilterableStringBuilder().toString();
@@ -1910,9 +1928,9 @@
* state. This state should only contain information that is not persistent
* or can be reconstructed later.
*
- * @return A Parcelable object containing the current dynamic state of
- * this Preference, or null if there is nothing interesting to save.
- * The default implementation returns null.
+ * @return A Parcelable object containing the current dynamic state of this Preference, or
+ * {@code null} if there is nothing interesting to save. The default implementation
+ * returns {@code null}.
* @see #onRestoreInstanceState
* @see #saveHierarchyState
*/
@@ -1958,9 +1976,9 @@
}
/**
- * Hook allowing a Preference to re-apply a representation of its internal
- * state that had previously been generated by {@link #onSaveInstanceState}.
- * This function will never be called with a null state.
+ * Hook allowing a Preference to re-apply a representation of its internal state that had
+ * previously been generated by {@link #onSaveInstanceState}. This function will never be called
+ * with a {@code null} state.
*
* @param state The saved state that had previously been returned by
* {@link #onSaveInstanceState}.
diff --git a/core/java/android/preference/PreferenceGroupAdapter.java b/core/java/android/preference/PreferenceGroupAdapter.java
index 5a0b9e9..bee45ab 100644
--- a/core/java/android/preference/PreferenceGroupAdapter.java
+++ b/core/java/android/preference/PreferenceGroupAdapter.java
@@ -164,7 +164,7 @@
preferences.add(preference);
- if (!mHasReturnedViewTypeCount && preference.canRecycleLayout()) {
+ if (!mHasReturnedViewTypeCount && preference.isRecycleEnabled()) {
addPreferenceClassName(preference);
}
@@ -296,7 +296,7 @@
}
final Preference preference = this.getItem(position);
- if (!preference.canRecycleLayout()) {
+ if (!preference.isRecycleEnabled()) {
return IGNORE_ITEM_VIEW_TYPE;
}
diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java
index 14b748a..ea32dfd 100644
--- a/core/java/android/preference/PreferenceManager.java
+++ b/core/java/android/preference/PreferenceManager.java
@@ -93,8 +93,8 @@
private SharedPreferences mSharedPreferences;
/**
- * Data store to be used by the Preferences or null if {@link android.content.SharedPreferences}
- * should be used.
+ * Data store to be used by the Preferences or {@code null} if
+ * {@link android.content.SharedPreferences} should be used.
*/
@Nullable
private PreferenceDataStore mPreferenceDataStore;
@@ -484,11 +484,16 @@
/**
* Gets a {@link SharedPreferences} instance that preferences managed by this will use.
*
- * @return A {@link SharedPreferences} instance pointing to the file that contains the values of
- * preferences that are managed by this or null if {@link PreferenceDataStore} is used instead.
+ * @return a {@link SharedPreferences} instance pointing to the file that contains the values of
+ * preferences that are managed by this PreferenceManager. If a
+ * {@link PreferenceDataStore} has been set, this method returns {@code null}.
*/
public SharedPreferences getSharedPreferences() {
- if (mSharedPreferences == null && getPreferenceDataStore() == null) {
+ if (mPreferenceDataStore != null) {
+ return null;
+ }
+
+ if (mSharedPreferences == null) {
final Context storageContext;
switch (mStorage) {
case STORAGE_DEVICE_PROTECTED:
@@ -564,8 +569,8 @@
/**
* Finds a {@link Preference} based on its key.
*
- * @param key The key of the preference to retrieve.
- * @return The {@link Preference} with the key, or null.
+ * @param key the key of the preference to retrieve
+ * @return the {@link Preference} with the key, or {@code null}
* @see PreferenceGroup#findPreference(CharSequence)
*/
@Nullable
@@ -659,11 +664,11 @@
/**
* Returns an editor to use when modifying the shared preferences.
- * <p>
- * Do NOT commit unless {@link #shouldCommit()} returns true.
*
- * @return An editor to use to write to shared preferences or null if
- * {@link PreferenceDataStore} is used instead.
+ * <p>Do NOT commit unless {@link #shouldCommit()} returns true.
+ *
+ * @return an editor to use to write to shared preferences. If a {@link PreferenceDataStore}
+ * has been set, this method returns {@code null}.
* @see #shouldCommit()
*/
SharedPreferences.Editor getEditor() {
@@ -687,6 +692,8 @@
* {@link #getEditor()}. This will return false in cases where the writes
* should be batched, for example when inflating preferences from XML.
*
+ * <p>If preferences are using {@link PreferenceDataStore} this value is irrelevant.
+ *
* @return Whether the client should commit.
*/
boolean shouldCommit() {
@@ -711,8 +718,8 @@
* Returns the activity that shows the preferences. This is useful for doing
* managed queries, but in most cases the use of {@link #getContext()} is
* preferred.
- * <p>
- * This will return null if this class was instantiated with a Context
+ *
+ * <p>This will return {@code null} if this class was instantiated with a Context
* instead of Activity. For example, when setting the default values.
*
* @return The activity that shows the preferences.
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 33b5903..f53b0d7 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -18,7 +18,6 @@
import static android.net.TrafficStats.KB_IN_BYTES;
import static android.system.OsConstants.SEEK_SET;
-
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkCollectionNotEmpty;
@@ -29,6 +28,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
@@ -38,6 +38,7 @@
import android.graphics.Point;
import android.media.ExifInterface;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.OperationCanceledException;
@@ -45,6 +46,7 @@
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor.OnCloseListener;
import android.os.Parcelable;
+import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.storage.StorageVolume;
import android.system.ErrnoException;
@@ -147,9 +149,9 @@
/**
* Action of intent issued by DocumentsUI when user wishes to open/configure/manage a particular
* document in the provider application.
- *
+ *
* <p>When issued, the intent will include the URI of the document as the intent data.
- *
+ *
* <p>A provider wishing to provide support for this action should do two things.
* <li>Add an {@code <intent-filter>} matching this action.
* <li>When supplying information in {@link DocumentsProvider#queryChildDocuments}, include
@@ -1023,7 +1025,8 @@
* android.os.CancellationSignal)
*/
public static Bitmap getDocumentThumbnail(
- ContentResolver resolver, Uri documentUri, Point size, CancellationSignal signal) {
+ ContentResolver resolver, Uri documentUri, Point size, CancellationSignal signal)
+ throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
documentUri.getAuthority());
try {
@@ -1032,6 +1035,7 @@
if (!(e instanceof OperationCanceledException)) {
Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e);
}
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1113,20 +1117,20 @@
/**
* Create a new document with given MIME type and display name.
*
- * @param parentDocumentUri directory with
- * {@link Document#FLAG_DIR_SUPPORTS_CREATE}
+ * @param parentDocumentUri directory with {@link Document#FLAG_DIR_SUPPORTS_CREATE}
* @param mimeType MIME type of new document
* @param displayName name of new document
* @return newly created document, or {@code null} if failed
*/
public static Uri createDocument(ContentResolver resolver, Uri parentDocumentUri,
- String mimeType, String displayName) {
+ String mimeType, String displayName) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
parentDocumentUri.getAuthority());
try {
return createDocument(client, parentDocumentUri, mimeType, displayName);
} catch (Exception e) {
Log.w(TAG, "Failed to create document", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1177,13 +1181,14 @@
* failed.
*/
public static Uri renameDocument(ContentResolver resolver, Uri documentUri,
- String displayName) {
+ String displayName) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
documentUri.getAuthority());
try {
return renameDocument(client, documentUri, displayName);
} catch (Exception e) {
Log.w(TAG, "Failed to rename document", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1208,7 +1213,8 @@
* @param documentUri document with {@link Document#FLAG_SUPPORTS_DELETE}
* @return if the document was deleted successfully.
*/
- public static boolean deleteDocument(ContentResolver resolver, Uri documentUri) {
+ public static boolean deleteDocument(ContentResolver resolver, Uri documentUri)
+ throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
documentUri.getAuthority());
try {
@@ -1216,6 +1222,7 @@
return true;
} catch (Exception e) {
Log.w(TAG, "Failed to delete document", e);
+ rethrowIfNecessary(resolver, e);
return false;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1240,13 +1247,14 @@
* @return the copied document, or {@code null} if failed.
*/
public static Uri copyDocument(ContentResolver resolver, Uri sourceDocumentUri,
- Uri targetParentDocumentUri) {
+ Uri targetParentDocumentUri) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
sourceDocumentUri.getAuthority());
try {
return copyDocument(client, sourceDocumentUri, targetParentDocumentUri);
} catch (Exception e) {
Log.w(TAG, "Failed to copy document", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1274,7 +1282,7 @@
* @return the moved document, or {@code null} if failed.
*/
public static Uri moveDocument(ContentResolver resolver, Uri sourceDocumentUri,
- Uri sourceParentDocumentUri, Uri targetParentDocumentUri) {
+ Uri sourceParentDocumentUri, Uri targetParentDocumentUri) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
sourceDocumentUri.getAuthority());
try {
@@ -1282,6 +1290,7 @@
targetParentDocumentUri);
} catch (Exception e) {
Log.w(TAG, "Failed to move document", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1311,7 +1320,7 @@
* @return true if the document was removed successfully.
*/
public static boolean removeDocument(ContentResolver resolver, Uri documentUri,
- Uri parentDocumentUri) {
+ Uri parentDocumentUri) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
documentUri.getAuthority());
try {
@@ -1319,6 +1328,7 @@
return true;
} catch (Exception e) {
Log.w(TAG, "Failed to remove document", e);
+ rethrowIfNecessary(resolver, e);
return false;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1367,26 +1377,29 @@
}
/**
- * Finds the canonical path to the top of the tree. The return value starts
- * from the top of the tree or the root document to the requested document,
- * both inclusive.
+ * Finds the canonical path from the top of the document tree.
*
- * Document ID should be unique across roots.
+ * The {@link Path#getPath()} of the return value contains the document ID
+ * of all documents along the path from the top the document tree to the
+ * requested document, both inclusive.
+ *
+ * The {@link Path#getRootId()} of the return value returns {@code null}.
*
* @param treeUri treeUri of the document which path is requested.
- * @return a list of documents ID starting from the top of the tree to the
- * requested document, or {@code null} if failed.
+ * @return the path of the document, or {@code null} if failed.
* @see DocumentsProvider#findDocumentPath(String, String)
*/
- public static List<String> findDocumentPath(ContentResolver resolver, Uri treeUri) {
+ public static Path findDocumentPath(ContentResolver resolver, Uri treeUri)
+ throws FileNotFoundException {
checkArgument(isTreeUri(treeUri), treeUri + " is not a tree uri.");
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
treeUri.getAuthority());
try {
- return findDocumentPath(client, treeUri).getPath();
+ return findDocumentPath(client, treeUri);
} catch (Exception e) {
Log.w(TAG, "Failed to find path", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1394,12 +1407,14 @@
}
/**
- * Finds the canonical path. If uri is a document uri returns path to a root and
- * its associated root id. If uri is a tree uri returns the path to the top of
- * the tree. The {@link Path#getPath()} in the return value starts from the top of
- * the tree or the root document to the requested document, both inclusive.
+ * Finds the canonical path. If uri is a document uri returns path from a root and
+ * its associated root id. If uri is a tree uri returns the path from the top of
+ * the tree. The {@link Path#getPath()} of the return value contains document ID
+ * starts from the top of the tree or the root document to the requested document,
+ * both inclusive.
*
- * Document id should be unique across roots.
+ * Callers can expect the root ID returned from multiple calls to this method is
+ * consistent.
*
* @param uri uri of the document which path is requested. It can be either a
* plain document uri or a tree uri.
@@ -1429,12 +1444,15 @@
* <p>Providers are required to show confirmation UI for all new permissions granted
* for the linked document.
*
- * <p>If list of recipients is known, then it should be passed in options as
+ * <p>If list of recipients is known, then it can be passed in options as
* {@link Intent#EXTRA_EMAIL} as either a string or list of strings. Note, that
* this is just a hint for the provider, which can ignore the list. In either
* case the provider is required to show a UI for letting the user confirm
* any new permission grants.
*
+ * <p>Note, that the entire <code>options</code> bundle is send to the provider.
+ * Make sure that you trust the provider before passing any sensitive information.
+ *
* <p>Since this API may show a UI, it cannot be called from background.
*
* <p>In order to obtain the Web Link use code like this:
@@ -1443,7 +1461,7 @@
* IntentSender sender = DocumentsContract.createWebLinkIntent(<i>...</i>);
* if (sender != null) {
* startIntentSenderForResult(
- * DocumentsContract.createWebLinkIntent(<i>...</i>),
+ * sender,
* WEB_LINK_REQUEST_CODE,
* null, 0, 0, 0, null);
* }
@@ -1467,13 +1485,14 @@
* @see Intent#EXTRA_EMAIL
*/
public static IntentSender createWebLinkIntent(ContentResolver resolver, Uri uri,
- Bundle options) {
+ Bundle options) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
uri.getAuthority());
try {
return createWebLinkIntent(client, uri, options);
} catch (Exception e) {
Log.w(TAG, "Failed to create a web link intent", e);
+ rethrowIfNecessary(resolver, e);
return null;
} finally {
ContentProviderClient.releaseQuietly(client);
@@ -1538,6 +1557,20 @@
return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, extras);
}
+ private static void rethrowIfNecessary(ContentResolver resolver, Exception e)
+ throws FileNotFoundException {
+ // We only want to throw applications targetting O and above
+ if (resolver.getTargetSdkVersion() >= Build.VERSION_CODES.O) {
+ if (e instanceof ParcelableException) {
+ ((ParcelableException) e).maybeRethrow(FileNotFoundException.class);
+ } else if (e instanceof RemoteException ) {
+ ((RemoteException) e).rethrowAsRuntimeException();
+ } else if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ }
+ }
+ }
+
/**
* Holds a path from a document to a particular document under it. It
* may also contains the root ID where the path resides.
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index f5e558a..620d33a5 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -38,6 +38,7 @@
import android.Manifest;
import android.annotation.CallSuper;
import android.annotation.Nullable;
+import android.app.RecoverableSecurityException;
import android.content.ClipDescription;
import android.content.ContentProvider;
import android.content.ContentResolver;
@@ -57,6 +58,7 @@
import android.os.OperationCanceledException;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor.OnCloseListener;
+import android.os.ParcelableException;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Path;
import android.provider.DocumentsContract.Root;
@@ -65,6 +67,7 @@
import libcore.io.IoUtils;
import java.io.FileNotFoundException;
+import java.util.LinkedList;
import java.util.Objects;
/**
@@ -232,6 +235,10 @@
* {@link Document#COLUMN_DOCUMENT_ID}. You must allocate a new
* {@link Document#COLUMN_DOCUMENT_ID} to represent the document, which must
* not change once returned.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param parentDocumentId the parent directory to create the new document
* under.
@@ -255,6 +262,10 @@
* URI permission grants will be updated to point at the new document. If
* the original {@link Document#COLUMN_DOCUMENT_ID} is still valid after the
* rename, return {@code null}.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param documentId the document to rename.
* @param displayName the updated display name of the document. The provider
@@ -275,6 +286,10 @@
* call (such as documents inside a directory) the implementor is
* responsible for revoking those permissions using
* {@link #revokeDocumentPermission(String)}.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param documentId the document to delete.
*/
@@ -290,6 +305,10 @@
* the same document provider. Upon completion returns the document id of
* the copied document at the target destination. {@code null} must never
* be returned.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param sourceDocumentId the document to copy.
* @param targetParentDocumentId the target document to be copied into as a child.
@@ -310,6 +329,10 @@
*
* <p>It's the responsibility of the provider to revoke grants if the document
* is no longer accessible using <code>sourceDocumentId</code>.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param sourceDocumentId the document to move.
* @param sourceParentDocumentId the parent of the document to move.
@@ -332,6 +355,9 @@
* <p>It's the responsibility of the provider to revoke grants if the document is
* removed from the last parent, and effectively the document is deleted.
*
+ * <p>{@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
* @param documentId the document to remove.
* @param parentDocumentId the parent of the document to move.
*/
@@ -351,15 +377,19 @@
* <p>This API assumes that document ID has enough info to infer the root.
* Different roots should use different document ID to refer to the same
* document.
+ * <p>{@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.perly.
*
- * @param childDocumentId the document which path is requested.
+ *
* @param parentDocumentId the document from which the path starts if not null,
* or null to indicate a path from the root is requested.
+ * @param childDocumentId the document which path is requested.
* @return the path of the requested document. If parentDocumentId is null
* returned root ID must not be null. If parentDocumentId is not null
* returned root ID must be null.
*/
- public Path findDocumentPath(String childDocumentId, @Nullable String parentDocumentId)
+ public Path findDocumentPath(@Nullable String parentDocumentId, String childDocumentId)
throws FileNotFoundException {
throw new UnsupportedOperationException("findDocumentPath not supported.");
}
@@ -367,9 +397,11 @@
/**
* Creates an intent sender for a web link, if the document is web linkable.
* <p>
- * Before any new permissions are granted for the linked document, a visible
- * UI must be shown, so the user can explicitly confirm whether the permission
- * grants are expected. The user must be able to cancel the operation.
+ * {@link RecoverableSecurityException} can be thrown if user does not have
+ * sufficient permission for the linked document. Before any new permissions
+ * are granted for the linked document, a visible UI must be shown, so the
+ * user can explicitly confirm whether the permission grants are expected.
+ * The user must be able to cancel the operation.
* <p>
* Options passed as an argument may include a list of recipients, such
* as email addresses. The provider should reflect these options if possible,
@@ -403,6 +435,10 @@
* If this set of roots changes, you must call {@link ContentResolver#notifyChange(Uri,
* android.database.ContentObserver, boolean)} with
* {@link DocumentsContract#buildRootsUri(String)} to notify the system.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
*
* @param projection list of {@link Root} columns to put into the cursor. If
* {@code null} all supported columns should be included.
@@ -416,6 +452,10 @@
* sorted by {@link Document#COLUMN_LAST_MODIFIED} in descending order, and
* limited to only return the 64 most recently modified documents.
* <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
+ * <p>
* Recent documents do not support change notifications.
*
* @param projection list of {@link Document} columns to put into the
@@ -432,6 +472,11 @@
/**
* Return metadata for the single requested document. You should avoid
* making network requests to keep this request fast.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
+ *
*
* @param documentId the document to return.
* @param projection list of {@link Document} columns to put into the
@@ -464,6 +509,11 @@
* you can call {@link ContentResolver#notifyChange(Uri,
* android.database.ContentObserver, boolean)} with that Uri to send change
* notifications.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
+ *
*
* @param parentDocumentId the directory to return children for.
* @param projection list of {@link Document} columns to put into the
@@ -502,6 +552,10 @@
* you can call {@link ContentResolver#notifyChange(Uri,
* android.database.ContentObserver, boolean)} with that Uri to send change
* notifications.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
*
* @param parentDocumentId the directory to return children for.
* @param projection list of {@link Document} columns to put into the
@@ -555,6 +609,10 @@
* String, String)}. Then you can call {@link ContentResolver#notifyChange(Uri,
* android.database.ContentObserver, boolean)} with that Uri to send change
* notifications.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), or returned as part of
+ * Cursor's bundle. It is not guaranteed that the client will handle this properly.
*
* @param rootId the root to search under.
* @param query string to match documents against.
@@ -582,6 +640,10 @@
* of {@link Document#COLUMN_MIME_TYPE} for this document. The default
* implementation queries {@link #queryDocument(String, String[])}, so
* providers may choose to override this as an optimization.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*/
public String getDocumentType(String documentId) throws FileNotFoundException {
final Cursor cursor = queryDocument(documentId, null);
@@ -607,6 +669,10 @@
* <p>
* If you block while downloading content, you should periodically check
* {@link CancellationSignal#isCanceled()} to abort abandoned open requests.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param documentId the document to return.
* @param mode the mode to open with, such as 'r', 'w', or 'rw'.
@@ -631,6 +697,10 @@
* If you perform expensive operations to download or generate a thumbnail,
* you should periodically check {@link CancellationSignal#isCanceled()} to
* abort abandoned thumbnail requests.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param documentId the document to return.
* @param sizeHint hint of the optimal thumbnail dimensions.
@@ -653,6 +723,10 @@
* matching the specified MIME type filter.
* <p>
* Virtual documents must have at least one streamable format.
+ * <p>
+ * {@link RecoverableSecurityException} can be thrown if more input is required
+ * from the user (such as insufficient permission), but it is not guaranteed that
+ * the client will handle this properly.
*
* @param documentId the document to return.
* @param mimeTypeFilter the MIME type filter for the requested format. May
@@ -876,7 +950,7 @@
try {
return callUnchecked(method, arg, extras);
} catch (FileNotFoundException e) {
- throw new IllegalStateException("Failed call " + method, e);
+ throw new ParcelableException(e);
}
}
@@ -1048,13 +1122,19 @@
? DocumentsContract.getTreeDocumentId(documentUri)
: null;
- Path path = findDocumentPath(documentId, parentDocumentId);
+ Path path = findDocumentPath(parentDocumentId, documentId);
// Ensure provider doesn't leak information to unprivileged callers.
if (isTreeUri) {
if (!Objects.equals(path.getPath().get(0), parentDocumentId)) {
Log.wtf(TAG, "Provider doesn't return path from the tree root. Expected: "
+ parentDocumentId + " found: " + path.getPath().get(0));
+
+ LinkedList<String> docs = new LinkedList<>(path.getPath());
+ while (docs.size() > 1 && !Objects.equals(docs.getFirst(), parentDocumentId)) {
+ docs.removeFirst();
+ }
+ path = new Path(null, docs);
}
if (path.getRootId() != null) {
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index 96dd76b..9f5d9d4 100644
--- a/core/java/android/provider/FontsContract.java
+++ b/core/java/android/provider/FontsContract.java
@@ -40,6 +40,7 @@
import com.android.internal.annotations.VisibleForTesting;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -78,6 +79,37 @@
* {@link android.graphics.Typeface#BOLD_ITALIC}
*/
public static final String STYLE = "font_style";
+ /**
+ * Constant used to request data from a font provider. The cursor returned from the query
+ * should have this column populated to indicate the result status of the
+ * query. This will be checked before any other data in the cursor. Possible values are
+ * {@link #RESULT_CODE_OK}, {@link #RESULT_CODE_FONT_NOT_FOUND},
+ * {@link #RESULT_CODE_MALFORMED_QUERY} and {@link #RESULT_CODE_FONT_UNAVAILABLE}. If not
+ * present, {@link #RESULT_CODE_OK} will be assumed.
+ */
+ public static final String RESULT_CODE = "result_code";
+
+ /**
+ * Constant used to represent a result was retrieved successfully. The given fonts will be
+ * attempted to retrieve immediately via
+ * {@link android.content.ContentProvider#openFile(Uri, String)}. See {@link #RESULT_CODE}.
+ */
+ public static final int RESULT_CODE_OK = 0;
+ /**
+ * Constant used to represent a result was not found. See {@link #RESULT_CODE}.
+ */
+ public static final int RESULT_CODE_FONT_NOT_FOUND = 1;
+ /**
+ * Constant used to represent a result was found, but cannot be provided at this moment. Use
+ * this to indicate, for example, that a font needs to be fetched from the network. See
+ * {@link #RESULT_CODE}.
+ */
+ public static final int RESULT_CODE_FONT_UNAVAILABLE = 2;
+ /**
+ * Constant used to represent that the query was not in a supported format by the provider.
+ * See {@link #RESULT_CODE}.
+ */
+ public static final int RESULT_CODE_MALFORMED_QUERY = 3;
}
/**
@@ -87,12 +119,13 @@
*/
public static final String PARCEL_FONT_RESULTS = "font_results";
+ // Error codes internal to the system, which can not come from a provider. To keep the number
+ // space open for new provider codes, these should all be negative numbers.
/** @hide */
- public static final int RESULT_CODE_OK = 0;
+ public static final int RESULT_CODE_PROVIDER_NOT_FOUND = -1;
/** @hide */
- public static final int RESULT_CODE_FONT_NOT_FOUND = 1;
- /** @hide */
- public static final int RESULT_CODE_PROVIDER_NOT_FOUND = 2;
+ public static final int RESULT_CODE_WRONG_CERTIFICATES = -2;
+ // Note -3 is used by Typeface to indicate the font failed to load.
private static final int THREAD_RENEWAL_THRESHOLD_MS = 10000;
@@ -136,9 +169,7 @@
}
};
- /**
- * @hide
- */
+ /** @hide */
public void getFont(FontRequest request, ResultReceiver receiver) {
synchronized (mLock) {
if (mHandler == null) {
@@ -147,9 +178,8 @@
mHandler = new Handler(mThread.getLooper());
}
mHandler.post(() -> {
- ProviderInfo providerInfo = getProvider(request);
+ ProviderInfo providerInfo = getProvider(request, receiver);
if (providerInfo == null) {
- receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
return;
}
getFontFromProvider(request, receiver, providerInfo.authority);
@@ -161,17 +191,19 @@
/** @hide */
@VisibleForTesting
- public ProviderInfo getProvider(FontRequest request) {
+ public ProviderInfo getProvider(FontRequest request, ResultReceiver receiver) {
String providerAuthority = request.getProviderAuthority();
ProviderInfo info = mPackageManager.resolveContentProvider(providerAuthority, 0);
if (info == null) {
Log.e(TAG, "Can't find content provider " + providerAuthority);
+ receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
return null;
}
if (!info.packageName.equals(request.getProviderPackage())) {
Log.e(TAG, "Found content provider " + providerAuthority + ", but package was not "
+ request.getProviderPackage());
+ receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
return null;
}
// Trust system apps without signature checks
@@ -186,6 +218,7 @@
signatures = convertToSet(packageInfo.signatures);
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Can't find content provider " + providerAuthority, e);
+ receiver.send(RESULT_CODE_PROVIDER_NOT_FOUND, null);
return null;
}
List<List<byte[]>> requestCertificatesList = request.getCertificates();
@@ -196,6 +229,7 @@
}
}
Log.e(TAG, "Certificates don't match for given provider " + providerAuthority);
+ receiver.send(RESULT_CODE_WRONG_CERTIFICATES, null);
return null;
}
@@ -222,17 +256,37 @@
.authority(authority)
.build();
try (Cursor cursor = mContext.getContentResolver().query(uri, new String[] { Columns._ID,
- Columns.TTC_INDEX, Columns.VARIATION_SETTINGS, Columns.STYLE },
+ Columns.TTC_INDEX, Columns.VARIATION_SETTINGS, Columns.STYLE,
+ Columns.RESULT_CODE },
"query = ?", new String[] { request.getQuery() }, null);) {
// TODO: Should we restrict the amount of fonts that can be returned?
// TODO: Write documentation explaining that all results should be from the same family.
if (cursor != null && cursor.getCount() > 0) {
+ final int resultCodeColumnIndex = cursor.getColumnIndex(Columns.RESULT_CODE);
+ int resultCode = -1;
result = new ArrayList<>();
- final int idColumnIndex = cursor.getColumnIndex(Columns._ID);
+ final int idColumnIndex = cursor.getColumnIndexOrThrow(Columns._ID);
final int ttcIndexColumnIndex = cursor.getColumnIndex(Columns.TTC_INDEX);
final int vsColumnIndex = cursor.getColumnIndex(Columns.VARIATION_SETTINGS);
final int styleColumnIndex = cursor.getColumnIndex(Columns.STYLE);
while (cursor.moveToNext()) {
+ resultCode = resultCodeColumnIndex != -1
+ ? cursor.getInt(resultCodeColumnIndex) : Columns.RESULT_CODE_OK;
+ if (resultCode != Columns.RESULT_CODE_OK) {
+ if (resultCode < 0) {
+ // Negative values are reserved for the internal errors.
+ resultCode = Columns.RESULT_CODE_FONT_NOT_FOUND;
+ }
+ for (int i = 0; i < result.size(); ++i) {
+ try {
+ result.get(i).getFileDescriptor().close();
+ } catch (IOException e) {
+ // Ignore, as we are closing fds for cleanup.
+ }
+ }
+ receiver.send(resultCode, null);
+ return;
+ }
long id = cursor.getLong(idColumnIndex);
Uri fileUri = ContentUris.withAppendedId(uri, id);
try {
@@ -255,9 +309,9 @@
if (result != null && !result.isEmpty()) {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(PARCEL_FONT_RESULTS, result);
- receiver.send(RESULT_CODE_OK, bundle);
+ receiver.send(Columns.RESULT_CODE_OK, bundle);
return;
}
- receiver.send(RESULT_CODE_FONT_NOT_FOUND, null);
+ receiver.send(Columns.RESULT_CODE_FONT_NOT_FOUND, null);
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e3a9d80..8a2a14c 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -506,8 +506,6 @@
* Input: Nothing.
* <p>
* Output: Nothing.
- *
- * @hide
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_NIGHT_DISPLAY_SETTINGS =
@@ -3852,6 +3850,17 @@
};
/**
+ * Setting to determine whether or not to show the battery percentage in the status bar.
+ * 0 - Don't show percentage
+ * 1 - Show percentage
+ * @hide
+ */
+ public static final String SHOW_BATTERY_PERCENT = "status_bar_show_battery_percent";
+
+ /** @hide */
+ private static final Validator SHOW_BATTERY_PERCENT_VALIDATOR = sBooleanValidator;
+
+ /**
* IMPORTANT: If you add a new public settings you also have to add it to
* PUBLIC_SETTINGS below. If the new setting is hidden you have to add
* it to PRIVATE_SETTINGS below. Also add a validator that can validate
@@ -3913,7 +3922,8 @@
RINGTONE,
LOCK_TO_APP_ENABLED,
NOTIFICATION_SOUND,
- ACCELEROMETER_ROTATION
+ ACCELEROMETER_ROTATION,
+ SHOW_BATTERY_PERCENT
};
/**
@@ -4013,6 +4023,7 @@
PRIVATE_SETTINGS.add(POINTER_SPEED);
PRIVATE_SETTINGS.add(LOCK_TO_APP_ENABLED);
PRIVATE_SETTINGS.add(EGG_MODE);
+ PRIVATE_SETTINGS.add(SHOW_BATTERY_PERCENT);
}
/**
@@ -4090,6 +4101,7 @@
VALIDATORS.put(WIFI_STATIC_NETMASK, WIFI_STATIC_NETMASK_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);
+ VALIDATORS.put(SHOW_BATTERY_PERCENT, SHOW_BATTERY_PERCENT_VALIDATOR);
}
/**
@@ -5128,11 +5140,11 @@
public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
/**
- * The currently selected auto-fill service flattened ComponentName.
+ * The currently selected autofill service flattened ComponentName.
* @hide
*/
@TestApi
- public static final String AUTO_FILL_SERVICE = "auto_fill_service";
+ public static final String AUTOFILL_SERVICE = "autofill_service";
/**
* bluetooth HCI snoop log configuration
@@ -6743,6 +6755,13 @@
public static final String ASSIST_GESTURE_ENABLED = "assist_gesture_enabled";
/**
+ * Sensitivity control for the assist gesture.
+ *
+ * @hide
+ */
+ public static final String ASSIST_GESTURE_SENSITIVITY = "assist_gesture_sensitivity";
+
+ /**
* Control whether Night display is currently activated.
* @hide
*/
@@ -7001,6 +7020,7 @@
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
ASSIST_GESTURE_ENABLED,
+ ASSIST_GESTURE_SENSITIVITY,
VR_DISPLAY_MODE
};
@@ -7646,12 +7666,14 @@
public static final String HDMI_CONTROL_ENABLED = "hdmi_control_enabled";
/**
- * Whether HDMI system audio is enabled. If enabled, TV internal speaker is muted,
- * and the output is redirected to AV Receiver connected via
- * {@Global#HDMI_SYSTEM_AUDIO_OUTPUT}.
+ * Whether HDMI System Audio Control feature is enabled. If enabled, TV will try to turn on
+ * system audio mode if there's a connected CEC-enabled AV Receiver. Then audio stream will
+ * be played on AVR instead of TV spaeker. If disabled, the system audio mode will never be
+ * activated.
* @hide
*/
- public static final String HDMI_SYSTEM_AUDIO_ENABLED = "hdmi_system_audio_enabled";
+ public static final String HDMI_SYSTEM_AUDIO_CONTROL_ENABLED =
+ "hdmi_system_audio_control_enabled";
/**
* Whether TV will automatically turn on upon reception of the CEC command
diff --git a/core/java/android/service/autofill/AutoFillService.java b/core/java/android/service/autofill/AutoFillService.java
index 3c211eb..c26f679 100644
--- a/core/java/android/service/autofill/AutoFillService.java
+++ b/core/java/android/service/autofill/AutoFillService.java
@@ -15,236 +15,10 @@
*/
package android.service.autofill;
-import android.accessibilityservice.IAccessibilityServiceConnection;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Message;
-import android.os.RemoteException;
-import android.view.accessibility.AccessibilityInteractionClient;
-import com.android.internal.os.HandlerCaller;
-import android.annotation.SdkConstant;
-import android.app.Activity;
-import android.app.Service;
-import android.app.assist.AssistStructure;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.CancellationSignal;
-import android.os.IBinder;
-import android.os.ICancellationSignal;
-import android.os.Looper;
-import android.util.Log;
-
-import com.android.internal.os.SomeArgs;
-
-//TODO(b/33197203): improve javadoc (of both class and methods); in particular, make sure the
-//life-cycle (and how state could be maintained on server-side) is well documented.
-
/**
- * Top-level service of the current auto-fill service for a given user.
- *
- * <p>Apps providing auto-fill capabilities must extend this service.
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use AutofillService
*/
-public abstract class AutoFillService extends Service {
- private static final String TAG = "AutoFillService";
-
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * To be supported, the service must also require the
- * {@link android.Manifest.permission#BIND_AUTO_FILL} permission so
- * that other applications can not abuse it.
- */
- @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
- public static final String SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
-
- /**
- * Name under which a AutoFillService component publishes information about itself.
- * This meta-data should reference an XML resource containing a
- * <code><{@link
- * android.R.styleable#AutoFillService autofill-service}></code> tag.
- * This is a a sample XML file configuring an AutoFillService:
- * <pre> <autofill-service
- * android:settingsActivity="foo.bar.SettingsActivity"
- * . . .
- * /></pre>
- */
- public static final String SERVICE_META_DATA = "android.autofill";
-
- // Internal extras
- /** @hide */
- public static final String EXTRA_ACTIVITY_TOKEN =
- "android.service.autofill.extra.ACTIVITY_TOKEN";
-
- // Handler messages.
- private static final int MSG_CONNECT = 1;
- private static final int MSG_DISCONNECT = 2;
- private static final int MSG_ON_FILL_REQUEST = 3;
- private static final int MSG_ON_SAVE_REQUEST = 4;
-
- private final IAutoFillService mInterface = new IAutoFillService.Stub() {
- @Override
- public void onInit(IAutoFillServiceConnection connection) {
- if (connection != null) {
- mHandlerCaller.obtainMessageO(MSG_CONNECT, connection).sendToTarget();
- } else {
- mHandlerCaller.obtainMessage(MSG_DISCONNECT).sendToTarget();
- }
- }
-
- @Override
- public void onFillRequest(AssistStructure structure, Bundle extras,
- IFillCallback callback) {
- ICancellationSignal transport = CancellationSignal.createTransport();
- try {
- callback.onCancellable(transport);
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
- mHandlerCaller.obtainMessageOOOO(MSG_ON_FILL_REQUEST, structure,
- CancellationSignal.fromTransport(transport), extras, callback)
- .sendToTarget();
- }
-
- @Override
- public void onSaveRequest(AssistStructure structure, Bundle extras,
- ISaveCallback callback) {
- mHandlerCaller.obtainMessageOOO(MSG_ON_SAVE_REQUEST, structure,
- extras, callback).sendToTarget();
- }
- };
-
- private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
- switch (msg.what) {
- case MSG_CONNECT: {
- mConnection = (IAutoFillServiceConnection) msg.obj;
- onConnected();
- break;
- } case MSG_ON_FILL_REQUEST: {
- final SomeArgs args = (SomeArgs) msg.obj;
- final AssistStructure structure = (AssistStructure) args.arg1;
- final CancellationSignal cancellation = (CancellationSignal) args.arg2;
- final Bundle extras = (Bundle) args.arg3;
- final IFillCallback callback = (IFillCallback) args.arg4;
- final FillCallback fillCallback = new FillCallback(callback);
- args.recycle();
- onFillRequest(structure, extras, cancellation, fillCallback);
- break;
- } case MSG_ON_SAVE_REQUEST: {
- final SomeArgs args = (SomeArgs) msg.obj;
- final AssistStructure structure = (AssistStructure) args.arg1;
- final Bundle extras = (Bundle) args.arg2;
- final ISaveCallback callback = (ISaveCallback) args.arg3;
- final SaveCallback saveCallback = new SaveCallback(callback);
- args.recycle();
- onSaveRequest(structure, extras, saveCallback);
- break;
- } case MSG_DISCONNECT: {
- onDisconnected();
- mConnection = null;
- break;
- } default: {
- Log.w(TAG, "MyCallbacks received invalid message type: " + msg);
- }
- }
- };
-
- private HandlerCaller mHandlerCaller;
-
- private IAutoFillServiceConnection mConnection;
-
- /**
- * {@inheritDoc}
- *
- * <strong>NOTE: </strong>if overridden, it must call {@code super.onCreate()}.
- */
- @Override
- public void onCreate() {
- super.onCreate();
- mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(), mHandlerCallback, true);
- }
-
- @Override
- public final IBinder onBind(Intent intent) {
- if (SERVICE_INTERFACE.equals(intent.getAction())) {
- return mInterface.asBinder();
- }
- Log.w(TAG, "Tried to bind to wrong intent: " + intent);
- return null;
- }
-
- /**
- * Called when the Android system connects to service.
- *
- * <p>You should generally do initialization here rather than in {@link #onCreate}.
- */
- public void onConnected() {
- //TODO(b/33197203): is not called anymore, fix it!
- }
-
- /**
- * Called by the Android system do decide if an {@link Activity} can be auto-filled by the
- * service.
- *
- * <p>Service must call one of the {@link FillCallback} methods (like
- * {@link FillCallback#onSuccess(FillResponse)}
- * or {@link FillCallback#onFailure(CharSequence)})
- * to notify the result of the request.
- *
- * @param structure {@link Activity}'s view structure.
- * @param data bundle containing data passed by the service on previous calls to fill.
- * This bundle allows your service to keep state between fill and save requests
- * as well as when filling different sections of the UI as the system will try to
- * aggressively unbind from the service to conserve resources. See {@link
- * FillResponse} Javadoc for examples of multiple-sections requests.
- * @param cancellationSignal signal for observing cancellation requests. The system will use
- * this to notify you that the fill result is no longer needed and you should stop
- * handling this fill request in order to save resources.
- * @param callback object used to notify the result of the request.
- */
- public abstract void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
- @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback);
-
- /**
- * Called when user requests service to save the fields of an {@link Activity}.
- *
- * <p>Service must call one of the {@link SaveCallback} methods (like
- * {@link SaveCallback#onSuccess()} or {@link SaveCallback#onFailure(CharSequence)})
- * to notify the result of the request.
- *
- * @param structure {@link Activity}'s view structure.
- * @param data bundle containing data passed by the service on previous calls to fill.
- * This bundle allows your service to keep state between fill and save requests
- * as well as when filling different sections of the UI as the system will try to
- * aggressively unbind from the service to conserve resources. See {@link
- * FillResponse} Javadoc for examples of multiple-sections requests.
- * @param callback object used to notify the result of the request.
- */
- public abstract void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
- @NonNull SaveCallback callback);
-
- /**
- * Called when the Android system disconnects from the service.
- *
- * <p> At this point this service may no longer be an active {@link AutoFillService}.
- */
- public void onDisconnected() {
- //TODO(b/33197203): is not called anymore, fix it!
- }
-
- /**
- * Disables the service. After calling this method, the service will
- * be disabled and settings will show that it is turned off.
- *
- * <p>You should call this method only after a call to {@link #onConnected()}
- * and before the corresponding call to {@link #onDisconnected()}. In other words
- * you can disable your service only while the system is connected to it.</p>
- */
- public final void disableSelf() {
- if (mConnection != null) {
- try {
- mConnection.disableSelf();
- } catch (RemoteException re) {
- throw re.rethrowFromSystemServer();
- }
- }
- }
+@Deprecated
+public abstract class AutoFillService extends AutofillService {
}
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
new file mode 100644
index 0000000..29e2073
--- /dev/null
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.RemoteException;
+import com.android.internal.os.HandlerCaller;
+import android.annotation.SdkConstant;
+import android.app.Activity;
+import android.app.Service;
+import android.app.assist.AssistStructure;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.IBinder;
+import android.os.ICancellationSignal;
+import android.os.Looper;
+import android.util.Log;
+
+import com.android.internal.os.SomeArgs;
+
+//TODO(b/33197203): improve javadoc (of both class and methods); in particular, make sure the
+//life-cycle (and how state could be maintained on server-side) is well documented.
+
+/**
+ * Top-level service of the current autofill service for a given user.
+ *
+ * <p>Apps providing autofill capabilities must extend this service.
+ */
+public abstract class AutofillService extends Service {
+ private static final String TAG = "AutofillService";
+
+ /**
+ * The {@link Intent} that must be declared as handled by the service.
+ * To be supported, the service must also require the
+ * {@link android.Manifest.permission#BIND_AUTO_FILL} permission so
+ * that other applications can not abuse it.
+ *
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use AutofillService
+ */
+ @Deprecated
+ @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ public static final String OLD_SERVICE_INTERFACE = "android.service.autofill.AutoFillService";
+
+ /**
+ * The {@link Intent} that must be declared as handled by the service.
+ * To be supported, the service must also require the
+ * {@link android.Manifest.permission#BIND_AUTOFILL} permission so
+ * that other applications can not abuse it.
+ */
+ @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
+ public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillService";
+
+ /**
+ * Name under which a AutoFillService component publishes information about itself.
+ * This meta-data should reference an XML resource containing a
+ * <code><{@link
+ * android.R.styleable#AutoFillService autofill-service}></code> tag.
+ * This is a a sample XML file configuring an AutoFillService:
+ * <pre> <autofill-service
+ * android:settingsActivity="foo.bar.SettingsActivity"
+ * . . .
+ * /></pre>
+ */
+ public static final String SERVICE_META_DATA = "android.autofill";
+
+ // Internal extras
+ /** @hide */
+ public static final String EXTRA_ACTIVITY_TOKEN =
+ "android.service.autofill.extra.ACTIVITY_TOKEN";
+
+ // Handler messages.
+ private static final int MSG_CONNECT = 1;
+ private static final int MSG_DISCONNECT = 2;
+ private static final int MSG_ON_FILL_REQUEST = 3;
+ private static final int MSG_ON_SAVE_REQUEST = 4;
+
+ private final IAutoFillService mInterface = new IAutoFillService.Stub() {
+ @Override
+ public void onInit(IAutoFillServiceConnection connection) {
+ if (connection != null) {
+ mHandlerCaller.obtainMessageO(MSG_CONNECT, connection).sendToTarget();
+ } else {
+ mHandlerCaller.obtainMessage(MSG_DISCONNECT).sendToTarget();
+ }
+ }
+
+ @Override
+ public void onFillRequest(AssistStructure structure, Bundle extras,
+ IFillCallback callback) {
+ ICancellationSignal transport = CancellationSignal.createTransport();
+ try {
+ callback.onCancellable(transport);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ mHandlerCaller.obtainMessageOOOO(MSG_ON_FILL_REQUEST, structure,
+ CancellationSignal.fromTransport(transport), extras, callback)
+ .sendToTarget();
+ }
+
+ @Override
+ public void onSaveRequest(AssistStructure structure, Bundle extras,
+ ISaveCallback callback) {
+ mHandlerCaller.obtainMessageOOO(MSG_ON_SAVE_REQUEST, structure,
+ extras, callback).sendToTarget();
+ }
+ };
+
+ private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
+ switch (msg.what) {
+ case MSG_CONNECT: {
+ mConnection = (IAutoFillServiceConnection) msg.obj;
+ onConnected();
+ break;
+ } case MSG_ON_FILL_REQUEST: {
+ final SomeArgs args = (SomeArgs) msg.obj;
+ final AssistStructure structure = (AssistStructure) args.arg1;
+ final CancellationSignal cancellation = (CancellationSignal) args.arg2;
+ final Bundle extras = (Bundle) args.arg3;
+ final IFillCallback callback = (IFillCallback) args.arg4;
+ final FillCallback fillCallback = new FillCallback(callback);
+ args.recycle();
+ onFillRequest(structure, extras, cancellation, fillCallback);
+ break;
+ } case MSG_ON_SAVE_REQUEST: {
+ final SomeArgs args = (SomeArgs) msg.obj;
+ final AssistStructure structure = (AssistStructure) args.arg1;
+ final Bundle extras = (Bundle) args.arg2;
+ final ISaveCallback callback = (ISaveCallback) args.arg3;
+ final SaveCallback saveCallback = new SaveCallback(callback);
+ args.recycle();
+ onSaveRequest(structure, extras, saveCallback);
+ break;
+ } case MSG_DISCONNECT: {
+ onDisconnected();
+ mConnection = null;
+ break;
+ } default: {
+ Log.w(TAG, "MyCallbacks received invalid message type: " + msg);
+ }
+ }
+ };
+
+ private HandlerCaller mHandlerCaller;
+
+ private IAutoFillServiceConnection mConnection;
+
+ /**
+ * {@inheritDoc}
+ *
+ * <strong>NOTE: </strong>if overridden, it must call {@code super.onCreate()}.
+ */
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(), mHandlerCallback, true);
+ }
+
+ @Override
+ public final IBinder onBind(Intent intent) {
+ if (SERVICE_INTERFACE.equals(intent.getAction())
+ || OLD_SERVICE_INTERFACE.equals(intent.getAction())) {
+ return mInterface.asBinder();
+ }
+ Log.w(TAG, "Tried to bind to wrong intent: " + intent);
+ return null;
+ }
+
+ /**
+ * Called when the Android system connects to service.
+ *
+ * <p>You should generally do initialization here rather than in {@link #onCreate}.
+ */
+ public void onConnected() {
+ //TODO(b/33197203): is not called anymore, fix it!
+ }
+
+ /**
+ * Called by the Android system do decide if an {@link Activity} can be autofilled by the
+ * service.
+ *
+ * <p>Service must call one of the {@link FillCallback} methods (like
+ * {@link FillCallback#onSuccess(FillResponse)}
+ * or {@link FillCallback#onFailure(CharSequence)})
+ * to notify the result of the request.
+ *
+ * @param structure {@link Activity}'s view structure.
+ * @param data bundle containing data passed by the service on previous calls to fill.
+ * This bundle allows your service to keep state between fill and save requests
+ * as well as when filling different sections of the UI as the system will try to
+ * aggressively unbind from the service to conserve resources. See {@link
+ * FillResponse} Javadoc for examples of multiple-sections requests.
+ * @param cancellationSignal signal for observing cancellation requests. The system will use
+ * this to notify you that the fill result is no longer needed and you should stop
+ * handling this fill request in order to save resources.
+ * @param callback object used to notify the result of the request.
+ */
+ public abstract void onFillRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
+ @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback callback);
+
+ /**
+ * Called when user requests service to save the fields of an {@link Activity}.
+ *
+ * <p>Service must call one of the {@link SaveCallback} methods (like
+ * {@link SaveCallback#onSuccess()} or {@link SaveCallback#onFailure(CharSequence)})
+ * to notify the result of the request.
+ *
+ * @param structure {@link Activity}'s view structure.
+ * @param data bundle containing data passed by the service on previous calls to fill.
+ * This bundle allows your service to keep state between fill and save requests
+ * as well as when filling different sections of the UI as the system will try to
+ * aggressively unbind from the service to conserve resources. See {@link
+ * FillResponse} Javadoc for examples of multiple-sections requests.
+ * @param callback object used to notify the result of the request.
+ */
+ public abstract void onSaveRequest(@NonNull AssistStructure structure, @Nullable Bundle data,
+ @NonNull SaveCallback callback);
+
+ /**
+ * Called when the Android system disconnects from the service.
+ *
+ * <p> At this point this service may no longer be an active {@link AutofillService}.
+ */
+ public void onDisconnected() {
+ //TODO(b/33197203): is not called anymore, fix it!
+ }
+
+ /**
+ * Disables the service. After calling this method, the service will
+ * be disabled and settings will show that it is turned off.
+ *
+ * <p>You should call this method only after a call to {@link #onConnected()}
+ * and before the corresponding call to {@link #onDisconnected()}. In other words
+ * you can disable your service only while the system is connected to it.</p>
+ */
+ public final void disableSelf() {
+ if (mConnection != null) {
+ try {
+ mConnection.disableSelf();
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+ }
+}
diff --git a/core/java/android/service/autofill/AutoFillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java
similarity index 73%
rename from core/java/android/service/autofill/AutoFillServiceInfo.java
rename to core/java/android/service/autofill/AutofillServiceInfo.java
index 985e32f..d220052 100644
--- a/core/java/android/service/autofill/AutoFillServiceInfo.java
+++ b/core/java/android/service/autofill/AutofillServiceInfo.java
@@ -38,12 +38,12 @@
// TODO(b/33197203 , b/33802548): add CTS tests
/**
- * {@link ServiceInfo} and meta-data about an {@link AutoFillService}.
+ * {@link ServiceInfo} and meta-data about an {@link AutofillService}.
*
* @hide
*/
-public final class AutoFillServiceInfo {
- private static final String TAG = "AutoFillServiceInfo";
+public final class AutofillServiceInfo {
+ private static final String TAG = "AutofillServiceInfo";
private static ServiceInfo getServiceInfoOrThrow(ComponentName comp, int userHandle)
throws PackageManager.NameNotFoundException {
@@ -66,17 +66,26 @@
@Nullable
private final String mSettingsActivity;
- public AutoFillServiceInfo(PackageManager pm, ComponentName comp, int userHandle)
+ public AutofillServiceInfo(PackageManager pm, ComponentName comp, int userHandle)
throws PackageManager.NameNotFoundException {
this(pm, getServiceInfoOrThrow(comp, userHandle));
}
- public AutoFillServiceInfo(PackageManager pm, ServiceInfo si) {
+ public AutofillServiceInfo(PackageManager pm, ServiceInfo si) {
mServiceInfo = si;
final TypedArray metaDataArray = getMetaDataArray(pm, si);
if (metaDataArray != null) {
- mSettingsActivity =
- metaDataArray.getString(R.styleable.AutoFillService_settingsActivity);
+ // TODO(b/35956626): inline newSettingsActivity once clients migrate
+ final String newSettingsActivity =
+ metaDataArray.getString(R.styleable.AutofillService_settingsActivity);
+ System.out.println(">>> NEW CRAP MAN: " + newSettingsActivity); // TODO(felipeal): tmp
+ if (newSettingsActivity != null) {
+ mSettingsActivity = newSettingsActivity;
+ } else {
+ mSettingsActivity =
+ metaDataArray.getString(R.styleable.AutoFillService_settingsActivity);
+ }
+ System.out.println(">>> FINAL CRAP MAN: " + mSettingsActivity); // TODO(felipeal): tmp
metaDataArray.recycle();
} else {
mSettingsActivity = null;
@@ -89,13 +98,18 @@
@Nullable
private static TypedArray getMetaDataArray(PackageManager pm, ServiceInfo si) {
// Check for permissions.
- if (!Manifest.permission.BIND_AUTO_FILL.equals(si.permission)) {
- Log.e(TAG, "Service does not require permission " + Manifest.permission.BIND_AUTO_FILL);
+ // TODO(b/35956626): remove check for BIND_AUTO_FILL once clients migrate
+ if (!Manifest.permission.BIND_AUTOFILL.equals(si.permission)
+ && !Manifest.permission.BIND_AUTO_FILL.equals(si.permission)) {
+ Log.e(TAG, "Service does not require permission " + Manifest.permission.BIND_AUTOFILL);
return null;
}
+ // TODO(b/35956626): remove once clients migrate
+ final boolean oldStyle = !Manifest.permission.BIND_AUTOFILL.equals(si.permission);
+
// Get the AutoFill metadata, if declared.
- XmlResourceParser parser = si.loadXmlMetaData(pm, AutoFillService.SERVICE_META_DATA);
+ XmlResourceParser parser = si.loadXmlMetaData(pm, AutofillService.SERVICE_META_DATA);
if (parser == null) {
return null;
}
@@ -129,7 +143,8 @@
return null;
}
- return res.obtainAttributes(attrs, R.styleable.AutoFillService);
+ return oldStyle ? res.obtainAttributes(attrs, R.styleable.AutoFillService)
+ : res.obtainAttributes(attrs, R.styleable.AutofillService);
} finally {
parser.close();
}
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index d76d444..2461947 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -25,13 +25,15 @@
import android.os.Parcelable;
import android.view.autofill.AutoFillId;
import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import android.widget.RemoteViews;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
/**
- * A set of data that can be used to auto-fill an {@link android.app.Activity}.
+ * A set of data that can be used to autofill an {@link android.app.Activity}.
*
* <p>It contains:
*
@@ -45,8 +47,8 @@
*/
public final class Dataset implements Parcelable {
- private final ArrayList<AutoFillId> mFieldIds;
- private final ArrayList<AutoFillValue> mFieldValues;
+ private final ArrayList<AutofillId> mFieldIds;
+ private final ArrayList<AutofillValue> mFieldValues;
private final RemoteViews mPresentation;
private final IntentSender mAuthentication;
@@ -58,12 +60,12 @@
}
/** @hide */
- public @Nullable ArrayList<AutoFillId> getFieldIds() {
+ public @Nullable ArrayList<AutofillId> getFieldIds() {
return mFieldIds;
}
/** @hide */
- public @Nullable ArrayList<AutoFillValue> getFieldValues() {
+ public @Nullable ArrayList<AutofillValue> getFieldValues() {
return mFieldValues;
}
@@ -99,8 +101,8 @@
* one value for a field or set an authentication intent.
*/
public static final class Builder {
- private ArrayList<AutoFillId> mFieldIds;
- private ArrayList<AutoFillValue> mFieldValues;
+ private ArrayList<AutofillId> mFieldIds;
+ private ArrayList<AutofillValue> mFieldValues;
private RemoteViews mPresentation;
private IntentSender mAuthentication;
private boolean mDestroyed;
@@ -116,7 +118,7 @@
}
/**
- * Requires a dataset authentication before auto-filling the activity with this dataset.
+ * Requires a dataset authentication before autofilling the activity with this dataset.
*
* <p>This method is called when you need to provide an authentication
* UI for the data set. For example, when a data set contains credit card information
@@ -131,13 +133,13 @@
* the items with these labels is chosen. Note that if you use sensitive data as
* a label, for example an email address, then it should also be encrypted.</p>
*
- * <p>When a user triggers auto-fill, the system launches the provided intent
+ * <p>When a user triggers autofill, the system launches the provided intent
* whose extras will have the {@link
- * android.view.autofill.AutoFillManager#EXTRA_ASSIST_STRUCTURE screen content}. Once
+ * android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen content}. Once
* you complete your authentication flow you should set the activity result to {@link
* android.app.Activity#RESULT_OK} and provide the fully populated {@link Dataset
* dataset} by setting it to the {@link
- * android.view.autofill.AutoFillManager#EXTRA_AUTHENTICATION_RESULT} extra. For example,
+ * android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra. For example,
* if you provided credit card information without the CVV for the data set in the
* {@link FillResponse response} then the returned data set should contain the
* CVV entry.</p>
@@ -158,14 +160,22 @@
}
/**
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use other setValue()
+ */
+ @Deprecated
+ public @NonNull Builder setValue(@NonNull AutoFillId id, @NonNull AutoFillValue value) {
+ return setValue(id.getDaRealId(), value.getDaRealValue());
+ }
+ /**
* Sets the value of a field.
*
* @param id id returned by {@link
- * android.app.assist.AssistStructure.ViewNode#getAutoFillId()}.
+ * android.app.assist.AssistStructure.ViewNode#getAutofillId()}.
* @param value value to be auto filled.
* @return This builder.
*/
- public @NonNull Builder setValue(@NonNull AutoFillId id, @NonNull AutoFillValue value) {
+ public @NonNull Builder setValue(@NonNull AutofillId id, @NonNull AutofillValue value) {
throwIfDestroyed();
Preconditions.checkNotNull(id, "id cannot be null");
Preconditions.checkNotNull(value, "value cannot be null");
@@ -233,13 +243,13 @@
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
final Builder builder = new Builder(parcel.readParcelable(null));
- final ArrayList<AutoFillId> ids = parcel.readTypedArrayList(null);
- final ArrayList<AutoFillValue> values = parcel.readTypedArrayList(null);
+ final ArrayList<AutofillId> ids = parcel.readTypedArrayList(null);
+ final ArrayList<AutofillValue> values = parcel.readTypedArrayList(null);
final int idCount = (ids != null) ? ids.size() : 0;
final int valueCount = (values != null) ? values.size() : 0;
for (int i = 0; i < idCount; i++) {
- AutoFillId id = ids.get(i);
- AutoFillValue value = (valueCount > i) ? values.get(i) : null;
+ final AutofillId id = ids.get(i);
+ final AutofillValue value = (valueCount > i) ? values.get(i) : null;
builder.setValue(id, value);
}
builder.setAuthentication(parcel.readParcelable(null));
diff --git a/core/java/android/service/autofill/FillCallback.java b/core/java/android/service/autofill/FillCallback.java
index 69c9904..00b206c 100644
--- a/core/java/android/service/autofill/FillCallback.java
+++ b/core/java/android/service/autofill/FillCallback.java
@@ -22,8 +22,8 @@
import android.os.RemoteException;
/**
- * Handles auto-fill requests from the {@link AutoFillService} into the {@link Activity} being
- * auto-filled.
+ * Handles autofill requests from the {@link AutofillService} into the {@link Activity} being
+ * autofilled.
*/
public final class FillCallback {
private final IFillCallback mCallback;
@@ -36,11 +36,11 @@
/**
* Notifies the Android System that an
- * {@link AutoFillService#onFillRequest(android.app.assist.AssistStructure, Bundle,
+ * {@link AutofillService#onFillRequest(android.app.assist.AssistStructure, Bundle,
* android.os.CancellationSignal, FillCallback)} was successfully fulfilled by the service.
*
- * @param response auto-fill information for that activity, or {@code null} when the activity
- * cannot be auto-filled (for example, if it only contains read-only fields). See
+ * @param response autofill information for that activity, or {@code null} when the activity
+ * cannot be autofilled (for example, if it only contains read-only fields). See
* {@link FillResponse} for examples.
*/
public void onSuccess(@Nullable FillResponse response) {
@@ -55,7 +55,7 @@
/**
* Notifies the Android System that an
- * {@link AutoFillService#onFillRequest(android.app.assist.AssistStructure,
+ * {@link AutofillService#onFillRequest(android.app.assist.AssistStructure,
* Bundle, android.os.CancellationSignal, FillCallback)}
* could not be fulfilled by the service.
*
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index c457c56..069e83c 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -23,19 +23,18 @@
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillManager;
+import android.view.autofill.AutofillManager;
import android.widget.RemoteViews;
import java.util.ArrayList;
/**
* Response for a {@link
- * AutoFillService#onFillRequest(android.app.assist.AssistStructure,
+ * AutofillService#onFillRequest(android.app.assist.AssistStructure,
* Bundle, android.os.CancellationSignal, FillCallback)}.
*
* <p>The response typically contains one or more {@link Dataset}s, each representing a set of
- * fields that can be auto-filled together, and the Android system displays a dataset picker UI
+ * fields that can be autofilled together, and the Android system displays a dataset picker UI
* affordance that the user must use before the {@link android.app.Activity} is filled with
* the dataset.
*
@@ -125,7 +124,7 @@
* </pre>
*
* <p>Then after the user picks the second dataset and taps the street field to
- * trigger another auto-fill request, the second response could be:
+ * trigger another autofill request, the second response could be:
*
* <pre class="prettyprint">
* new FillResponse.Builder()
@@ -141,7 +140,7 @@
* </pre>
*
* <p>The service could require user authentication at the {@link FillResponse} or the
- * {@link Dataset} level, prior to auto-filling an activity - see
+ * {@link Dataset} level, prior to autofilling an activity - see
* {@link FillResponse.Builder#setAuthentication(IntentSender, RemoteViews)} and
* {@link Dataset.Builder#setAuthentication(IntentSender)}.
*
@@ -169,8 +168,6 @@
private FillResponse(@NonNull Builder builder) {
mDatasets = builder.mDatasets;
- // TODO(b/33197203, 35727295): this is how mSaveInfo will be set once we don't support
- // FillResponse.addSavableIds()
mSaveInfo = builder.mSaveInfo;
if (mSaveInfo != null) {
mSaveInfo.addSavableIds(mDatasets);
@@ -223,7 +220,7 @@
private boolean mDestroyed;
/**
- * Requires a fill response authentication before auto-filling the activity with
+ * Requires a fill response authentication before autofilling the activity with
* any data set in this response.
*
* <p>This is typically useful when a user interaction is required to unlock their
@@ -236,12 +233,12 @@
* intent you also need to specify the presentation view to be shown in the fill UI
* for the user to trigger your authentication flow.</p>
*
- * <p>When a user triggers auto-fill, the system launches the provided intent
- * whose extras will have the {@link AutoFillManager#EXTRA_ASSIST_STRUCTURE screen
+ * <p>When a user triggers autofill, the system launches the provided intent
+ * whose extras will have the {@link AutofillManager#EXTRA_ASSIST_STRUCTURE screen
* content}. Once you complete your authentication flow you should set the activity
* result to {@link android.app.Activity#RESULT_OK} and provide the fully populated
* {@link FillResponse response} by setting it to the {@link
- * AutoFillManager#EXTRA_AUTHENTICATION_RESULT} extra.
+ * AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra.
* For example, if you provided an empty {@link FillResponse resppnse} because the
* user's data was locked and marked that the response needs an authentication then
* in the response returned if authentication succeeds you need to provide all
@@ -309,9 +306,9 @@
/**
* Sets a {@link Bundle} that will be passed to subsequent APIs that
* manipulate this response. For example, they are passed to subsequent
- * calls to {@link AutoFillService#onFillRequest(
+ * calls to {@link AutofillService#onFillRequest(
* android.app.assist.AssistStructure, Bundle, android.os.CancellationSignal,
- * FillCallback)} and {@link AutoFillService#onSaveRequest(
+ * FillCallback)} and {@link AutofillService#onSaveRequest(
* android.app.assist.AssistStructure, Bundle, SaveCallback)}.
*
* @param extras The response extras.
diff --git a/core/java/android/service/autofill/SaveCallback.java b/core/java/android/service/autofill/SaveCallback.java
index c6dd1df..2c4ba6c 100644
--- a/core/java/android/service/autofill/SaveCallback.java
+++ b/core/java/android/service/autofill/SaveCallback.java
@@ -21,8 +21,8 @@
import android.os.RemoteException;
/**
- * Handles save requests from the {@link AutoFillService} into the {@link Activity} being
- * auto-filled.
+ * Handles save requests from the {@link AutofillService} into the {@link Activity} being
+ * autofilled.
*/
public final class SaveCallback {
private final ISaveCallback mCallback;
@@ -35,7 +35,7 @@
/**
* Notifies the Android System that an
- * {@link AutoFillService#onSaveRequest (android.app.assist.AssistStructure, Bundle,
+ * {@link AutofillService#onSaveRequest (android.app.assist.AssistStructure, Bundle,
* SaveCallback)} was successfully fulfilled by the service.
*
* @throws RuntimeException if an error occurred while calling the Android System.
@@ -52,7 +52,7 @@
/**
* Notifies the Android System that an
- * {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * {@link AutofillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
* SaveCallback)} could not be fulfilled by the service.
*
* @param message error message to be displayed to the user.
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index a8f9aee..1bd88c7 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -27,6 +27,7 @@
import android.os.Parcelable;
import android.util.ArraySet;
import android.view.autofill.AutoFillId;
+import android.view.autofill.AutofillId;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -39,12 +40,12 @@
* <p>A {@link SaveInfo} is always associated with a {@link FillResponse}.
*
* <p>A {@link SaveInfo} must define the type it represents, and contain at least one
- * {@code savableId}. A {@code savableId} is the {@link AutoFillId} of a view the service is
+ * {@code savableId}. A {@code savableId} is the {@link AutofillId} of a view the service is
* interested to save in a {@code onSaveRequest()}; the ids of all {@link Dataset} present in the
* {@link FillResponse} associated with this {@link SaveInfo} are already marked as savable,
- * but additional ids can be added through {@link Builder#addSavableIds(AutoFillId...)}.
+ * but additional ids can be added through {@link Builder#addSavableIds(AutofillId...)}.
*
- * <p>See {@link AutoFillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
+ * <p>See {@link AutofillService#onSaveRequest(android.app.assist.AssistStructure, Bundle,
* SaveCallback)} and {@link FillResponse} for more info.
*/
public final class SaveInfo implements Parcelable {
@@ -75,7 +76,7 @@
private final @SaveDataType int mType;
private CharSequence mNegativeActionTitle;
private IntentSender mNegativeActionListener;
- private ArraySet<AutoFillId> mSavableIds;
+ private ArraySet<AutofillId> mSavableIds;
private final CharSequence mDescription;
/** @hide */
@@ -108,7 +109,7 @@
}
/** @hide */
- public @Nullable ArraySet<AutoFillId> getSavableIds() {
+ public @Nullable ArraySet<AutofillId> getSavableIds() {
return mSavableIds;
}
@@ -126,11 +127,11 @@
public void addSavableIds(@Nullable ArrayList<Dataset> datasets) {
if (datasets != null) {
for (Dataset dataset : datasets) {
- final ArrayList<AutoFillId> ids = dataset.getFieldIds();
+ final ArrayList<AutofillId> ids = dataset.getFieldIds();
if (ids != null) {
final int fieldCount = ids.size();
for (int i = 0; i < fieldCount; i++) {
- final AutoFillId id = ids.get(i);
+ final AutofillId id = ids.get(i);
if (mSavableIds == null) {
mSavableIds = new ArraySet<>();
}
@@ -149,7 +150,7 @@
private final @SaveDataType int mType;
private CharSequence mNegativeActionTitle;
private IntentSender mNegativeActionListener;
- private ArraySet<AutoFillId> mSavableIds;
+ private ArraySet<AutofillId> mSavableIds;
private CharSequence mDescription;
private boolean mDestroyed;
@@ -182,6 +183,26 @@
*
* @see FillResponse
*/
+ public @NonNull Builder addSavableIds(@Nullable AutofillId... ids) {
+ throwIfDestroyed();
+
+ if (ids == null) {
+ return this;
+ }
+ for (AutofillId id : ids) {
+ if (mSavableIds == null) {
+ mSavableIds = new ArraySet<>();
+ }
+ mSavableIds.add(id);
+ }
+ return this;
+ }
+
+
+ /**
+ * @hide
+ */
+ // TODO(b/33197203): temporary fix to runtime crash
public @NonNull Builder addSavableIds(@Nullable AutoFillId... ids) {
throwIfDestroyed();
@@ -192,7 +213,7 @@
if (mSavableIds == null) {
mSavableIds = new ArraySet<>();
}
- mSavableIds.add(id);
+ mSavableIds.add(id.getDaRealId());
}
return this;
}
@@ -302,7 +323,7 @@
// using specially crafted parcels.
final Builder builder = new Builder(parcel.readInt());
builder.setNegativeAction(parcel.readCharSequence(), parcel.readParcelable(null));
- final ArraySet<AutoFillId> savableIds = parcel.readTypedArraySet(null);
+ final ArraySet<AutofillId> savableIds = parcel.readTypedArraySet(null);
final int savableIdsCount = (savableIds != null) ? savableIds.size() : 0;
for (int i = 0; i < savableIdsCount; i++) {
builder.addSavableIds(savableIds.valueAt(i));
diff --git a/core/java/android/text/Hyphenator.java b/core/java/android/text/Hyphenator.java
index c2508a6..ea1100e 100644
--- a/core/java/android/text/Hyphenator.java
+++ b/core/java/android/text/Hyphenator.java
@@ -135,6 +135,10 @@
private static Hyphenator loadHyphenator(HyphenationData data) {
String patternFilename = "hyph-" + data.mLanguageTag.toLowerCase(Locale.US) + ".hyb";
File patternFile = new File(getSystemHyphenatorLocation(), patternFilename);
+ if (!patternFile.canRead()) {
+ Log.e(TAG, "hyphenation patterns for " + patternFile + " not found or unreadable");
+ return null;
+ }
try {
RandomAccessFile f = new RandomAccessFile(patternFile, "r");
try {
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index ac9c0d7..ee2b38e 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -474,6 +474,11 @@
return !isEmpty(a) ? a : Preconditions.checkStringNotEmpty(b);
}
+ /** {@hide} */
+ public static int length(@Nullable String s) {
+ return isEmpty(s) ? 0 : s.length();
+ }
+
/**
* Returns the length that the specified CharSequence would have if
* spaces and ASCII control characters were trimmed from the start and end,
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index 77e9f0f..1b74c13 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -161,7 +161,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View root = null;
- if (accessibilityViewId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId == AccessibilityNodeInfo.ROOT_ITEM_ID) {
root = mViewRootImpl.mView;
} else {
root = findViewByAccessibilityId(accessibilityViewId);
@@ -217,7 +217,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View root = null;
- if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) {
root = findViewByAccessibilityId(accessibilityViewId);
} else {
root = mViewRootImpl.mView;
@@ -283,7 +283,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View root = null;
- if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) {
root = findViewByAccessibilityId(accessibilityViewId);
} else {
root = mViewRootImpl.mView;
@@ -291,14 +291,9 @@
if (root != null && isShown(root)) {
AccessibilityNodeProvider provider = root.getAccessibilityNodeProvider();
if (provider != null) {
- if (virtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- infos = provider.findAccessibilityNodeInfosByText(text,
- virtualDescendantId);
- } else {
- infos = provider.findAccessibilityNodeInfosByText(text,
- AccessibilityNodeProvider.HOST_VIEW_ID);
- }
- } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ infos = provider.findAccessibilityNodeInfosByText(text,
+ virtualDescendantId);
+ } else if (virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
ArrayList<View> foundViews = mTempArrayList;
foundViews.clear();
root.findViewsWithText(foundViews, text, View.FIND_VIEWS_WITH_TEXT
@@ -376,7 +371,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View root = null;
- if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) {
root = findViewByAccessibilityId(accessibilityViewId);
} else {
root = mViewRootImpl.mView;
@@ -402,7 +397,7 @@
focused = AccessibilityNodeInfo.obtain(
mViewRootImpl.mAccessibilityFocusedVirtualView);
}
- } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ } else if (virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
focused = host.createAccessibilityNodeInfo();
}
} break;
@@ -471,7 +466,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View root = null;
- if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) {
root = findViewByAccessibilityId(accessibilityViewId);
} else {
root = mViewRootImpl.mView;
@@ -531,7 +526,7 @@
}
mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
View target = null;
- if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (accessibilityViewId != AccessibilityNodeInfo.ROOT_ITEM_ID) {
target = findViewByAccessibilityId(accessibilityViewId);
} else {
target = mViewRootImpl.mView;
@@ -544,14 +539,9 @@
} else {
AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
if (provider != null) {
- if (virtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- succeeded = provider.performAction(virtualDescendantId, action,
- arguments);
- } else {
- succeeded = provider.performAction(
- AccessibilityNodeProvider.HOST_VIEW_ID, action, arguments);
- }
- } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ succeeded = provider.performAction(virtualDescendantId, action,
+ arguments);
+ } else if (virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
succeeded = target.performAccessibilityAction(action, arguments);
}
}
@@ -711,7 +701,9 @@
applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
adjustIsVisibleToUserIfNeeded(infos, interactiveRegion);
callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
- infos.clear();
+ if (infos != null) {
+ infos.clear();
+ }
} catch (RemoteException re) {
/* ignore - the other side will time out */
} finally {
@@ -761,10 +753,8 @@
AccessibilityNodeInfo infoWithSpan = null;
AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
if (provider != null) {
- int idForNode = (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID)
- ? AccessibilityNodeProvider.HOST_VIEW_ID : virtualDescendantId;
- infoWithSpan = provider.createAccessibilityNodeInfo(idForNode);
- } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ infoWithSpan = provider.createAccessibilityNodeInfo(virtualDescendantId);
+ } else if (virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
infoWithSpan = view.createAccessibilityNodeInfo();
}
if (infoWithSpan == null) {
@@ -817,13 +807,12 @@
}
}
} else {
- final int idForRoot = (virtualViewId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID)
- ? AccessibilityNodeProvider.HOST_VIEW_ID : virtualViewId;
- final AccessibilityNodeInfo root = provider.createAccessibilityNodeInfo(idForRoot);
+ final AccessibilityNodeInfo root =
+ provider.createAccessibilityNodeInfo(virtualViewId);
if (root != null) {
if (extraDataRequested != null) {
provider.addExtraDataToAccessibilityNodeInfo(
- idForRoot, root, extraDataRequested, arguments);
+ virtualViewId, root, extraDataRequested, arguments);
}
outInfos.add(root);
if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
@@ -1034,15 +1023,10 @@
}
final int virtualDescendantId =
AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
- if (virtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID
+ if (virtualDescendantId != AccessibilityNodeProvider.HOST_VIEW_ID
|| accessibilityViewId == providerHost.getAccessibilityViewId()) {
final AccessibilityNodeInfo parent;
- if (virtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- parent = provider.createAccessibilityNodeInfo(virtualDescendantId);
- } else {
- parent = provider.createAccessibilityNodeInfo(
- AccessibilityNodeProvider.HOST_VIEW_ID);
- }
+ parent = provider.createAccessibilityNodeInfo(virtualDescendantId);
if (parent == null) {
// Going up the parent relation we found a null predecessor,
// so remove these disconnected nodes form the result.
@@ -1072,15 +1056,10 @@
AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
final int parentVirtualDescendantId =
AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
- if (parentVirtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID
+ if (parentVirtualDescendantId != AccessibilityNodeProvider.HOST_VIEW_ID
|| parentAccessibilityViewId == providerHost.getAccessibilityViewId()) {
- final AccessibilityNodeInfo parent;
- if (parentVirtualDescendantId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- parent = provider.createAccessibilityNodeInfo(parentVirtualDescendantId);
- } else {
- parent = provider.createAccessibilityNodeInfo(
- AccessibilityNodeProvider.HOST_VIEW_ID);
- }
+ final AccessibilityNodeInfo parent =
+ provider.createAccessibilityNodeInfo(parentVirtualDescendantId);
if (parent != null) {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
diff --git a/core/java/android/view/FocusFinder.java b/core/java/android/view/FocusFinder.java
index ad06141..61c9201 100644
--- a/core/java/android/view/FocusFinder.java
+++ b/core/java/android/view/FocusFinder.java
@@ -732,17 +732,27 @@
getRect(first, mFirstRect);
getRect(second, mSecondRect);
- boolean overlapsVertically = (mFirstRect.top < mSecondRect.top
- && mFirstRect.bottom > mSecondRect.top)
- || (mFirstRect.top > mSecondRect.top
- && mFirstRect.top < mSecondRect.bottom);
- boolean alignedVertically = (mFirstRect.left > mSecondRect.left)
- == (mFirstRect.right < mSecondRect.right);
- if (overlapsVertically && !alignedVertically) {
- int rtl = mIsLayoutRtl ? -1 : 1;
- return rtl * (mFirstRect.left - mSecondRect.left);
+ if (mFirstRect.top < mSecondRect.top) {
+ return -1;
+ } else if (mFirstRect.top > mSecondRect.top) {
+ return 1;
+ } else if (mFirstRect.left < mSecondRect.left) {
+ return mIsLayoutRtl ? 1 : -1;
+ } else if (mFirstRect.left > mSecondRect.left) {
+ return mIsLayoutRtl ? -1 : 1;
+ } else if (mFirstRect.bottom < mSecondRect.bottom) {
+ return -1;
+ } else if (mFirstRect.bottom > mSecondRect.bottom) {
+ return 1;
+ } else if (mFirstRect.right < mSecondRect.right) {
+ return mIsLayoutRtl ? 1 : -1;
+ } else if (mFirstRect.right > mSecondRect.right) {
+ return mIsLayoutRtl ? -1 : 1;
} else {
- return mFirstRect.top - mSecondRect.top;
+ // The view are distinct but completely coincident so we consider
+ // them equal for our purposes. Since the sort is stable, this
+ // means that the views will retain their layout order relative to one another.
+ return 0;
}
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index dd76fcf..586b3b2 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -201,16 +201,18 @@
void updateRotation(boolean alwaysSendConfiguration, boolean forceRelayout);
/**
- * Retrieve the current screen orientation, constants as per
- * {@link android.view.Surface}.
+ * Retrieve the current orientation of the primary screen.
+ * @return Constant as per {@link android.view.Surface.Rotation}.
+ *
+ * @see android.view.Display#DEFAULT_DISPLAY
*/
- int getRotation();
+ int getDefaultDisplayRotation();
/**
- * Watch the rotation of the screen. Returns the current rotation,
+ * Watch the rotation of the specified screen. Returns the current rotation,
* calls back when it changes.
*/
- int watchRotation(IRotationWatcher watcher);
+ int watchRotation(IRotationWatcher watcher, int displayId);
/**
* Remove a rotation watcher set using watchRotation.
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index ecd5e3b..8bb3fa9 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.content.res.CompatibilityInfo.Translator;
import android.graphics.Canvas;
+import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
@@ -72,6 +73,7 @@
private static native int nativeSetScalingMode(long nativeObject, int scalingMode);
private static native void nativeSetBuffersTransform(long nativeObject, long transform);
private static native int nativeForceScopedDisconnect(long nativeObject);
+ private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer);
public static final Parcelable.Creator<Surface> CREATOR =
new Parcelable.Creator<Surface>() {
@@ -562,6 +564,21 @@
}
/**
+ * Transfer ownership of buffer and present it on the Surface.
+ * @hide
+ */
+ public void attachAndQueueBuffer(GraphicBuffer buffer) {
+ synchronized (mLock) {
+ checkNotReleasedLocked();
+ int err = nativeAttachAndQueueBuffer(mNativeObject, buffer);
+ if (err != 0) {
+ throw new RuntimeException(
+ "Failed to attach and queue buffer to Surface (bad object?)");
+ }
+ }
+ }
+
+ /**
* Returns whether or not this Surface is backed by a single-buffered SurfaceTexture
* @hide
*/
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index b718696..519c1e2 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -95,6 +95,11 @@
IBinder displayToken, int mode);
private static native void nativeDeferTransactionUntil(long nativeObject,
IBinder handle, long frame);
+ private static native void nativeDeferTransactionUntilSurface(long nativeObject,
+ long surfaceObject, long frame);
+ private static native void nativeReparentChildren(long nativeObject,
+ IBinder handle);
+ private static native void nativeSeverChildren(long nativeObject);
private static native void nativeSetOverrideScalingMode(long nativeObject,
int scalingMode);
private static native IBinder nativeGetHandle(long nativeObject);
@@ -418,7 +423,23 @@
}
public void deferTransactionUntil(IBinder handle, long frame) {
- nativeDeferTransactionUntil(mNativeObject, handle, frame);
+ if (frame > 0) {
+ nativeDeferTransactionUntil(mNativeObject, handle, frame);
+ }
+ }
+
+ public void deferTransactionUntil(Surface barrier, long frame) {
+ if (frame > 0) {
+ nativeDeferTransactionUntilSurface(mNativeObject, barrier.mNativeObject, frame);
+ }
+ }
+
+ public void reparentChildren(IBinder newParentHandle) {
+ nativeReparentChildren(mNativeObject, newParentHandle);
+ }
+
+ public void detachChildren() {
+ nativeSeverChildren(mNativeObject);
}
public void setOverrideScalingMode(int scalingMode) {
diff --git a/core/java/android/view/SurfaceSession.java b/core/java/android/view/SurfaceSession.java
index 3cf5af4..b5912bc 100644
--- a/core/java/android/view/SurfaceSession.java
+++ b/core/java/android/view/SurfaceSession.java
@@ -27,6 +27,7 @@
private long mNativeClient; // SurfaceComposerClient*
private static native long nativeCreate();
+ private static native long nativeCreateScoped(long surfacePtr);
private static native void nativeDestroy(long ptr);
private static native void nativeKill(long ptr);
@@ -35,6 +36,10 @@
mNativeClient = nativeCreate();
}
+ public SurfaceSession(Surface root) {
+ mNativeClient = nativeCreateScoped(root.mNativeObject);
+ }
+
/* no user serviceable parts here ... */
@Override
protected void finalize() throws Throwable {
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index d2577d4..6d320ef 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -16,6 +16,10 @@
package android.view;
+import static android.view.WindowManagerPolicy.APPLICATION_MEDIA_SUBLAYER;
+import static android.view.WindowManagerPolicy.APPLICATION_MEDIA_OVERLAY_SUBLAYER;
+import static android.view.WindowManagerPolicy.APPLICATION_PANEL_SUBLAYER;
+
import android.content.Context;
import android.content.res.CompatibilityInfo.Translator;
import android.content.res.Configuration;
@@ -26,16 +30,12 @@
import android.graphics.Region;
import android.os.Handler;
import android.os.Message;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
-import com.android.internal.view.BaseIWindow;
import com.android.internal.view.SurfaceCallbackHelper;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantLock;
@@ -92,8 +92,8 @@
* positioned asynchronously.</p>
*/
public class SurfaceView extends View {
- static private final String TAG = "SurfaceView";
- static private final boolean DEBUG = false;
+ private static final String TAG = "SurfaceView";
+ private static final boolean DEBUG = false;
final ArrayList<SurfaceHolder.Callback> mCallbacks
= new ArrayList<SurfaceHolder.Callback>();
@@ -102,28 +102,23 @@
final ReentrantLock mSurfaceLock = new ReentrantLock();
final Surface mSurface = new Surface(); // Current surface in use
- final Surface mNewSurface = new Surface(); // New surface we are switching to
boolean mDrawingStopped = true;
+ // We use this to track if the application has produced a frame
+ // in to the Surface. Up until that point, we should be careful not to punch
+ // holes.
+ boolean mDrawFinished = false;
- final WindowManager.LayoutParams mLayout
- = new WindowManager.LayoutParams();
- IWindowSession mSession;
- MyWindow mWindow;
- final Rect mVisibleInsets = new Rect();
- final Rect mWinFrame = new Rect();
- final Rect mOverscanInsets = new Rect();
- final Rect mContentInsets = new Rect();
- final Rect mStableInsets = new Rect();
- final Rect mOutsets = new Rect();
- final Rect mBackdropFrame = new Rect();
+ final Rect mScreenRect = new Rect();
+ SurfaceSession mSurfaceSession;
+
+ SurfaceControl mSurfaceControl;
final Rect mTmpRect = new Rect();
final Configuration mConfiguration = new Configuration();
static final int KEEP_SCREEN_ON_MSG = 1;
- static final int GET_NEW_SURFACE_MSG = 2;
- static final int UPDATE_WINDOW_MSG = 3;
+ static final int DRAW_FINISHED_MSG = 2;
- int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+ int mSubLayer = APPLICATION_MEDIA_SUBLAYER;
boolean mIsCreating = false;
private volatile boolean mRtHandlingPositionUpdates = false;
@@ -135,11 +130,9 @@
case KEEP_SCREEN_ON_MSG: {
setKeepScreenOn(msg.arg1 != 0);
} break;
- case GET_NEW_SURFACE_MSG: {
- handleGetNewSurface();
- } break;
- case UPDATE_WINDOW_MSG: {
- updateWindow();
+ case DRAW_FINISHED_MSG: {
+ mDrawFinished = true;
+ invalidate();
} break;
}
}
@@ -149,7 +142,7 @@
= new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
- updateWindow();
+ updateSurface();
}
};
@@ -159,13 +152,14 @@
public boolean onPreDraw() {
// reposition ourselves where the surface is
mHaveFrame = getWidth() > 0 && getHeight() > 0;
- updateWindow();
+ updateSurface();
return true;
}
};
boolean mRequestedVisible = false;
boolean mWindowVisibility = false;
+ boolean mLastWindowVisibility = false;
boolean mViewVisibility = false;
int mRequestedWidth = -1;
int mRequestedHeight = -1;
@@ -181,19 +175,17 @@
boolean mVisible = false;
int mWindowSpaceLeft = -1;
int mWindowSpaceTop = -1;
- int mWindowSpaceWidth = -1;
- int mWindowSpaceHeight = -1;
+ int mSurfaceWidth = -1;
+ int mSurfaceHeight = -1;
int mFormat = -1;
final Rect mSurfaceFrame = new Rect();
int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1;
- boolean mUpdateWindowNeeded;
- boolean mReportDrawNeeded;
private Translator mTranslator;
- private int mWindowInsetLeft;
- private int mWindowInsetTop;
private boolean mGlobalListenersAdded;
+ private int mSurfaceFlags = SurfaceControl.HIDDEN;
+
public SurfaceView(Context context) {
this(context, null);
}
@@ -227,11 +219,8 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mParent.requestTransparentRegion(this);
- mSession = getWindowSession();
- mLayout.token = getWindowToken();
- mLayout.setTitle("SurfaceView - " + getViewRootImpl().getTitle());
- mLayout.packageName = mContext.getOpPackageName();
mViewVisibility = getVisibility() == VISIBLE;
+ mRequestedVisible = mViewVisibility && mWindowVisibility;
if (!mGlobalListenersAdded) {
ViewTreeObserver observer = getViewTreeObserver();
@@ -246,7 +235,7 @@
super.onWindowVisibilityChanged(visibility);
mWindowVisibility = visibility == VISIBLE;
mRequestedVisible = mWindowVisibility && mViewVisibility;
- updateWindow();
+ updateSurface();
}
@Override
@@ -264,7 +253,7 @@
requestLayout();
}
mRequestedVisible = newRequestedVisible;
- updateWindow();
+ updateSurface();
}
@Override
@@ -277,19 +266,14 @@
}
mRequestedVisible = false;
- updateWindow();
- mHaveFrame = false;
- if (mWindow != null) {
- try {
- mSession.remove(mWindow);
- } catch (RemoteException ex) {
- // Not much we can do here...
- }
- mWindow = null;
- }
- mSession = null;
- mLayout.token = null;
+ updateSurface();
+ if (mSurfaceControl != null) {
+ mSurfaceControl.destroy();
+ }
+ mSurfaceControl = null;
+
+ mHaveFrame = false;
super.onDetachedFromWindow();
}
@@ -308,13 +292,13 @@
@Override
protected boolean setFrame(int left, int top, int right, int bottom) {
boolean result = super.setFrame(left, top, right, bottom);
- updateWindow();
+ updateSurface();
return result;
}
@Override
public boolean gatherTransparentRegion(Region region) {
- if (mWindowType == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
+ if (isAboveParent()) {
return super.gatherTransparentRegion(region);
}
@@ -341,7 +325,7 @@
@Override
public void draw(Canvas canvas) {
- if (mWindowType != WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
+ if (mDrawFinished && !isAboveParent()) {
// draw() is not called when SKIP_DRAW is set
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == 0) {
// punch a whole in the view-hierarchy below us
@@ -353,8 +337,8 @@
@Override
protected void dispatchDraw(Canvas canvas) {
- if (mWindowType != WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
- // if SKIP_DRAW is cleared, draw() has already punched a hole
+ if (mDrawFinished && !isAboveParent()) {
+ // draw() is not called when SKIP_DRAW is set
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
// punch a whole in the view-hierarchy below us
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
@@ -375,9 +359,8 @@
* <p>Calling this overrides any previous call to {@link #setZOrderOnTop}.
*/
public void setZOrderMediaOverlay(boolean isMediaOverlay) {
- mWindowType = isMediaOverlay
- ? WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY
- : WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+ mSubLayer = isMediaOverlay
+ ? APPLICATION_MEDIA_OVERLAY_SUBLAYER : APPLICATION_MEDIA_SUBLAYER;
}
/**
@@ -395,12 +378,9 @@
*/
public void setZOrderOnTop(boolean onTop) {
if (onTop) {
- mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
- // ensures the surface is placed below the IME
- mLayout.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ mSubLayer = APPLICATION_PANEL_SUBLAYER;
} else {
- mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
- mLayout.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ mSubLayer = APPLICATION_MEDIA_SUBLAYER;
}
}
@@ -418,31 +398,32 @@
*/
public void setSecure(boolean isSecure) {
if (isSecure) {
- mLayout.flags |= WindowManager.LayoutParams.FLAG_SECURE;
+ mSurfaceFlags |= SurfaceControl.SECURE;
} else {
- mLayout.flags &= ~WindowManager.LayoutParams.FLAG_SECURE;
+ mSurfaceFlags &= ~SurfaceControl.SECURE;
}
}
- /**
- * Hack to allow special layering of windows. The type is one of the
- * types in WindowManager.LayoutParams. This is a hack so:
- * @hide
- */
- public void setWindowType(int type) {
- mWindowType = type;
+ private Rect getParentSurfaceInsets() {
+ final ViewRootImpl root = getViewRootImpl();
+ if (root == null) {
+ return null;
+ } else {
+ return root.mWindowAttributes.surfaceInsets;
+ }
}
/** @hide */
- protected void updateWindow() {
+ protected void updateSurface() {
if (!mHaveFrame) {
return;
}
ViewRootImpl viewRoot = getViewRootImpl();
- if (viewRoot != null) {
- mTranslator = viewRoot.mTranslator;
+ if (viewRoot == null || viewRoot.mSurface == null || !viewRoot.mSurface.isValid()) {
+ return;
}
+ mTranslator = viewRoot.mTranslator;
if (mTranslator != null) {
mSurface.setCompatibilityTranslator(mTranslator);
}
@@ -452,17 +433,15 @@
int myHeight = mRequestedHeight;
if (myHeight <= 0) myHeight = getHeight();
- final boolean creating = mWindow == null;
final boolean formatChanged = mFormat != mRequestedFormat;
- final boolean sizeChanged = mWindowSpaceWidth != myWidth || mWindowSpaceHeight != myHeight;
+ final boolean creating = (mSurfaceControl == null || formatChanged)
+ && mRequestedVisible;
+ final boolean sizeChanged = mSurfaceWidth != myWidth || mSurfaceHeight != myHeight;
final boolean visibleChanged = mVisible != mRequestedVisible;
- final boolean layoutSizeChanged = getWidth() != mLayout.width
- || getHeight() != mLayout.height;
-
+ final boolean windowVisibleChanged = mWindowVisibility != mLastWindowVisibility;
boolean redrawNeeded = false;
- if (creating || formatChanged || sizeChanged || visibleChanged
- || mUpdateWindowNeeded || mReportDrawNeeded) {
+ if (creating || formatChanged || sizeChanged || visibleChanged || windowVisibleChanged) {
getLocationInWindow(mLocation);
if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "
@@ -476,93 +455,82 @@
final boolean visible = mVisible = mRequestedVisible;
mWindowSpaceLeft = mLocation[0];
mWindowSpaceTop = mLocation[1];
- mWindowSpaceWidth = myWidth;
- mWindowSpaceHeight = myHeight;
+ mSurfaceWidth = myWidth;
+ mSurfaceHeight = myHeight;
mFormat = mRequestedFormat;
+ mLastWindowVisibility = mWindowVisibility;
- // Scaling/Translate window's layout here because mLayout is not used elsewhere.
-
- // Places the window relative
- mLayout.x = mWindowSpaceLeft;
- mLayout.y = mWindowSpaceTop;
- mLayout.width = getWidth();
- mLayout.height = getHeight();
+ mScreenRect.left = mWindowSpaceLeft;
+ mScreenRect.top = mWindowSpaceTop;
+ mScreenRect.right = mWindowSpaceLeft + getWidth();
+ mScreenRect.bottom = mWindowSpaceTop + getHeight();
if (mTranslator != null) {
- mTranslator.translateLayoutParamsInAppWindowToScreen(mLayout);
+ mTranslator.translateRectInAppWindowToScreen(mScreenRect);
}
- mLayout.format = mRequestedFormat;
- mLayout.flags |=WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
- | WindowManager.LayoutParams.FLAG_SCALED
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- ;
- if (!creating && !sizeChanged) {
- mLayout.privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_PRESERVE_GEOMETRY;
- } else {
- mLayout.privateFlags &=
- ~WindowManager.LayoutParams.PRIVATE_FLAG_PRESERVE_GEOMETRY;
+ final Rect surfaceInsets = getParentSurfaceInsets();
+ mScreenRect.offset(surfaceInsets.left, surfaceInsets.top);
+
+ if (creating) {
+ mSurfaceSession = new SurfaceSession(viewRoot.mSurface);
+ mSurfaceControl = new SurfaceControl(mSurfaceSession,
+ "SurfaceView - " + viewRoot.getTitle().toString(),
+ mSurfaceWidth, mSurfaceHeight, mFormat,
+ mSurfaceFlags);
}
- if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) {
- mLayout.privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
- }
- mLayout.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION
- | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
-
- if (mWindow == null) {
- Display display = getDisplay();
- mWindow = new MyWindow(this);
- mLayout.type = mWindowType;
- mLayout.gravity = Gravity.START|Gravity.TOP;
- mSession.addToDisplayWithoutInputChannel(mWindow, mWindow.mSeq, mLayout,
- mVisible ? VISIBLE : GONE, display.getDisplayId(), mContentInsets,
- mStableInsets);
- }
-
- boolean realSizeChanged;
- boolean reportDrawNeeded;
-
- int relayoutResult;
+ boolean realSizeChanged = false;
mSurfaceLock.lock();
try {
- mUpdateWindowNeeded = false;
- reportDrawNeeded = mReportDrawNeeded;
- mReportDrawNeeded = false;
mDrawingStopped = !visible;
if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "
+ "Cur surface: " + mSurface);
- relayoutResult = mSession.relayout(
- mWindow, mWindow.mSeq, mLayout, mWindowSpaceWidth, mWindowSpaceHeight,
- visible ? VISIBLE : GONE,
- WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY,
- mWinFrame, mOverscanInsets, mContentInsets,
- mVisibleInsets, mStableInsets, mOutsets, mBackdropFrame,
- mConfiguration, mNewSurface);
- if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
- reportDrawNeeded = true;
+ SurfaceControl.openTransaction();
+ try {
+ mSurfaceControl.setLayer(mSubLayer);
+ if (mViewVisibility) {
+ mSurfaceControl.show();
+ } else {
+ mSurfaceControl.hide();
+ }
+
+ // While creating the surface, we will set it's initial
+ // geometry. Outside of that though, we should generally
+ // leave it to the RenderThread.
+ //
+ // There is one more case when the buffer size changes we aren't yet
+ // prepared to sync (as even following the transaction applying
+ // we still need to latch a buffer).
+ // b/28866173
+ if (sizeChanged || creating || !mRtHandlingPositionUpdates) {
+ mSurfaceControl.setPosition(mScreenRect.left, mScreenRect.top);
+ mSurfaceControl.setMatrix(mScreenRect.width() / (float) mSurfaceWidth,
+ 0.0f, 0.0f,
+ mScreenRect.height() / (float) mSurfaceHeight);
+ }
+ if (sizeChanged) {
+ mSurfaceControl.setSize(mSurfaceWidth, mSurfaceHeight);
+ }
+ } finally {
+ SurfaceControl.closeTransaction();
}
- if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "
- + "New surface: " + mNewSurface
- + ", vis=" + visible + ", frame=" + mWinFrame);
+ if (sizeChanged || creating) {
+ redrawNeeded = true;
+ }
mSurfaceFrame.left = 0;
mSurfaceFrame.top = 0;
if (mTranslator == null) {
- mSurfaceFrame.right = mWinFrame.width();
- mSurfaceFrame.bottom = mWinFrame.height();
+ mSurfaceFrame.right = mSurfaceWidth;
+ mSurfaceFrame.bottom = mSurfaceHeight;
} else {
float appInvertedScale = mTranslator.applicationInvertedScale;
- mSurfaceFrame.right = (int) (mWinFrame.width() * appInvertedScale + 0.5f);
- mSurfaceFrame.bottom = (int) (mWinFrame.height() * appInvertedScale + 0.5f);
+ mSurfaceFrame.right = (int) (mSurfaceWidth * appInvertedScale + 0.5f);
+ mSurfaceFrame.bottom = (int) (mSurfaceHeight * appInvertedScale + 0.5f);
}
final int surfaceWidth = mSurfaceFrame.right;
@@ -576,12 +544,11 @@
}
try {
- redrawNeeded |= creating | reportDrawNeeded;
+ redrawNeeded |= visible && !mDrawFinished;
SurfaceHolder.Callback callbacks[] = null;
- final boolean surfaceChanged = (relayoutResult
- & WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED) != 0;
+ final boolean surfaceChanged = creating;
if (mSurfaceCreated && (surfaceChanged || (!visible && visibleChanged))) {
mSurfaceCreated = false;
if (mSurface.isValid()) {
@@ -608,7 +575,10 @@
}
}
- mSurface.transferFrom(mNewSurface);
+ if (creating) {
+ mSurface.copyFrom(mSurfaceControl);
+ }
+
if (visible && mSurface.isValid()) {
if (!mSurfaceCreated && (surfaceChanged || visibleChanged)) {
mSurfaceCreated = true;
@@ -641,53 +611,55 @@
callbacks = getSurfaceCallbacks();
}
SurfaceCallbackHelper sch =
- new SurfaceCallbackHelper(mSession, mWindow);
+ new SurfaceCallbackHelper(this::onDrawFinished);
sch.dispatchSurfaceRedrawNeededAsync(mSurfaceHolder, callbacks);
}
}
} finally {
mIsCreating = false;
- mSession.performDeferredDestroy(mWindow);
+ if (mSurfaceControl != null && !mSurfaceCreated) {
+ mSurfaceControl.destroy();
+ mSurfaceControl = null;
+ }
}
- } catch (RemoteException ex) {
+ } catch (Exception ex) {
Log.e(TAG, "Exception from relayout", ex);
}
if (DEBUG) Log.v(
- TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y +
- " w=" + mLayout.width + " h=" + mLayout.height +
- ", frame=" + mSurfaceFrame);
+ TAG, "Layout: x=" + mScreenRect.left + " y=" + mScreenRect.top
+ + " w=" + mScreenRect.width() + " h=" + mScreenRect.height()
+ + ", frame=" + mSurfaceFrame);
} else {
// Calculate the window position in case RT loses the window
// and we need to fallback to a UI-thread driven position update
- getLocationInWindow(mLocation);
+ getLocationInSurface(mLocation);
final boolean positionChanged = mWindowSpaceLeft != mLocation[0]
|| mWindowSpaceTop != mLocation[1];
+ final boolean layoutSizeChanged = getWidth() != mScreenRect.width()
+ || getHeight() != mScreenRect.height();
if (positionChanged || layoutSizeChanged) { // Only the position has changed
mWindowSpaceLeft = mLocation[0];
mWindowSpaceTop = mLocation[1];
- // For our size changed check, we keep mLayout.width and mLayout.height
+ // For our size changed check, we keep mScreenRect.width() and mScreenRect.height()
// in view local space.
- mLocation[0] = mLayout.width = getWidth();
- mLocation[1] = mLayout.height = getHeight();
+ mLocation[0] = getWidth();
+ mLocation[1] = getHeight();
- transformFromViewToWindowSpace(mLocation);
-
- mTmpRect.set(mWindowSpaceLeft, mWindowSpaceTop,
+ mScreenRect.set(mWindowSpaceLeft, mWindowSpaceTop,
mLocation[0], mLocation[1]);
if (mTranslator != null) {
- mTranslator.translateRectInAppWindowToScreen(mTmpRect);
+ mTranslator.translateRectInAppWindowToScreen(mScreenRect);
}
if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) {
try {
- if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition UI, " +
+ if (DEBUG) Log.d(TAG, String.format("%d updateSurfacePosition UI, " +
"postion = [%d, %d, %d, %d]", System.identityHashCode(this),
- mTmpRect.left, mTmpRect.top,
- mTmpRect.right, mTmpRect.bottom));
- mSession.repositionChild(mWindow, mTmpRect.left, mTmpRect.top,
- mTmpRect.right, mTmpRect.bottom, -1, mTmpRect);
- } catch (RemoteException ex) {
+ mScreenRect.left, mScreenRect.top,
+ mScreenRect.right, mScreenRect.bottom));
+ setParentSpaceRectangle(mScreenRect, -1);
+ } catch (Exception ex) {
Log.e(TAG, "Exception from relayout", ex);
}
}
@@ -695,20 +667,43 @@
}
}
+ private void onDrawFinished() {
+ if (DEBUG) {
+ Log.i(TAG, System.identityHashCode(this) + " "
+ + "finishedDrawing");
+ }
+ mHandler.sendEmptyMessage(DRAW_FINISHED_MSG);
+ }
+
+ private void setParentSpaceRectangle(Rect position, long frameNumber) {
+ ViewRootImpl viewRoot = getViewRootImpl();
+
+ SurfaceControl.openTransaction();
+ try {
+ if (frameNumber > 0) {
+ mSurfaceControl.deferTransactionUntil(viewRoot.mSurface, frameNumber);
+ }
+ mSurfaceControl.setPosition(position.left, position.top);
+ mSurfaceControl.setMatrix(position.width() / (float) mSurfaceWidth,
+ 0.0f, 0.0f,
+ position.height() / (float) mSurfaceHeight);
+ } finally {
+ SurfaceControl.closeTransaction();
+ }
+ }
+
private Rect mRTLastReportedPosition = new Rect();
/**
* Called by native by a Rendering Worker thread to update the window position
* @hide
*/
- public final void updateWindowPosition_renderWorker(long frameNumber,
+ public final void updateSurfacePosition_renderWorker(long frameNumber,
int left, int top, int right, int bottom) {
- IWindowSession session = mSession;
- MyWindow window = mWindow;
- if (session == null || window == null) {
- // Guess we got detached, that sucks
+ if (mSurfaceControl == null) {
return;
}
+
// TODO: This is teensy bit racey in that a brand new SurfaceView moving on
// its 2nd frame if RenderThread is running slowly could potentially see
// this as false, enter the branch, get pre-empted, then this comes along
@@ -726,35 +721,29 @@
}
try {
if (DEBUG) {
- Log.d(TAG, String.format("%d updateWindowPosition RenderWorker, frameNr = %d, " +
+ Log.d(TAG, String.format("%d updateSurfacePosition RenderWorker, frameNr = %d, " +
"postion = [%d, %d, %d, %d]", System.identityHashCode(this),
frameNumber, left, top, right, bottom));
}
- // Just using mRTLastReportedPosition as a dummy rect here
- session.repositionChild(window, left, top, right, bottom,
- frameNumber,
- mRTLastReportedPosition);
- // Now overwrite mRTLastReportedPosition with our values
mRTLastReportedPosition.set(left, top, right, bottom);
- } catch (RemoteException ex) {
+ setParentSpaceRectangle(mRTLastReportedPosition, frameNumber);
+ // Now overwrite mRTLastReportedPosition with our values
+ } catch (Exception ex) {
Log.e(TAG, "Exception from repositionChild", ex);
}
}
/**
- * Called by native on RenderThread to notify that the window is no longer in the
+ * Called by native on RenderThread to notify that the view is no longer in the
* draw tree. UI thread is blocked at this point.
* @hide
*/
- public final void windowPositionLost_uiRtSync(long frameNumber) {
+ public final void surfacePositionLost_uiRtSync(long frameNumber) {
if (DEBUG) {
Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d",
System.identityHashCode(this), frameNumber));
}
- IWindowSession session = mSession;
- MyWindow window = mWindow;
- if (session == null || window == null) {
- // We got detached prior to receiving this, abort
+ if (mSurfaceControl == null) {
return;
}
if (mRtHandlingPositionUpdates) {
@@ -763,19 +752,14 @@
// safely access other member variables at this time.
// So do what the UI thread would have done if RT wasn't handling position
// updates.
- mTmpRect.set(mLayout.x, mLayout.y,
- mLayout.x + mLayout.width,
- mLayout.y + mLayout.height);
-
- if (!mTmpRect.isEmpty() && !mTmpRect.equals(mRTLastReportedPosition)) {
+ if (!mScreenRect.isEmpty() && !mScreenRect.equals(mRTLastReportedPosition)) {
try {
- if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition, " +
+ if (DEBUG) Log.d(TAG, String.format("%d updateSurfacePosition, " +
"postion = [%d, %d, %d, %d]", System.identityHashCode(this),
- mTmpRect.left, mTmpRect.top,
- mTmpRect.right, mTmpRect.bottom));
- session.repositionChild(window, mTmpRect.left, mTmpRect.top,
- mTmpRect.right, mTmpRect.bottom, frameNumber, mWinFrame);
- } catch (RemoteException ex) {
+ mScreenRect.left, mScreenRect.top,
+ mScreenRect.right, mScreenRect.bottom));
+ setParentSpaceRectangle(mScreenRect, frameNumber);
+ } catch (Exception ex) {
Log.e(TAG, "Exception from relayout", ex);
}
}
@@ -792,10 +776,6 @@
return callbacks;
}
- void handleGetNewSurface() {
- updateWindow();
- }
-
/**
* Check to see if the surface has fixed size dimensions or if the surface's
* dimensions are dimensions are dependent on its current layout.
@@ -807,65 +787,8 @@
return (mRequestedWidth != -1 || mRequestedHeight != -1);
}
- private static class MyWindow extends BaseIWindow {
- private final WeakReference<SurfaceView> mSurfaceView;
-
- public MyWindow(SurfaceView surfaceView) {
- mSurfaceView = new WeakReference<SurfaceView>(surfaceView);
- }
-
- @Override
- public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
- Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
- Configuration newConfig, Rect backDropRect, boolean forceLayout,
- boolean alwaysConsumeNavBar, int displayId) {
- SurfaceView surfaceView = mSurfaceView.get();
- if (surfaceView != null) {
- if (DEBUG) Log.v(TAG, surfaceView + " got resized: w=" + frame.width()
- + " h=" + frame.height() + ", cur w=" + mCurWidth + " h=" + mCurHeight);
- surfaceView.mSurfaceLock.lock();
- try {
- if (reportDraw) {
- surfaceView.mUpdateWindowNeeded = true;
- surfaceView.mReportDrawNeeded = true;
- surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG);
- } else if (surfaceView.mWinFrame.width() != frame.width()
- || surfaceView.mWinFrame.height() != frame.height()
- || forceLayout) {
- surfaceView.mUpdateWindowNeeded = true;
- surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG);
- }
- } finally {
- surfaceView.mSurfaceLock.unlock();
- }
- }
- }
-
- @Override
- public void dispatchAppVisibility(boolean visible) {
- // The point of SurfaceView is to let the app control the surface.
- }
-
- @Override
- public void dispatchGetNewSurface() {
- SurfaceView surfaceView = mSurfaceView.get();
- if (surfaceView != null) {
- Message msg = surfaceView.mHandler.obtainMessage(GET_NEW_SURFACE_MSG);
- surfaceView.mHandler.sendMessage(msg);
- }
- }
-
- @Override
- public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) {
- Log.w("SurfaceView", "Unexpected focus in surface: focus=" + hasFocus + ", touchEnabled=" + touchEnabled);
- }
-
- @Override
- public void executeCommand(String command, String parameters, ParcelFileDescriptor out) {
- }
-
- int mCurWidth = -1;
- int mCurHeight = -1;
+ private boolean isAboveParent() {
+ return mSubLayer >= 0;
}
private final SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
@@ -913,15 +836,14 @@
@Override
public void setFormat(int format) {
-
// for backward compatibility reason, OPAQUE always
// means 565 for SurfaceView
if (format == PixelFormat.OPAQUE)
format = PixelFormat.RGB_565;
mRequestedFormat = format;
- if (mWindow != null) {
- updateWindow();
+ if (mSurfaceControl != null) {
+ updateSurface();
}
}
@@ -982,10 +904,10 @@
mSurfaceLock.lock();
if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " " + "Locking canvas... stopped="
- + mDrawingStopped + ", win=" + mWindow);
+ + mDrawingStopped + ", surfaceControl=" + mSurfaceControl);
Canvas c = null;
- if (!mDrawingStopped && mWindow != null) {
+ if (!mDrawingStopped && mSurfaceControl != null) {
try {
if (hardware) {
c = mSurface.lockHardwareCanvas();
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 8cfd6a7..029caf9 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -94,12 +94,12 @@
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
+import android.view.accessibility.AccessibilityWindowInfo;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillType;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
@@ -945,175 +945,175 @@
/** @hide */
@IntDef({
- AUTO_FILL_MODE_INHERIT,
- AUTO_FILL_MODE_AUTO,
- AUTO_FILL_MODE_MANUAL
+ AUTOFILL_MODE_INHERIT,
+ AUTOFILL_MODE_AUTO,
+ AUTOFILL_MODE_MANUAL
})
@Retention(RetentionPolicy.SOURCE)
- public @interface AutoFillMode {}
+ public @interface AutofillMode {}
/**
- * This view inherits the auto-fill state from it's parent. If there is no parent it is
- * {@link #AUTO_FILL_MODE_AUTO}.
- * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
- * {@code android:autoFillMode}.
+ * This view inherits the autofill state from it's parent. If there is no parent it is
+ * {@link #AUTOFILL_MODE_AUTO}.
+ * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode">
+ * {@code android:autofillMode}.
*/
- public static final int AUTO_FILL_MODE_INHERIT = 0;
+ public static final int AUTOFILL_MODE_INHERIT = 0;
/**
- * Allows this view to automatically trigger an auto-fill request when it get focus.
- * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
- * {@code android:autoFillMode}.
+ * Allows this view to automatically trigger an autofill request when it get focus.
+ * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode">
+ * {@code android:autofillMode}.
*/
- public static final int AUTO_FILL_MODE_AUTO = 1;
+ public static final int AUTOFILL_MODE_AUTO = 1;
/**
- * Do not trigger an auto-fill request if this view is focused. The user can still force
- * an auto-fill request.
- * <p>This does not prevent this field from being auto-filled if an auto-fill operation is
+ * Do not trigger an autofill request if this view is focused. The user can still force
+ * an autofill request.
+ * <p>This does not prevent this field from being autofilled if an autofill operation is
* triggered from a different view.</p>
*
- * Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">{@code
- * android:autoFillMode}.
+ * Use with {@link #setAutofillMode(int)} and <a href="#attr_android:autofillMode">{@code
+ * android:autofillMode}.
*/
- public static final int AUTO_FILL_MODE_MANUAL = 2;
+ public static final int AUTOFILL_MODE_MANUAL = 2;
/** @hide */
@IntDef({
- AUTO_FILL_HINT_NONE,
- AUTO_FILL_HINT_EMAIL_ADDRESS,
- AUTO_FILL_HINT_NAME,
- AUTO_FILL_HINT_POSTAL_ADDRESS,
- AUTO_FILL_HINT_PASSWORD,
- AUTO_FILL_HINT_PHONE,
- AUTO_FILL_HINT_USERNAME,
- AUTO_FILL_HINT_POSTAL_CODE,
- AUTO_FILL_HINT_CREDIT_CARD_NUMBER,
- AUTO_FILL_HINT_CREDIT_CARD_SECURITY_CODE,
- AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
- AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
- AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
- AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DAY,
+ AUTOFILL_HINT_NONE,
+ AUTOFILL_HINT_EMAIL_ADDRESS,
+ AUTOFILL_HINT_NAME,
+ AUTOFILL_HINT_POSTAL_ADDRESS,
+ AUTOFILL_HINT_PASSWORD,
+ AUTOFILL_HINT_PHONE,
+ AUTOFILL_HINT_USERNAME,
+ AUTOFILL_HINT_POSTAL_CODE,
+ AUTOFILL_HINT_CREDIT_CARD_NUMBER,
+ AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE,
+ AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE,
+ AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH,
+ AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR,
+ AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface AutoFillHint {}
+ public @interface AutofillHint {}
/**
- * No auto-fill hint is set.
+ * No autofill hint is set.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_NONE = 0;
+ public static final int AUTOFILL_HINT_NONE = 0;
/**
* This view contains an email address.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_EMAIL_ADDRESS = 0x1;
+ public static final int AUTOFILL_HINT_EMAIL_ADDRESS = 0x1;
/**
* The view contains a real name.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_NAME = 0x2;
+ public static final int AUTOFILL_HINT_NAME = 0x2;
/**
* The view contains a user name.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_USERNAME = 0x4;
+ public static final int AUTOFILL_HINT_USERNAME = 0x4;
/**
* The view contains a password.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_PASSWORD = 0x8;
+ public static final int AUTOFILL_HINT_PASSWORD = 0x8;
/**
* The view contains a phone number.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_PHONE = 0x10;
+ public static final int AUTOFILL_HINT_PHONE = 0x10;
/**
* The view contains a postal address.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_POSTAL_ADDRESS = 0x20;
+ public static final int AUTOFILL_HINT_POSTAL_ADDRESS = 0x20;
/**
* The view contains a postal code.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_POSTAL_CODE = 0x40;
+ public static final int AUTOFILL_HINT_POSTAL_CODE = 0x40;
/**
* The view contains a credit card number.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_NUMBER = 0x80;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_NUMBER = 0x80;
/**
* The view contains a credit card security code.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_SECURITY_CODE = 0x100;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = 0x100;
/**
* The view contains a credit card expiration date.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 0x200;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE = 0x200;
/**
* The view contains the month a credit card expires.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 0x400;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH = 0x400;
/**
* The view contains the year a credit card expires.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 0x800;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR = 0x800;
/**
* The view contains the day a credit card expires.
*
- * Use with {@link #setAutoFillHint(int)} and <a href="#attr_android:autoFillHint">
- * {@code android:autoFillHint}.
+ * Use with {@link #setAutofillHint(int)} and <a href="#attr_android:autofillHint">
+ * {@code android:autofillHint}.
*/
- public static final int AUTO_FILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 0x1000;
+ public static final int AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = 0x1000;
/**
- * Hint for the auto-fill services that describes the content of the view.
+ * Hint for the autofill services that describes the content of the view.
*/
- @AutoFillHint private int mAutoFillHint;
+ @AutofillHint private int mAutofillHint;
/** @hide */
@IntDef({
@@ -1134,18 +1134,18 @@
/**
* Autofill type for a text field, which is filled by a {@link CharSequence}.
*
- * <p>{@link AutoFillValue} instances for autofilling a {@link View} can be obtained through
- * {@link AutoFillValue#forText(CharSequence)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getTextValue()}.
+ * <p>{@link AutofillValue} instances for autofilling a {@link View} can be obtained through
+ * {@link AutofillValue#forText(CharSequence)}, and the value passed to autofill a
+ * {@link View} can be fetched through {@link AutofillValue#getTextValue()}.
*/
public static final int AUTOFILL_TYPE_TEXT = 1;
/**
* Autofill type for a togglable field, which is filled by a {@code boolean}.
*
- * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
- * {@link AutoFillValue#forToggle(boolean)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getToggleValue()}.
+ * <p>{@link AutofillValue} instances for autofilling a {@link View} can be obtained through
+ * {@link AutofillValue#forToggle(boolean)}, and the value passed to autofill a
+ * {@link View} can be fetched through {@link AutofillValue#getToggleValue()}.
*/
public static final int AUTOFILL_TYPE_TOGGLE = 2;
@@ -1153,12 +1153,12 @@
* Autofill type for a selection list field, which is filled by an {@code int}
* representing the element index inside the list (starting at {@code 0}).
*
- * <p>{@link AutoFillValue} instances for autofilling a {@link View} can be obtained through
- * {@link AutoFillValue#forList(int)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getListValue()}.
+ * <p>{@link AutofillValue} instances for autofilling a {@link View} can be obtained through
+ * {@link AutofillValue#forList(int)}, and the value passed to autofill a
+ * {@link View} can be fetched through {@link AutofillValue#getListValue()}.
*
* <p>The available options in the selection list are typically provided by
- * {@link android.app.assist.AssistStructure.ViewNode#getAutoFillOptions()}.
+ * {@link android.app.assist.AssistStructure.ViewNode#getAutofillOptions()}.
*/
public static final int AUTOFILL_TYPE_LIST = 3;
@@ -1168,9 +1168,9 @@
* the number of milliseconds since the standard base time known as "the epoch", namely
* January 1, 1970, 00:00:00 GMT (see {@link java.util.Date#getTime()}.
*
- * <p>{@link AutoFillValue} instances for autofilling a {@link View} can be obtained through
- * {@link AutoFillValue#forDate(long)}, and the values passed to
- * auto-fill a {@link View} can be fetched through {@link AutoFillValue#getDateValue()}.
+ * <p>{@link AutofillValue} instances for autofilling a {@link View} can be obtained through
+ * {@link AutofillValue#forDate(long)}, and the values passed to
+ * autofill a {@link View} can be fetched through {@link AutofillValue#getDateValue()}.
*/
public static final int AUTOFILL_TYPE_DATE = 4;
@@ -2768,8 +2768,13 @@
* x * NO LONGER NEEDED, SHOULD BE REUSED *
* 1 PFLAG3_FINGER_DOWN
* 1 PFLAG3_FOCUSED_BY_DEFAULT
+<<<<<<< HEAD
* 11 PFLAG3_AUTO_FILL_MODE_MASK
* 11 PFLAG3_IMPORTANT_FOR_AUTOFILL
+=======
+ * 11 PFLAG3_AUTOFILL_MODE_MASK
+ * xx * NO LONGER NEEDED, SHOULD BE REUSED *
+>>>>>>> Replaced auto-fill by autofill to keep it consistent with API style.
* 1 PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE
* 1 PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED
* 1 PFLAG3_TEMPORARY_DETACH
@@ -2990,21 +2995,21 @@
private static final int PFLAG3_FOCUSED_BY_DEFAULT = 0x40000;
/**
- * Shift for the place where the auto-fill mode is stored in the pflags
+ * Shift for the place where the autofill mode is stored in the pflags
*
- * @see #getAutoFillMode()
- * @see #setAutoFillMode(int)
+ * @see #getAutofillMode()
+ * @see #setAutofillMode(int)
*/
- private static final int PFLAG3_AUTO_FILL_MODE_SHIFT = 19;
+ private static final int PFLAG3_AUTOFILL_MODE_SHIFT = 19;
/**
- * Mask for auto-fill modes
+ * Mask for autofill modes
*
- * @see #getAutoFillMode()
- * @see #setAutoFillMode(int)
+ * @see #getAutofillMode()
+ * @see #setAutofillMode(int)
*/
- private static final int PFLAG3_AUTO_FILL_MODE_MASK = (AUTO_FILL_MODE_INHERIT
- | AUTO_FILL_MODE_AUTO | AUTO_FILL_MODE_MANUAL) << PFLAG3_AUTO_FILL_MODE_SHIFT;
+ private static final int PFLAG3_AUTOFILL_MODE_MASK = (AUTOFILL_MODE_INHERIT
+ | AUTOFILL_MODE_AUTO | AUTOFILL_MODE_MANUAL) << PFLAG3_AUTOFILL_MODE_SHIFT;
/**
* Shift for the bits in {@link #mPrivateFlags3} related to the
@@ -5037,14 +5042,14 @@
setFocusedByDefault(a.getBoolean(attr, true));
}
break;
- case R.styleable.View_autoFillMode:
+ case R.styleable.View_autofillMode:
if (a.peekValue(attr) != null) {
- setAutoFillMode(a.getInt(attr, AUTO_FILL_MODE_INHERIT));
+ setAutofillMode(a.getInt(attr, AUTOFILL_MODE_INHERIT));
}
break;
- case R.styleable.View_autoFillHint:
+ case R.styleable.View_autofillHint:
if (a.peekValue(attr) != null) {
- setAutoFillHint(a.getInt(attr, AUTO_FILL_HINT_NONE));
+ setAutofillHint(a.getInt(attr, AUTOFILL_HINT_NONE));
}
break;
case R.styleable.View_importantForAutofill:
@@ -6127,6 +6132,9 @@
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
+
+ notifyEnterOrExitForAutoFillIfNeeded(true);
+
return result;
}
@@ -6786,14 +6794,18 @@
mAttachInfo.mKeyDispatchState.reset(this);
}
- if (isAutoFillable() && isAttachedToWindow()
- && getResolvedAutoFillMode() == AUTO_FILL_MODE_AUTO) {
- AutoFillManager afm = getAutoFillManager();
+ notifyEnterOrExitForAutoFillIfNeeded(gainFocus);
+ }
+
+ private void notifyEnterOrExitForAutoFillIfNeeded(boolean enter) {
+ if (isAutofillable() && isAttachedToWindow()
+ && getResolvedAutofillMode() == AUTOFILL_MODE_AUTO) {
+ AutofillManager afm = getAutofillManager();
if (afm != null) {
- if (gainFocus) {
- afm.startAutoFillRequest(this);
- } else {
- afm.stopAutoFillRequest(this);
+ if (enter && hasWindowFocus() && isFocused()) {
+ afm.notifyViewEntered(this);
+ } else if (!hasWindowFocus() || !isFocused()) {
+ afm.notifyViewExited(this);
}
}
}
@@ -7238,18 +7250,18 @@
* fills in all data that can be inferred from the view itself.
*/
public void onProvideStructure(ViewStructure structure) {
- onProvideStructureForAssistOrAutoFill(structure, false);
+ onProvideStructureForAssistOrAutofill(structure, false);
}
/**
- * Called when assist structure is being retrieved from a view as part of an auto-fill request.
+ * Called when assist structure is being retrieved from a view as part of an autofill request.
*
- * <p>This method already provides most of what's needed for auto-fill, but should be overridden
+ * <p>This method already provides most of what's needed for autofill, but should be overridden
* <ol>
* <li>The view contents does not include PII (Personally Identifiable Information), so it
* can call {@link ViewStructure#setSanitized(boolean)} passing {@code true}.
* <li>It must set fields such {@link ViewStructure#setText(CharSequence)},
- * {@link ViewStructure#setAutoFillOptions(String[])}, or {@link ViewStructure#setUrl(String)}.
+ * {@link ViewStructure#setAutofillOptions(String[])}, or {@link ViewStructure#setUrl(String)}.
* </ol>
*
* @param structure Fill in with structured view data. The default implementation
@@ -7257,12 +7269,12 @@
* @param flags optional flags (currently {@code 0}).
*/
@CallSuper
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- onProvideStructureForAssistOrAutoFill(structure, true);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ onProvideStructureForAssistOrAutofill(structure, true);
}
- private void onProvideStructureForAssistOrAutoFill(ViewStructure structure,
- boolean forAutoFill) {
+ private void onProvideStructureForAssistOrAutofill(ViewStructure structure,
+ boolean forAutofill) {
final int id = mID;
if (id != NO_ID && !isViewIdGenerated(id)) {
String pkg, type, entry;
@@ -7279,17 +7291,17 @@
structure.setId(id, null, null, null);
}
- if (forAutoFill) {
+ if (forAutofill) {
final @AutofillType int autofillType = getAutofillType();
- // Don't need to fill auto-fill info if view does not support it.
- // For example, only TextViews that are editable support auto-fill
+ // Don't need to fill autofill info if view does not support it.
+ // For example, only TextViews that are editable support autofill
if (autofillType != AUTOFILL_TYPE_NONE) {
- // The auto-fill id needs to be unique, but its value doesn't matter, so it's better
+ // The autofill id needs to be unique, but its value doesn't matter, so it's better
// to reuse the accessibility id to save space.
- structure.setAutoFillId(getAccessibilityViewId());
+ structure.setAutofillId(getAccessibilityViewId());
structure.setAutofillType(autofillType);
- structure.setAutoFillHint(getAutoFillHint());
- structure.setAutoFillValue(getAutoFillValue());
+ structure.setAutofillHint(getAutofillHint());
+ structure.setAutofillValue(getAutofillValue());
}
}
@@ -7327,6 +7339,9 @@
structure.setChecked(true);
}
}
+ if (isOpaque()) {
+ structure.setOpaque(true);
+ }
if (isContextClickable()) {
structure.setContextClickable(true);
}
@@ -7343,11 +7358,11 @@
* optimal implementation providing this data.
*/
public void onProvideVirtualStructure(ViewStructure structure) {
- onProvideVirtualStructureForAssistOrAutoFill(structure, false);
+ onProvideVirtualStructureForAssistOrAutofill(structure, false);
}
/**
- * Called when assist structure is being retrieved from a view as part of an auto-fill request
+ * Called when assist structure is being retrieved from a view as part of an autofill request
* to generate additional virtual structure under this view.
*
* <p>The default implementation uses {@link #getAccessibilityNodeProvider()} to try to
@@ -7357,27 +7372,31 @@
* <p>When implementing this method, subclasses must follow the rules below:
*
* <ol>
- * <li>Also implement {@link #autoFillVirtual(int, AutoFillValue)} to auto-fill the virtual
+ * <li>Also implement {@link #autofillVirtual(int, AutofillValue)} to autofill the virtual
* children.
* <li>Call
- * {@link android.view.autofill.AutoFillManager#startAutoFillRequestOnVirtualView} and
- * {@link android.view.autofill.AutoFillManager#stopAutoFillRequestOnVirtualView(View, int)}
+ * {@link android.view.autofill.AutofillManager#notifyVirtualViewEntered} and
+ * {@link android.view.autofill.AutofillManager#notifyVirtualViewExited(View, int)}
* when the focus inside the view changed.
- * <li>Call {@link android.view.autofill.AutoFillManager#virtualValueChanged(View, int,
- * AutoFillValue)} when the value of a child changed.
- * <li>Call {@link android.view.autofill.AutoFillManager#reset()} when the auto-fill context
- * of the view structure changed.
+ * <li>Call {@link android.view.autofill.AutofillManager#notifyVirtualValueChanged(View, int,
+ * AutofillValue)} when the value of a child changed.
+ * <li>Call {@link AutofillManager#commit()} when the autofill context
+ * of the view structure changed and you want the current autofill interaction if such
+ * to be commited.
+ * <li>Call {@link AutofillManager#cancel()} ()} when the autofill context
+ * of the view structure changed and you want the current autofill interaction if such
+ * to be cancelled.
* </ol>
*
* @param structure Fill in with structured view data.
* @param flags optional flags (currently {@code 0}).
*/
- public void onProvideAutoFillVirtualStructure(ViewStructure structure, int flags) {
- onProvideVirtualStructureForAssistOrAutoFill(structure, true);
+ public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {
+ onProvideVirtualStructureForAssistOrAutofill(structure, true);
}
- private void onProvideVirtualStructureForAssistOrAutoFill(ViewStructure structure,
- boolean forAutoFill) {
+ private void onProvideVirtualStructureForAssistOrAutofill(ViewStructure structure,
+ boolean forAutofill) {
// NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
// this method should take a boolean with the type of request.
AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
@@ -7385,7 +7404,7 @@
AccessibilityNodeInfo info = createAccessibilityNodeInfo();
structure.setChildCount(1);
ViewStructure root = structure.newChild(0);
- populateVirtualStructure(root, provider, info, forAutoFill);
+ populateVirtualStructure(root, provider, info, forAutofill);
info.recycle();
}
}
@@ -7394,13 +7413,13 @@
* Automatically fills the content of this view with the {@code value}.
*
* <p>By default does nothing, but views should override it (and {@link #getAutofillType()},
- * {@link #getAutoFillValue()}, and {@link #onProvideAutoFillStructure(ViewStructure, int)}
- * to support the AutoFill Framework.
+ * {@link #getAutofillValue()}, and {@link #onProvideAutofillStructure(ViewStructure, int)}
+ * to support the Autofill Framework.
*
* <p>Typically, it is implemented by:
*
* <ol>
- * <li>Calling the proper getter method on {@link AutoFillValue} to fetch the actual value.
+ * <li>Calling the proper getter method on {@link AutofillValue} to fetch the actual value.
* <li>Passing the actual value to the equivalent setter in the view.
* <ol>
*
@@ -7413,76 +7432,56 @@
* }
* </pre>
*
- * @param value value to be auto-filled.
+ * @param value value to be autofilled.
*/
- public void autoFill(@SuppressWarnings("unused") AutoFillValue value) {
+ public void autofill(@SuppressWarnings("unused") AutofillValue value) {
}
/**
* Automatically fills the content of a virtual view with the {@code value}
*
- * <p>See {@link #autoFill(AutoFillValue)} and
- * {@link #onProvideAutoFillVirtualStructure(ViewStructure, int)} for more info.
+ * <p>See {@link #autofill(AutofillValue)} and
+ * {@link #onProvideAutofillVirtualStructure(ViewStructure, int)} for more info.
*
- * @param value value to be auto-filled.
+ * @param value value to be autofilled.
* @param virtualId id identifying the virtual child inside the custom view.
*/
- public void autoFillVirtual(@SuppressWarnings("unused") int virtualId,
- @SuppressWarnings("unused") AutoFillValue value) {
+ public void autofillVirtual(@SuppressWarnings("unused") int virtualId,
+ @SuppressWarnings("unused") AutofillValue value) {
}
/**
- * @deprecated TODO(b/35956626): remove once clients use getAutoFilltype
- */
- @Deprecated
- @Nullable
- public final AutoFillType getAutoFillType() {
- switch (getAutofillType()) {
- case AUTOFILL_TYPE_TEXT:
- return AutoFillType.forText();
- case AUTOFILL_TYPE_TOGGLE:
- return AutoFillType.forToggle();
- case AUTOFILL_TYPE_LIST:
- return AutoFillType.forList();
- case AUTOFILL_TYPE_DATE:
- return AutoFillType.forDate();
- default:
- return null;
- }
- }
-
- /**
- * Describes the auto-fill type that should be used on calls to
- * {@link #autoFill(AutoFillValue)} and {@link #autoFillVirtual(int, AutoFillValue)}.
+ * Describes the autofill type that should be used on calls to
+ * {@link #autofill(AutofillValue)} and {@link #autofillVirtual(int, AutofillValue)}.
*
* <p>By default returns {@link #AUTOFILL_TYPE_NONE}, but views should override it (and
- * {@link #autoFill(AutoFillValue)} to support the AutoFill Framework.
+ * {@link #autofill(AutofillValue)} to support the Autofill Framework.
*/
public @AutofillType int getAutofillType() {
return AUTOFILL_TYPE_NONE;
}
/**
- * Describes the content of a view so that a auto-fill service can fill in the appropriate data.
+ * Describes the content of a view so that a autofill service can fill in the appropriate data.
*
* @return The hint set via the attribute
*
- * @attr ref android.R.styleable#View_autoFillHint
+ * @attr ref android.R.styleable#View_autofillHint
*/
@ViewDebug.ExportedProperty()
- @AutoFillHint public int getAutoFillHint() {
- return mAutoFillHint;
+ @AutofillHint public int getAutofillHint() {
+ return mAutofillHint;
}
/**
- * Gets the {@link View}'s current auto-fill value.
+ * Gets the {@link View}'s current autofill value.
*
* <p>By default returns {@code null}, but views should override it (and
- * {@link #autoFill(AutoFillValue)}, and {@link #getAutofillType()} to support the AutoFill
+ * {@link #autofill(AutofillValue)}, and {@link #getAutofillType()} to support the Autofill
* Framework.
*/
@Nullable
- public AutoFillValue getAutoFillValue() {
+ public AutofillValue getAutofillValue() {
return null;
}
@@ -7528,16 +7527,16 @@
*
* <p>Generally speaking, a view is important for autofill if:
* <ol>
- * <li>The view can-be autofilled by an {@link android.service.autofill.AutoFillService}.
- * <li>The view contents can help an {@link android.service.autofill.AutoFillService} to
+ * <li>The view can-be autofilled by an {@link android.service.autofill.AutofillService}.
+ * <li>The view contents can help an {@link android.service.autofill.AutofillService} to
* autofill other views.
* <ol>
*
* <p>For example, view containers should typically return {@code false} for performance reasons
* (since the important info is provided by their children), but if the container is actually
* whose children are part of a compound view, it should return {@code true} (and then override
- * {@link #dispatchProvideAutoFillStructure(ViewStructure, int)} to simply call
- * {@link #onProvideAutoFillStructure(ViewStructure, int)} so its children are not included in
+ * {@link #dispatchProvideAutofillStructure(ViewStructure, int)} to simply call
+ * {@link #onProvideAutofillStructure(ViewStructure, int)} so its children are not included in
* the structure). On the other hand, views representing labels or editable fields should
* typically return {@code true}, but in some cases they could return {@code false} (for
* example, if they're part of a "Captcha" mechanism).
@@ -7554,9 +7553,9 @@
*
* <p>This decision applies just for the view, not its children - if the view children are not
* important for autofill, the view should override
- * {@link #dispatchProvideAutoFillStructure(ViewStructure, int)} to simply call
- * {@link #onProvideAutoFillStructure(ViewStructure, int)} (instead of calling
- * {@link #dispatchProvideAutoFillStructure(ViewStructure, int)} for each child).
+ * {@link #dispatchProvideAutofillStructure(ViewStructure, int)} to simply call
+ * {@link #onProvideAutofillStructure(ViewStructure, int)} (instead of calling
+ * {@link #dispatchProvideAutofillStructure(ViewStructure, int)} for each child).
*
* @return whether the view is considered important for autofill.
*
@@ -7599,16 +7598,16 @@
}
@Nullable
- private AutoFillManager getAutoFillManager() {
- return mContext.getSystemService(AutoFillManager.class);
+ private AutofillManager getAutofillManager() {
+ return mContext.getSystemService(AutofillManager.class);
}
- private boolean isAutoFillable() {
- return getAutofillType() != AUTOFILL_TYPE_NONE && !isAutoFillBlocked();
+ private boolean isAutofillable() {
+ return getAutofillType() != AUTOFILL_TYPE_NONE && !isAutofillBlocked();
}
private void populateVirtualStructure(ViewStructure structure,
- AccessibilityNodeProvider provider, AccessibilityNodeInfo info, boolean forAutoFill) {
+ AccessibilityNodeProvider provider, AccessibilityNodeInfo info, boolean forAutofill) {
structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()),
null, null, null);
Rect rect = structure.getTempRect();
@@ -7646,7 +7645,7 @@
CharSequence cname = info.getClassName();
structure.setClassName(cname != null ? cname.toString() : null);
structure.setContentDescription(info.getContentDescription());
- if (!forAutoFill && (info.getText() != null || info.getError() != null)) {
+ if (!forAutofill && (info.getText() != null || info.getError() != null)) {
// TODO(b/33197203) (b/33269702): when sanitized, try to use the Accessibility API to
// just set sanitized values (like text coming from resource files), rather than not
// setting it at all.
@@ -7660,7 +7659,7 @@
AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo(
AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i)));
ViewStructure child = structure.newChild(i);
- populateVirtualStructure(child, provider, cinfo, forAutoFill);
+ populateVirtualStructure(child, provider, cinfo, forAutofill);
cinfo.recycle();
}
}
@@ -7672,7 +7671,7 @@
* {@link #onProvideVirtualStructure}.
*/
public void dispatchProvideStructure(ViewStructure structure) {
- dispatchProvideStructureForAssistOrAutoFill(structure, false);
+ dispatchProvideStructureForAssistOrAutofill(structure, false);
}
/**
@@ -7681,27 +7680,27 @@
* <p>The structure must be filled according to the request type, which is set in the
* {@code flags} parameter - see the documentation on each flag for more details.
*
- * <p>The default implementation calls {@link #onProvideAutoFillStructure(ViewStructure, int)}
- * and {@link #onProvideAutoFillVirtualStructure(ViewStructure, int)}.
+ * <p>The default implementation calls {@link #onProvideAutofillStructure(ViewStructure, int)}
+ * and {@link #onProvideAutofillVirtualStructure(ViewStructure, int)}.
*
* @param structure Fill in with structured view data.
* @param flags optional flags (currently {@code 0}).
*/
- public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
- dispatchProvideStructureForAssistOrAutoFill(structure, true);
+ public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ dispatchProvideStructureForAssistOrAutofill(structure, true);
}
- private void dispatchProvideStructureForAssistOrAutoFill(ViewStructure structure,
- boolean forAutoFill) {
- boolean blocked = forAutoFill ? isAutoFillBlocked() : isAssistBlocked();
+ private void dispatchProvideStructureForAssistOrAutofill(ViewStructure structure,
+ boolean forAutofill) {
+ boolean blocked = forAutofill ? isAutofillBlocked() : isAssistBlocked();
if (!blocked) {
- if (forAutoFill) {
- // The auto-fill id needs to be unique, but its value doesn't matter,
+ if (forAutofill) {
+ // The autofill id needs to be unique, but its value doesn't matter,
// so it's better to reuse the accessibility id to save space.
- structure.setAutoFillId(getAccessibilityViewId());
+ structure.setAutofillId(getAccessibilityViewId());
// NOTE: flags are not currently supported, hence 0
- onProvideAutoFillStructure(structure, 0);
- onProvideAutoFillVirtualStructure(structure, 0);
+ onProvideAutofillStructure(structure, 0);
+ onProvideAutofillVirtualStructure(structure, 0);
} else {
onProvideStructure(structure);
onProvideVirtualStructure(structure);
@@ -8115,7 +8114,7 @@
*/
public int getAccessibilityWindowId() {
return mAttachInfo != null ? mAttachInfo.mAccessibilityWindowId
- : AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ : AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
}
/**
@@ -9082,29 +9081,29 @@
}
/**
- * Set auto-fill mode for the view.
+ * Set autofill mode for the view.
*
- * @param autoFillMode One of {@link #AUTO_FILL_MODE_INHERIT}, {@link #AUTO_FILL_MODE_AUTO},
- * or {@link #AUTO_FILL_MODE_MANUAL}.
- * @attr ref android.R.styleable#View_autoFillMode
+ * @param autofillMode One of {@link #AUTOFILL_MODE_INHERIT}, {@link #AUTOFILL_MODE_AUTO},
+ * or {@link #AUTOFILL_MODE_MANUAL}.
+ * @attr ref android.R.styleable#View_autofillMode
*/
- public void setAutoFillMode(@AutoFillMode int autoFillMode) {
- Preconditions.checkArgumentInRange(autoFillMode, AUTO_FILL_MODE_INHERIT,
- AUTO_FILL_MODE_MANUAL, "autoFillMode");
+ public void setAutofillMode(@AutofillMode int autofillMode) {
+ Preconditions.checkArgumentInRange(autofillMode, AUTOFILL_MODE_INHERIT,
+ AUTOFILL_MODE_MANUAL, "autofillMode");
- mPrivateFlags3 &= ~PFLAG3_AUTO_FILL_MODE_MASK;
- mPrivateFlags3 |= autoFillMode << PFLAG3_AUTO_FILL_MODE_SHIFT;
+ mPrivateFlags3 &= ~PFLAG3_AUTOFILL_MODE_MASK;
+ mPrivateFlags3 |= autofillMode << PFLAG3_AUTOFILL_MODE_SHIFT;
}
/**
- * Sets the a hint that helps the auto-fill service to select the appropriate data to fill the
+ * Sets the a hint that helps the autofill service to select the appropriate data to fill the
* view.
*
- * @param autoFillHint The auto-fill hint to set
- * @attr ref android.R.styleable#View_autoFillHint
+ * @param autofillHint The autofill hint to set
+ * @attr ref android.R.styleable#View_autofillHint
*/
- public void setAutoFillHint(@AutoFillHint int autoFillHint) {
- mAutoFillHint = autoFillHint;
+ public void setAutofillHint(@AutofillHint int autofillHint) {
+ mAutofillHint = autofillHint;
}
/**
@@ -9537,19 +9536,19 @@
/**
* @hide
* Indicates whether this view will participate in data collection through
- * {@link ViewStructure} for auto-fill purposes.
+ * {@link ViewStructure} for autofill purposes.
*
* <p>If {@code true}, it will not provide any data for itself or its children.
* <p>If {@code false}, the normal data collection will be allowed.
*
- * @return Returns {@code false} if assist data collection for auto-fill is not blocked,
+ * @return Returns {@code false} if assist data collection for autofill is not blocked,
* else {@code true}.
*
* TODO(b/33197203): update / remove javadoc tags below
* @see #setAssistBlocked(boolean)
* @attr ref android.R.styleable#View_assistBlocked
*/
- public boolean isAutoFillBlocked() {
+ public boolean isAutofillBlocked() {
return false; // TODO(b/33197203): properly implement it
}
@@ -9711,44 +9710,44 @@
}
/**
- * Returns the auto-fill mode for this view.
+ * Returns the autofill mode for this view.
*
- * @return One of {@link #AUTO_FILL_MODE_INHERIT}, {@link #AUTO_FILL_MODE_AUTO}, or
- * {@link #AUTO_FILL_MODE_MANUAL}.
- * @attr ref android.R.styleable#View_autoFillMode
+ * @return One of {@link #AUTOFILL_MODE_INHERIT}, {@link #AUTOFILL_MODE_AUTO}, or
+ * {@link #AUTOFILL_MODE_MANUAL}.
+ * @attr ref android.R.styleable#View_autofillMode
*/
@ViewDebug.ExportedProperty(mapping = {
- @ViewDebug.IntToString(from = AUTO_FILL_MODE_INHERIT, to = "AUTO_FILL_MODE_INHERIT"),
- @ViewDebug.IntToString(from = AUTO_FILL_MODE_AUTO, to = "AUTO_FILL_MODE_AUTO"),
- @ViewDebug.IntToString(from = AUTO_FILL_MODE_MANUAL, to = "AUTO_FILL_MODE_MANUAL")
+ @ViewDebug.IntToString(from = AUTOFILL_MODE_INHERIT, to = "AUTOFILL_MODE_INHERIT"),
+ @ViewDebug.IntToString(from = AUTOFILL_MODE_AUTO, to = "AUTOFILL_MODE_AUTO"),
+ @ViewDebug.IntToString(from = AUTOFILL_MODE_MANUAL, to = "AUTOFILL_MODE_MANUAL")
})
- @AutoFillMode
- public int getAutoFillMode() {
- return (mPrivateFlags3 & PFLAG3_AUTO_FILL_MODE_MASK) >> PFLAG3_AUTO_FILL_MODE_SHIFT;
+ @AutofillMode
+ public int getAutofillMode() {
+ return (mPrivateFlags3 & PFLAG3_AUTOFILL_MODE_MASK) >> PFLAG3_AUTOFILL_MODE_SHIFT;
}
/**
- * Returns the resolved auto-fill mode for this view.
+ * Returns the resolved autofill mode for this view.
*
- * This is the same as {@link #getAutoFillMode()} but if the mode is
- * {@link #AUTO_FILL_MODE_INHERIT} the parents auto-fill mode will be returned.
+ * This is the same as {@link #getAutofillMode()} but if the mode is
+ * {@link #AUTOFILL_MODE_INHERIT} the parents autofill mode will be returned.
*
- * @return One of {@link #AUTO_FILL_MODE_AUTO}, or {@link #AUTO_FILL_MODE_MANUAL}. If the auto-
- * fill mode can not be resolved e.g. {@link #getAutoFillMode()} is
- * {@link #AUTO_FILL_MODE_INHERIT} and the {@link View} is detached
- * {@link #AUTO_FILL_MODE_AUTO} is returned.
+ * @return One of {@link #AUTOFILL_MODE_AUTO}, or {@link #AUTOFILL_MODE_MANUAL}. If the auto-
+ * fill mode can not be resolved e.g. {@link #getAutofillMode()} is
+ * {@link #AUTOFILL_MODE_INHERIT} and the {@link View} is detached
+ * {@link #AUTOFILL_MODE_AUTO} is returned.
*/
- public @AutoFillMode int getResolvedAutoFillMode() {
- @AutoFillMode int autoFillMode = getAutoFillMode();
+ public @AutofillMode int getResolvedAutofillMode() {
+ @AutofillMode int autofillMode = getAutofillMode();
- if (autoFillMode == AUTO_FILL_MODE_INHERIT) {
+ if (autofillMode == AUTOFILL_MODE_INHERIT) {
if (mParent == null) {
- return AUTO_FILL_MODE_AUTO;
+ return AUTOFILL_MODE_AUTO;
} else {
- return mParent.getResolvedAutoFillMode();
+ return mParent.getResolvedAutofillMode();
}
} else {
- return autoFillMode;
+ return autofillMode;
}
}
@@ -11097,6 +11096,7 @@
@CallSuper
public void dispatchStartTemporaryDetach() {
mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH;
+ notifyEnterOrExitForAutoFillIfNeeded(false);
onStartTemporaryDetach();
}
@@ -11122,6 +11122,7 @@
if (hasWindowFocus() && hasFocus()) {
InputMethodManager.getInstance().focusIn(this);
}
+ notifyEnterOrExitForAutoFillIfNeeded(true);
}
/**
@@ -11524,6 +11525,9 @@
} else if (imm != null && (mPrivateFlags & PFLAG_FOCUSED) != 0) {
imm.focusIn(this);
}
+
+ notifyEnterOrExitForAutoFillIfNeeded(hasWindowFocus);
+
refreshDrawableState();
}
@@ -11904,7 +11908,9 @@
if (!mHasPerformedLongPress) {
// This is a tap, so remove the longpress check
removeLongPressCallback();
- return performClick();
+ if (!event.isCanceled()) {
+ return performClick();
+ }
}
}
}
@@ -16889,12 +16895,7 @@
}
needGlobalAttributesUpdate(false);
- if (isAutoFillable() && isFocused() && getResolvedAutoFillMode() == AUTO_FILL_MODE_AUTO) {
- AutoFillManager afm = getAutoFillManager();
- if (afm != null) {
- afm.startAutoFillRequest(this);
- }
- }
+ notifyEnterOrExitForAutoFillIfNeeded(true);
}
void dispatchDetachedFromWindow() {
@@ -16942,12 +16943,7 @@
mOverlay.getOverlayView().dispatchDetachedFromWindow();
}
- if (isAutoFillable() && isFocused() && getResolvedAutoFillMode() == AUTO_FILL_MODE_AUTO) {
- AutoFillManager afm = getAutoFillManager();
- if (afm != null) {
- afm.stopAutoFillRequest(this);
- }
- }
+ notifyEnterOrExitForAutoFillIfNeeded(false);
}
/**
@@ -24668,7 +24664,7 @@
/**
* The id of the window for accessibility purposes.
*/
- int mAccessibilityWindowId = AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ int mAccessibilityWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
/**
* Flags related to accessibility processing.
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 214249f..de0ec40 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -46,6 +46,7 @@
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
+import android.util.Pools;
import android.util.Pools.SynchronizedPool;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -3327,7 +3328,74 @@
@Override
public void dispatchProvideStructure(ViewStructure structure) {
super.dispatchProvideStructure(structure);
- dispatchProvideStructureForAssistOrAutoFill(structure, false);
+ if (isAssistBlocked() || structure.getChildCount() != 0) {
+ return;
+ }
+ final int childrenCount = mChildrenCount;
+ if (childrenCount <= 0) {
+ return;
+ }
+ structure.setChildCount(childrenCount);
+ ArrayList<View> preorderedList = buildOrderedChildList();
+ boolean customOrder = preorderedList == null
+ && isChildrenDrawingOrderEnabled();
+ for (int i = 0; i < childrenCount; i++) {
+ int childIndex;
+ try {
+ childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
+ } catch (IndexOutOfBoundsException e) {
+ childIndex = i;
+ if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) {
+ Log.w(TAG, "Bad getChildDrawingOrder while collecting assist @ "
+ + i + " of " + childrenCount, e);
+ // At least one app is failing when we call getChildDrawingOrder
+ // at this point, so deal semi-gracefully with it by falling back
+ // on the basic order.
+ customOrder = false;
+ if (i > 0) {
+ // If we failed at the first index, there really isn't
+ // anything to do -- we will just proceed with the simple
+ // sequence order.
+ // Otherwise, we failed in the middle, so need to come up
+ // with an order for the remaining indices and use that.
+ // Failed at the first one, easy peasy.
+ int[] permutation = new int[childrenCount];
+ SparseBooleanArray usedIndices = new SparseBooleanArray();
+ // Go back and collected the indices we have done so far.
+ for (int j = 0; j < i; j++) {
+ permutation[j] = getChildDrawingOrder(childrenCount, j);
+ usedIndices.put(permutation[j], true);
+ }
+ // Fill in the remaining indices with indices that have not
+ // yet been used.
+ int nextIndex = 0;
+ for (int j = i; j < childrenCount; j++) {
+ while (usedIndices.get(nextIndex, false)) {
+ nextIndex++;
+ }
+ permutation[j] = nextIndex;
+ nextIndex++;
+ }
+ // Build the final view list.
+ preorderedList = new ArrayList<>(childrenCount);
+ for (int j = 0; j < childrenCount; j++) {
+ final int index = permutation[j];
+ final View child = mChildren[index];
+ preorderedList.add(child);
+ }
+ }
+ } else {
+ throw e;
+ }
+ }
+ final View child = getAndVerifyPreorderedView(preorderedList, mChildren,
+ childIndex);
+ final ViewStructure cstructure = structure.newChild(i);
+ child.dispatchProvideStructure(cstructure);
+ }
+ if (preorderedList != null) {
+ preorderedList.clear();
+ }
}
/**
@@ -3337,23 +3405,46 @@
* default {@link View} implementation.
*/
@Override
- public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.dispatchProvideAutoFillStructure(structure, flags);
- dispatchProvideStructureForAssistOrAutoFill(structure, true);
+ public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.dispatchProvideAutofillStructure(structure, flags);
+ if (isAutofillBlocked() || structure.getChildCount() != 0) {
+ return;
+ }
+ final ChildListForAutoFill children = getChildrenForAutofill();
+ final int childrenCount = children.size();
+ structure.setChildCount(childrenCount);
+ for (int i = 0; i < childrenCount; i++) {
+ final View child = children.get(i);
+ final ViewStructure cstructure = structure.newChild(i);
+ child.dispatchProvideAutofillStructure(cstructure, flags);
+ }
+ children.recycle();
}
- /** @hide */
- private ArrayList<View> getChildrenForAutofill() {
- final ArrayList<View> list = new ArrayList<>();
- populateChildrenForAutofill(list);
- return list;
+ /**
+ * Gets the children for autofill. Children for autofill are the first
+ * level descendants that are important for autofill. The returned
+ * child list object is pooled and the caller must recycle it once done.
+ * @hide */
+ private @NonNull ChildListForAutoFill getChildrenForAutofill() {
+ final ChildListForAutoFill children = ChildListForAutoFill.obtain();
+ populateChildrenForAutofill(children);
+ return children;
}
/** @hide */
private void populateChildrenForAutofill(ArrayList<View> list) {
- final int count = mChildrenCount;
- for (int i = 0; i < count; i++) {
- final View child = mChildren[i];
+ final int childrenCount = mChildrenCount;
+ if (childrenCount <= 0) {
+ return;
+ }
+ final ArrayList<View> preorderedList = buildOrderedChildList();
+ final boolean customOrder = preorderedList == null
+ && isChildrenDrawingOrderEnabled();
+ for (int i = 0; i < childrenCount; i++) {
+ final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
+ final View child = (preorderedList == null)
+ ? mChildren[childIndex] : preorderedList.get(childIndex);
if (child.isImportantForAutofill()) {
list.add(child);
} else if (child instanceof ViewGroup) {
@@ -3362,106 +3453,6 @@
}
}
- private void dispatchProvideStructureForAssistOrAutoFill(ViewStructure structure,
- boolean forAutoFill) {
- boolean blocked = forAutoFill ? isAutoFillBlocked() : isAssistBlocked();
- if (blocked || structure.getChildCount() != 0) {
- return;
- }
- final View[] childrenArray;
- final ArrayList<View> childrenList;
- final int childrenCount;
-
- if (forAutoFill) {
- childrenArray = null;
- // TODO(b/33197203): the current algorithm allocates a new list for each children that
- // is a view group; ideally, we should use mAttachInfo.mTempArrayList instead, but that
- // would complicated the algorithm a lot...
- childrenList = getChildrenForAutofill();
-
- childrenCount = childrenList.size();
- } else {
- childrenArray = mChildren;
- childrenList = null;
- childrenCount = getChildCount();
- }
-
- if (childrenCount > 0) {
- structure.setChildCount(childrenCount);
- ArrayList<View> preorderedList = buildOrderedChildList();
- boolean customOrder = preorderedList == null
- && isChildrenDrawingOrderEnabled();
- for (int i = 0; i < childrenCount; i++) {
- int childIndex;
- try {
- childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
- } catch (IndexOutOfBoundsException e) {
- childIndex = i;
- if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) {
- Log.w(TAG, "Bad getChildDrawingOrder while collecting assist @ "
- + i + " of " + childrenCount, e);
- // At least one app is failing when we call getChildDrawingOrder
- // at this point, so deal semi-gracefully with it by falling back
- // on the basic order.
- customOrder = false;
- if (i > 0) {
- // If we failed at the first index, there really isn't
- // anything to do -- we will just proceed with the simple
- // sequence order.
- // Otherwise, we failed in the middle, so need to come up
- // with an order for the remaining indices and use that.
- // Failed at the first one, easy peasy.
- int[] permutation = new int[childrenCount];
- SparseBooleanArray usedIndices = new SparseBooleanArray();
- // Go back and collected the indices we have done so far.
- for (int j = 0; j < i; j++) {
- permutation[j] = getChildDrawingOrder(childrenCount, j);
- usedIndices.put(permutation[j], true);
- }
- // Fill in the remaining indices with indices that have not
- // yet been used.
- int nextIndex = 0;
- for (int j = i; j < childrenCount; j++) {
- while (usedIndices.get(nextIndex, false)) {
- nextIndex++;
- }
- permutation[j] = nextIndex;
- nextIndex++;
- }
- // Build the final view list.
- preorderedList = new ArrayList<>(childrenCount);
- for (int j = 0; j < childrenCount; j++) {
- final int index = permutation[j];
- final View child = forAutoFill
- ? childrenList.get(index)
- : childrenArray[index];
- preorderedList.add(child);
- }
- }
- } else {
- throw e;
- }
- }
-
- final View child = forAutoFill
- ? getAndVerifyPreorderedView(preorderedList, childrenList, childIndex)
- : getAndVerifyPreorderedView(preorderedList, childrenArray, childIndex);
- final ViewStructure cstructure = structure.newChild(i);
-
- // Must explicitly check which recursive method to call.
- if (forAutoFill) {
- // NOTE: flags are not currently supported, hence 0
- child.dispatchProvideAutoFillStructure(cstructure, 0);
- } else {
- child.dispatchProvideStructure(cstructure);
- }
- }
- if (preorderedList != null) {
- preorderedList.clear();
- }
- }
- }
-
private static View getAndVerifyPreorderedView(ArrayList<View> preorderedList, View[] children,
int childIndex) {
final View child;
@@ -3477,21 +3468,6 @@
return child;
}
- private static View getAndVerifyPreorderedView(ArrayList<View> preorderedList,
- ArrayList<View> children, int childIndex) {
- final View child;
- if (preorderedList != null) {
- child = preorderedList.get(childIndex);
- if (child == null) {
- throw new RuntimeException("Invalid preorderedList contained null child at index "
- + childIndex);
- }
- } else {
- child = children.get(childIndex);
- }
- return child;
- }
-
/** @hide */
@Override
public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
@@ -8192,6 +8168,29 @@
}
/**
+ * Pooled class that to hold the children for autifill.
+ */
+ static class ChildListForAutoFill extends ArrayList<View> {
+ private static final int MAX_POOL_SIZE = 32;
+
+ private static final Pools.SimplePool<ChildListForAutoFill> sPool =
+ new Pools.SimplePool<>(MAX_POOL_SIZE);
+
+ public static ChildListForAutoFill obtain() {
+ ChildListForAutoFill list = sPool.acquire();
+ if (list == null) {
+ list = new ChildListForAutoFill();
+ }
+ return list;
+ }
+
+ public void recycle() {
+ clear();
+ sPool.release(this);
+ }
+ }
+
+ /**
* Pooled class that orderes the children of a ViewGroup from start
* to end based on how they are laid out and the layout direction.
*/
@@ -8228,10 +8227,6 @@
return mChildren.get(index);
}
- public int getChildIndex(View child) {
- return mChildren.indexOf(child);
- }
-
private void init(ViewGroup parent, boolean sort) {
ArrayList<View> children = mChildren;
final int childCount = parent.getChildCount();
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index 1467b69..d5aab48 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -661,15 +661,15 @@
public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments);
/**
- * Return the resolved auto-fill mode.
+ * Return the resolved autofill mode.
*
- * @return One of {@link View#AUTO_FILL_MODE_AUTO}, {@link View#AUTO_FILL_MODE_MANUAL} if the
- * auto-fill mode can be resolved. If the auto-fill mode cannot be resolved
- * {@link View#AUTO_FILL_MODE_AUTO}.
+ * @return One of {@link View#AUTOFILL_MODE_AUTO}, {@link View#AUTOFILL_MODE_MANUAL} if the
+ * autofill mode can be resolved. If the autofill mode cannot be resolved
+ * {@link View#AUTOFILL_MODE_AUTO}.
*
- * @see View#getResolvedAutoFillMode()
+ * @see View#getResolvedAutofillMode()
*/
- default @View.AutoFillMode int getResolvedAutoFillMode() {
- return View.AUTO_FILL_MODE_AUTO;
+ default @View.AutofillMode int getResolvedAutofillMode() {
+ return View.AUTOFILL_MODE_AUTO;
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 20d960f..580888c 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -82,6 +82,7 @@
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
+import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityInteractionConnection;
import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
import android.view.animation.AccelerateDecelerateInterpolator;
@@ -2632,6 +2633,14 @@
}
}
+ private void onDrawFinished() {
+ try {
+ mWindowSession.finishDrawing(mWindow);
+ } catch (RemoteException e) {
+ // Have fun!
+ }
+ }
+
private void performDraw() {
if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) {
return;
@@ -2682,7 +2691,7 @@
}
if (mSurfaceHolder != null && mSurface.isValid()) {
- SurfaceCallbackHelper sch = new SurfaceCallbackHelper(mWindowSession, mWindow);
+ SurfaceCallbackHelper sch = new SurfaceCallbackHelper(this::onDrawFinished);
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
sch.dispatchSurfaceRedrawNeededAsync(mSurfaceHolder, callbacks);
@@ -6872,12 +6881,7 @@
final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
sourceNodeId);
final AccessibilityNodeInfo node;
- if (virtualNodeId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- node = provider.createAccessibilityNodeInfo(
- AccessibilityNodeProvider.HOST_VIEW_ID);
- } else {
- node = provider.createAccessibilityNodeInfo(virtualNodeId);
- }
+ node = provider.createAccessibilityNodeInfo(virtualNodeId);
setAccessibilityFocus(source, node);
}
}
@@ -6963,10 +6967,6 @@
final long focusedSourceNodeId = mAccessibilityFocusedVirtualView.getSourceNodeId();
int focusedChildId = AccessibilityNodeInfo.getVirtualDescendantId(focusedSourceNodeId);
- if (focusedChildId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
- // TODO: Should we clear the focused virtual view?
- focusedChildId = AccessibilityNodeProvider.HOST_VIEW_ID;
- }
// Refresh the node for the focused virtual view.
final Rect oldBounds = mTempRect;
@@ -7487,8 +7487,8 @@
}
public void ensureConnection() {
- final boolean registered =
- mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ final boolean registered = mAttachInfo.mAccessibilityWindowId
+ != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
if (!registered) {
mAttachInfo.mAccessibilityWindowId =
mAccessibilityManager.addAccessibilityInteractionConnection(mWindow,
@@ -7497,10 +7497,10 @@
}
public void ensureNoConnection() {
- final boolean registered =
- mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ final boolean registered = mAttachInfo.mAccessibilityWindowId
+ != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
if (registered) {
- mAttachInfo.mAccessibilityWindowId = AccessibilityNodeInfo.UNDEFINED_ITEM_ID;
+ mAttachInfo.mAccessibilityWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
mAccessibilityManager.removeAccessibilityInteractionConnection(mWindow);
}
}
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index c7c2bb8..bccaca2 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -19,14 +19,13 @@
import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.Bundle;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillType;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
/**
* Container for storing additional per-view data generated by {@link View#onProvideStructure
- * View.onProvideStructure} and {@link View#onProvideAutoFillStructure
- * View.onProvideAutoFillStructure}.
+ * View.onProvideStructure} and {@link View#onProvideAutofillStructure
+ * View.onProvideAutofillStructure}.
*/
public abstract class ViewStructure {
@@ -147,6 +146,11 @@
public abstract void setActivated(boolean state);
/**
+ * Set the opaque state of this view, as per {@link View#isOpaque View.isOpaque()}.
+ */
+ public abstract void setOpaque(boolean opaque);
+
+ /**
* Set the class name of the view, as per
* {@link View#getAccessibilityClassName View.getAccessibilityClassName()}.
*/
@@ -264,19 +268,19 @@
public abstract ViewStructure newChild(int index);
/**
- * Create a new child {@link ViewStructure} in this view for auto-fill purposes.
+ * Create a new child {@link ViewStructure} in this view for autofill purposes.
*
* @param index the index (in the list of children) to put the new child at (see
* {@link #addChildCount(int)} and {@link #setChildCount(int)}.
* @param virtualId an opaque ID to the Android System (although it could be meaningful to the
* {@link View} creating the {@link ViewStructure}), but it's the same id used on
- * {@link View#autoFillVirtual(int, AutoFillValue)}.
+ * {@link View#autofillVirtual(int, AutofillValue)}.
* @param flags currently {@code 0}.
*
* @return Returns an fresh {@link ViewStructure} ready to be filled in.
*/
// TODO(b/33197203, b/33802548): add CTS/unit test
- public abstract ViewStructure newChildForAutoFill(int index, int virtualId, int flags);
+ public abstract ViewStructure newChildForAutofill(int index, int virtualId, int flags);
/**
* Like {@link #newChild}, but allows the caller to asynchronously populate the returned
@@ -289,7 +293,7 @@
public abstract ViewStructure asyncNewChild(int index);
/**
- * Like {@link #newChildForAutoFill(int, int, int)}, but allows the caller to asynchronously
+ * Like {@link #newChildForAutofill(int, int, int)}, but allows the caller to asynchronously
* populate the returned child.
*
* <p>It can transfer the returned {@link ViewStructure} to another thread for it to build its
@@ -302,19 +306,13 @@
* {@link #addChildCount(int)} and {@link #setChildCount(int)}.
* @param virtualId an opaque ID to the Android System (although it could be meaningful to the
* {@link View} creating the {@link ViewStructure}), but it's the same id used on
- * {@link View#autoFillVirtual(int, AutoFillValue)}.
+ * {@link View#autofillVirtual(int, AutofillValue)}.
* @param flags currently {@code 0}.
*
* @return Returns an fresh {@link ViewStructure} ready to be filled in.
*/
// TODO(b/33197203, b/33802548): add CTS/unit test
- public abstract ViewStructure asyncNewChildForAutoFill(int index, int virtualId, int flags);
-
- /**
- * @deprecated TODO(b/35956626): remove once clients use setAutoFilltype()
- */
- @Deprecated
- public abstract void setAutoFillType(AutoFillType info);
+ public abstract ViewStructure asyncNewChildForAutofill(int index, int virtualId, int flags);
/**
* Sets the {@link View#getAutofillType()} that can be used to autofill this node.
@@ -322,26 +320,23 @@
public abstract void setAutofillType(@View.AutofillType int type);
/**
- * Sets the a hint that helps the auto-fill service to select the appropriate data to fill the
+ * Sets the a hint that helps the autofill service to select the appropriate data to fill the
* view.
*/
- // TODO(b/35364993): add CTS/unit test
- public abstract void setAutoFillHint(@View.AutoFillHint int hint);
+ public abstract void setAutofillHint(@View.AutofillHint int hint);
/**
- * Sets the {@link AutoFillValue} representing the current value of this node.
+ * Sets the {@link AutofillValue} representing the current value of this node.
*/
- // TODO(b/33197203, b/33802548): add CTS/unit test
- public abstract void setAutoFillValue(AutoFillValue value);
+ public abstract void setAutofillValue(AutofillValue value);
/**
- * Sets the options that can be used to auto-fill this node.
+ * Sets the options that can be used to autofill this node.
*
- * <p>Typically used by nodes whose {@link AutoFillType} is a list to indicate the meaning of
- * each possible value in the list.
+ * <p>Typically used by nodes whose {@link View#getAutofillType()} is a list to indicate the
+ * meaning of each possible value in the list.
*/
- // TODO(b/33197203, b/33802548): add CTS/unit test
- public abstract void setAutoFillOptions(String[] options);
+ public abstract void setAutofillOptions(String[] options);
/**
* Sets the {@link android.text.InputType} bits of this node.
@@ -352,7 +347,7 @@
/**
* Marks this node as sanitized so its content are sent on {@link
- * android.service.autofill.AutoFillService#onFillRequest(android.app.assist.AssistStructure,
+ * android.service.autofill.AutofillService#onFillRequest(android.app.assist.AssistStructure,
* Bundle, android.os.CancellationSignal, android.service.autofill.FillCallback)}.
*
* <p>Only nodes that does not have PII (Personally Identifiable Information - sensitive data
@@ -360,7 +355,7 @@
* as sanitized; a good rule of thumb is to mark as sanitized nodes whose value were statically
* set from resources.
*
- * <p>Should only be set when the node is used for AutoFill purposes - it will be ignored
+ * <p>Should only be set when the node is used for autofill purposes - it will be ignored
* when used for Assist.
*/
public abstract void setSanitized(boolean sanitized);
@@ -375,10 +370,10 @@
public abstract Rect getTempRect();
/** @hide */
- public abstract void setAutoFillId(int viewId);
+ public abstract void setAutofillId(int viewId);
/** @hide */
- public abstract AutoFillId getAutoFillId();
+ public abstract AutofillId getAutofillId();
/**
* Sets the URL represented by this node.
diff --git a/core/java/android/view/WindowInfo.java b/core/java/android/view/WindowInfo.java
index 737e4607..95a6394 100644
--- a/core/java/android/view/WindowInfo.java
+++ b/core/java/android/view/WindowInfo.java
@@ -46,6 +46,7 @@
public List<IBinder> childTokens;
public CharSequence title;
public int accessibilityIdOfAnchor = View.NO_ID;
+ public boolean inPictureInPicture;
private WindowInfo() {
/* do nothing - hide constructor */
@@ -69,6 +70,7 @@
window.boundsInScreen.set(other.boundsInScreen);
window.title = other.title;
window.accessibilityIdOfAnchor = other.accessibilityIdOfAnchor;
+ window.inPictureInPicture = other.inPictureInPicture;
if (other.childTokens != null && !other.childTokens.isEmpty()) {
if (window.childTokens == null) {
@@ -101,6 +103,7 @@
boundsInScreen.writeToParcel(parcel, flags);
parcel.writeCharSequence(title);
parcel.writeInt(accessibilityIdOfAnchor);
+ parcel.writeInt(inPictureInPicture ? 1 : 0);
if (childTokens != null && !childTokens.isEmpty()) {
parcel.writeInt(1);
@@ -136,6 +139,7 @@
boundsInScreen.readFromParcel(parcel);
title = parcel.readCharSequence();
accessibilityIdOfAnchor = parcel.readInt();
+ inPictureInPicture = (parcel.readInt() == 1);
final boolean hasChildren = (parcel.readInt() == 1);
if (hasChildren) {
@@ -156,6 +160,7 @@
if (childTokens != null) {
childTokens.clear();
}
+ inPictureInPicture = false;
}
public static final Parcelable.Creator<WindowInfo> CREATOR =
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 828583c..19213ca 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -158,7 +158,7 @@
*/
public AccessibilityNodeInfo getRootInActiveWindow(int connectionId) {
return findAccessibilityNodeInfoByAccessibilityId(connectionId,
- AccessibilityNodeInfo.ACTIVE_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID,
+ AccessibilityWindowInfo.ACTIVE_WINDOW_ID, AccessibilityNodeInfo.ROOT_NODE_ID,
false, AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS, null);
}
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 45302b6..c9f9f31 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -21,6 +21,7 @@
import android.Manifest;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -39,6 +40,8 @@
import android.view.IWindow;
import android.view.View;
+import com.android.internal.util.IntPair;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -108,6 +111,8 @@
boolean mIsEnabled;
+ int mRelevantEventTypes = AccessibilityEvent.TYPES_ALL_MASK;
+
boolean mIsTouchExplorationEnabled;
boolean mIsHighTextContrastEnabled;
@@ -202,6 +207,11 @@
public void notifyServicesStateChanged() {
mHandler.obtainMessage(MyHandler.MSG_NOTIFY_SERVICES_STATE_CHANGED).sendToTarget();
}
+
+ @Override
+ public void setRelevantEventTypes(int eventTypes) {
+ mRelevantEventTypes = eventTypes;
+ }
};
/**
@@ -361,6 +371,14 @@
return;
}
}
+ if ((event.getEventType() & mRelevantEventTypes) == 0) {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "Not dispatching irrelevant event: " + event
+ + " that is not among "
+ + AccessibilityEvent.eventTypeToString(mRelevantEventTypes));
+ }
+ return;
+ }
userId = mUserId;
}
try {
@@ -822,6 +840,31 @@
}
}
+ /**
+ * Set an IAccessibilityInteractionConnection to replace the actions of a picture-in-picture
+ * window. Intended for use by the System UI only.
+ *
+ * @param connection The connection to handle the actions. Set to {@code null} to avoid
+ * affecting the actions.
+ *
+ * @hide
+ */
+ public void setPictureInPictureActionReplacingConnection(
+ @Nullable IAccessibilityInteractionConnection connection) {
+ final IAccessibilityManager service;
+ synchronized (mLock) {
+ service = getServiceLocked();
+ if (service == null) {
+ return;
+ }
+ }
+ try {
+ service.setPictureInPictureActionReplacingConnection(connection);
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error setting picture in picture action replacement", re);
+ }
+ }
+
private IAccessibilityManager getServiceLocked() {
if (mService == null) {
tryConnectToServiceLocked(null);
@@ -839,8 +882,9 @@
}
try {
- final int stateFlags = service.addClient(mClient, mUserId);
- setStateLocked(stateFlags);
+ final long userStateAndRelevantEvents = service.addClient(mClient, mUserId);
+ setStateLocked(IntPair.first(userStateAndRelevantEvents));
+ mRelevantEventTypes = IntPair.second(userStateAndRelevantEvents);
mService = service;
} catch (RemoteException re) {
Log.e(LOG_TAG, "AccessibilityManagerService is dead", re);
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 8094fa6..50f17e0 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -85,17 +85,19 @@
/** @hide */
public static final int UNDEFINED_SELECTION_INDEX = -1;
+ /* Special IDs for node source IDs */
/** @hide */
public static final int UNDEFINED_ITEM_ID = Integer.MAX_VALUE;
/** @hide */
- public static final long ROOT_NODE_ID = makeNodeId(UNDEFINED_ITEM_ID, UNDEFINED_ITEM_ID);
+ public static final int ROOT_ITEM_ID = Integer.MAX_VALUE - 1;
/** @hide */
- public static final int ACTIVE_WINDOW_ID = UNDEFINED_ITEM_ID;
+ public static final long UNDEFINED_NODE_ID = makeNodeId(UNDEFINED_ITEM_ID, UNDEFINED_ITEM_ID);
/** @hide */
- public static final int ANY_WINDOW_ID = -2;
+ public static final long ROOT_NODE_ID = makeNodeId(ROOT_ITEM_ID,
+ AccessibilityNodeProvider.HOST_VIEW_ID);
/** @hide */
public static final int FLAG_PREFETCH_PREDECESSORS = 0x00000001;
@@ -474,6 +476,34 @@
"android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
/**
+ * Argument for specifying the x coordinate to which to move a window.
+ * <p>
+ * <strong>Type:</strong> int<br>
+ * <strong>Actions:</strong>
+ * <ul>
+ * <li>{@link AccessibilityAction#ACTION_MOVE_WINDOW}</li>
+ * </ul>
+ *
+ * @see AccessibilityAction#ACTION_MOVE_WINDOW
+ */
+ public static final String ACTION_ARGUMENT_MOVE_WINDOW_X =
+ "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_X";
+
+ /**
+ * Argument for specifying the y coordinate to which to move a window.
+ * <p>
+ * <strong>Type:</strong> int<br>
+ * <strong>Actions:</strong>
+ * <ul>
+ * <li>{@link AccessibilityAction#ACTION_MOVE_WINDOW}</li>
+ * </ul>
+ *
+ * @see AccessibilityAction#ACTION_MOVE_WINDOW
+ */
+ public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y =
+ "android.view.accessibility.action.ARGUMENT_MOVE_WINDOW_Y";
+
+ /**
* Argument to pass the {@link AccessibilityClickableSpan}.
* For use with R.id.accessibilityActionClickOnClickableSpan
* @hide
@@ -654,13 +684,6 @@
* @hide
*/
public static long makeNodeId(int accessibilityViewId, int virtualDescendantId) {
- // We changed the value for undefined node to positive due to wrong
- // global id composition (two 32-bin ints into one 64-bit long) but
- // the value used for the host node provider view has id -1 so we
- // remap it here.
- if (virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
- virtualDescendantId = UNDEFINED_ITEM_ID;
- }
return (((long) virtualDescendantId) << VIRTUAL_DESCENDANT_ID_SHIFT) | accessibilityViewId;
}
@@ -673,12 +696,12 @@
// Data.
private int mWindowId = UNDEFINED_ITEM_ID;
- private long mSourceNodeId = ROOT_NODE_ID;
- private long mParentNodeId = ROOT_NODE_ID;
- private long mLabelForId = ROOT_NODE_ID;
- private long mLabeledById = ROOT_NODE_ID;
- private long mTraversalBefore = ROOT_NODE_ID;
- private long mTraversalAfter = ROOT_NODE_ID;
+ private long mSourceNodeId = UNDEFINED_NODE_ID;
+ private long mParentNodeId = UNDEFINED_NODE_ID;
+ private long mLabelForId = UNDEFINED_NODE_ID;
+ private long mLabeledById = UNDEFINED_NODE_ID;
+ private long mTraversalBefore = UNDEFINED_NODE_ID;
+ private long mTraversalAfter = UNDEFINED_NODE_ID;
private int mBooleanProperties;
private final Rect mBoundsInParent = new Rect();
@@ -733,7 +756,7 @@
* @param source The info source.
*/
public void setSource(View source) {
- setSource(source, UNDEFINED_ITEM_ID);
+ setSource(source, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -950,7 +973,7 @@
* @throws IllegalStateException If called from an AccessibilityService.
*/
public void addChild(View child) {
- addChildInternal(child, UNDEFINED_ITEM_ID, true);
+ addChildInternal(child, AccessibilityNodeProvider.HOST_VIEW_ID, true);
}
/**
@@ -960,7 +983,7 @@
* @hide
*/
public void addChildUnchecked(View child) {
- addChildInternal(child, UNDEFINED_ITEM_ID, false);
+ addChildInternal(child, AccessibilityNodeProvider.HOST_VIEW_ID, false);
}
/**
@@ -978,7 +1001,7 @@
* @throws IllegalStateException If called from an AccessibilityService.
*/
public boolean removeChild(View child) {
- return removeChild(child, UNDEFINED_ITEM_ID);
+ return removeChild(child, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -1205,6 +1228,17 @@
}
/**
+ * Removes all actions.
+ *
+ * @hide
+ */
+ public void removeAllActions() {
+ if (mActions != null) {
+ mActions.clear();
+ }
+ }
+
+ /**
* Gets the node before which this one is visited during traversal. A screen-reader
* must visit the content of this node before the content of the one it precedes.
*
@@ -1233,7 +1267,7 @@
* @see #getTraversalBefore()
*/
public void setTraversalBefore(View view) {
- setTraversalBefore(view, UNDEFINED_ITEM_ID);
+ setTraversalBefore(view, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -1294,7 +1328,7 @@
* @see #getTraversalAfter()
*/
public void setTraversalAfter(View view) {
- setTraversalAfter(view, UNDEFINED_ITEM_ID);
+ setTraversalAfter(view, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -1572,7 +1606,7 @@
* @throws IllegalStateException If called from an AccessibilityService.
*/
public void setParent(View parent) {
- setParent(parent, UNDEFINED_ITEM_ID);
+ setParent(parent, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -2533,7 +2567,7 @@
* @param labeled The view for which this info serves as a label.
*/
public void setLabelFor(View labeled) {
- setLabelFor(labeled, UNDEFINED_ITEM_ID);
+ setLabelFor(labeled, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -2585,7 +2619,7 @@
* @param label The view that labels this node's source.
*/
public void setLabeledBy(View label) {
- setLabeledBy(label, UNDEFINED_ITEM_ID);
+ setLabeledBy(label, AccessibilityNodeProvider.HOST_VIEW_ID);
}
/**
@@ -2815,6 +2849,20 @@
}
/**
+ * Sets the id of the source node.
+ *
+ * @param sourceId The id.
+ * @param windowId The window id.
+ *
+ * @hide
+ */
+ public void setSourceNodeId(long sourceId, int windowId) {
+ enforceNotSealed();
+ mSourceNodeId = sourceId;
+ mWindowId = windowId;
+ }
+
+ /**
* Gets the id of the source node.
*
* @return The id.
@@ -3299,12 +3347,12 @@
*/
private void clear() {
mSealed = false;
- mSourceNodeId = ROOT_NODE_ID;
- mParentNodeId = ROOT_NODE_ID;
- mLabelForId = ROOT_NODE_ID;
- mLabeledById = ROOT_NODE_ID;
- mTraversalBefore = ROOT_NODE_ID;
- mTraversalAfter = ROOT_NODE_ID;
+ mSourceNodeId = UNDEFINED_NODE_ID;
+ mParentNodeId = UNDEFINED_NODE_ID;
+ mLabelForId = UNDEFINED_NODE_ID;
+ mLabeledById = UNDEFINED_NODE_ID;
+ mTraversalBefore = UNDEFINED_NODE_ID;
+ mTraversalAfter = UNDEFINED_NODE_ID;
mWindowId = UNDEFINED_ITEM_ID;
mConnectionId = UNDEFINED_CONNECTION_ID;
mMaxTextLength = -1;
@@ -3324,9 +3372,7 @@
mError = null;
mContentDescription = null;
mViewIdResourceName = null;
- if (mActions != null) {
- mActions.clear();
- }
+ removeAllActions();
mTextSelectionStart = UNDEFINED_SELECTION_INDEX;
mTextSelectionEnd = UNDEFINED_SELECTION_INDEX;
mInputType = InputType.TYPE_NULL;
@@ -3975,6 +4021,16 @@
public static final AccessibilityAction ACTION_SET_PROGRESS =
new AccessibilityAction(R.id.accessibilityActionSetProgress, null);
+ /**
+ * Action to move a window to a new location.
+ * <p>
+ * <strong>Arguments:</strong>
+ * {@link AccessibilityNodeInfo#ACTION_ARGUMENT_MOVE_WINDOW_X}
+ * {@link AccessibilityNodeInfo#ACTION_ARGUMENT_MOVE_WINDOW_Y}
+ */
+ public static final AccessibilityAction ACTION_MOVE_WINDOW =
+ new AccessibilityAction(R.id.accessibilityActionMoveWindow, null);
+
private static final ArraySet<AccessibilityAction> sStandardActions = new ArraySet<>();
static {
sStandardActions.add(ACTION_FOCUS);
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index f2979bb..3f1fece 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -91,7 +91,7 @@
int mAddedCount= UNDEFINED;
int mRemovedCount = UNDEFINED;
AccessibilityNodeInfo mSourceNode;
- int mSourceWindowId = UNDEFINED;
+ int mSourceWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
CharSequence mClassName;
CharSequence mContentDescription;
@@ -136,11 +136,12 @@
public void setSource(View root, int virtualDescendantId) {
enforceNotSealed();
boolean important = true;
- mSourceWindowId = UNDEFINED;
+ mSourceWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
clearSourceNode();
if (root != null) {
- if (virtualDescendantId == UNDEFINED ||
- virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ if (virtualDescendantId == View.NO_ID
+ || virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID
+ || virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID) {
important = root.isImportantForAccessibility();
mSourceNode = root.createAccessibilityNodeInfo();
} else {
@@ -156,6 +157,25 @@
}
/**
+ * Set the source directly to an AccessibilityNodeInfo rather than indirectly via a View
+ *
+ * @param info The source
+ *
+ * @hide
+ */
+ public void setSource(AccessibilityNodeInfo info) {
+ enforceNotSealed();
+ clearSourceNode();
+ mSourceWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
+ if (info != null) {
+ mSourceNode = AccessibilityNodeInfo.obtain(info);
+ setBooleanProperty(PROPERTY_IMPORTANT_FOR_ACCESSIBILITY,
+ mSourceNode.isImportantForAccessibility());
+ mSourceWindowId = info.getWindowId();
+ }
+ }
+
+ /**
* Gets the {@link AccessibilityNodeInfo} of the event source.
* <p>
* <strong>Note:</strong> It is a client responsibility to recycle the received info
@@ -833,6 +853,7 @@
mSourceNode.recycle();
mSourceNode = null;
}
+
}
@Override
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index c390406..2a7537b 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -74,7 +74,15 @@
*/
public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5;
- private static final int UNDEFINED = -1;
+ /* Special values for window IDs */
+ /** @hide */
+ public static final int ACTIVE_WINDOW_ID = Integer.MAX_VALUE;
+ /** @hide */
+ public static final int UNDEFINED_WINDOW_ID = -1;
+ /** @hide */
+ public static final int ANY_WINDOW_ID = -2;
+ /** @hide */
+ public static final int PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID = -3;
private static final int BOOLEAN_PROPERTY_ACTIVE = 1 << 0;
private static final int BOOLEAN_PROPERTY_FOCUSED = 1 << 1;
@@ -87,17 +95,18 @@
private static AtomicInteger sNumInstancesInUse;
// Data.
- private int mType = UNDEFINED;
- private int mLayer = UNDEFINED;
+ private int mType = UNDEFINED_WINDOW_ID;
+ private int mLayer = UNDEFINED_WINDOW_ID;
private int mBooleanProperties;
- private int mId = UNDEFINED;
- private int mParentId = UNDEFINED;
+ private int mId = UNDEFINED_WINDOW_ID;
+ private int mParentId = UNDEFINED_WINDOW_ID;
private final Rect mBoundsInScreen = new Rect();
private LongArray mChildIds;
private CharSequence mTitle;
- private int mAnchorId = UNDEFINED;
+ private int mAnchorId = UNDEFINED_WINDOW_ID;
+ private boolean mInPictureInPicture;
- private int mConnectionId = UNDEFINED;
+ private int mConnectionId = UNDEFINED_WINDOW_ID;
private AccessibilityWindowInfo() {
/* do nothing - hide constructor */
@@ -177,7 +186,7 @@
* @return The root node.
*/
public AccessibilityNodeInfo getRoot() {
- if (mConnectionId == UNDEFINED) {
+ if (mConnectionId == UNDEFINED_WINDOW_ID) {
return null;
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
@@ -203,7 +212,8 @@
* @return The anchor node, or {@code null} if none exists.
*/
public AccessibilityNodeInfo getAnchor() {
- if ((mConnectionId == UNDEFINED) || (mAnchorId == UNDEFINED) || (mParentId == UNDEFINED)) {
+ if ((mConnectionId == UNDEFINED_WINDOW_ID) || (mAnchorId == UNDEFINED_WINDOW_ID)
+ || (mParentId == UNDEFINED_WINDOW_ID)) {
return null;
}
@@ -212,13 +222,27 @@
mParentId, mAnchorId, true, 0, null);
}
+ /** @hide */
+ public void setPictureInPicture(boolean pictureInPicture) {
+ mInPictureInPicture = pictureInPicture;
+ }
+
+ /**
+ * Check if the window is in picture-in-picture mode.
+ *
+ * @return {@code true} if the window is in picture-in-picture mode, {@code false} otherwise.
+ */
+ public boolean inPictureInPicture() {
+ return mInPictureInPicture;
+ }
+
/**
* Gets the parent window.
*
* @return The parent window, or {@code null} if none exists.
*/
public AccessibilityWindowInfo getParent() {
- if (mConnectionId == UNDEFINED || mParentId == UNDEFINED) {
+ if (mConnectionId == UNDEFINED_WINDOW_ID || mParentId == UNDEFINED_WINDOW_ID) {
return null;
}
AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
@@ -371,7 +395,7 @@
if (mChildIds == null) {
throw new IndexOutOfBoundsException();
}
- if (mConnectionId == UNDEFINED) {
+ if (mConnectionId == UNDEFINED_WINDOW_ID) {
return null;
}
final int childId = (int) mChildIds.get(index);
@@ -429,6 +453,7 @@
infoClone.mBoundsInScreen.set(info.mBoundsInScreen);
infoClone.mTitle = info.mTitle;
infoClone.mAnchorId = info.mAnchorId;
+ infoClone.mInPictureInPicture = info.mInPictureInPicture;
if (info.mChildIds != null && info.mChildIds.size() > 0) {
if (infoClone.mChildIds == null) {
@@ -486,6 +511,7 @@
mBoundsInScreen.writeToParcel(parcel, flags);
parcel.writeCharSequence(mTitle);
parcel.writeInt(mAnchorId);
+ parcel.writeInt(mInPictureInPicture ? 1 : 0);
final LongArray childIds = mChildIds;
if (childIds == null) {
@@ -510,6 +536,7 @@
mBoundsInScreen.readFromParcel(parcel);
mTitle = parcel.readCharSequence();
mAnchorId = parcel.readInt();
+ mInPictureInPicture = parcel.readInt() == 1;
final int childCount = parcel.readInt();
if (childCount > 0) {
@@ -556,6 +583,7 @@
builder.append(", bounds=").append(mBoundsInScreen);
builder.append(", focused=").append(isFocused());
builder.append(", active=").append(isActive());
+ builder.append(", pictureInPicture=").append(inPictureInPicture());
if (DEBUG) {
builder.append(", parent=").append(mParentId);
builder.append(", children=[");
@@ -572,8 +600,8 @@
}
builder.append(']');
} else {
- builder.append(", hasParent=").append(mParentId != UNDEFINED);
- builder.append(", isAnchored=").append(mAnchorId != UNDEFINED);
+ builder.append(", hasParent=").append(mParentId != UNDEFINED_WINDOW_ID);
+ builder.append(", isAnchored=").append(mAnchorId != UNDEFINED_WINDOW_ID);
builder.append(", hasChildren=").append(mChildIds != null
&& mChildIds.size() > 0);
}
@@ -585,17 +613,18 @@
* Clears the internal state.
*/
private void clear() {
- mType = UNDEFINED;
- mLayer = UNDEFINED;
+ mType = UNDEFINED_WINDOW_ID;
+ mLayer = UNDEFINED_WINDOW_ID;
mBooleanProperties = 0;
- mId = UNDEFINED;
- mParentId = UNDEFINED;
+ mId = UNDEFINED_WINDOW_ID;
+ mParentId = UNDEFINED_WINDOW_ID;
mBoundsInScreen.setEmpty();
if (mChildIds != null) {
mChildIds.clear();
}
- mConnectionId = UNDEFINED;
- mAnchorId = UNDEFINED;
+ mConnectionId = UNDEFINED_WINDOW_ID;
+ mAnchorId = UNDEFINED_WINDOW_ID;
+ mInPictureInPicture = false;
mTitle = null;
}
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index 8fde47a..06cb5dc 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -38,17 +38,20 @@
oneway void sendAccessibilityEvent(in AccessibilityEvent uiEvent, int userId);
- int addClient(IAccessibilityManagerClient client, int userId);
+ long addClient(IAccessibilityManagerClient client, int userId);
List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType, int userId);
int addAccessibilityInteractionConnection(IWindow windowToken,
- in IAccessibilityInteractionConnection connection, int userId);
+ in IAccessibilityInteractionConnection connection, int userId);
void removeAccessibilityInteractionConnection(IWindow windowToken);
+ void setPictureInPictureActionReplacingConnection(
+ in IAccessibilityInteractionConnection connection);
+
void registerUiTestAutomationService(IBinder owner, IAccessibilityServiceClient client,
in AccessibilityServiceInfo info, int flags);
diff --git a/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl b/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl
index 045ac91..9cc0315 100644
--- a/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManagerClient.aidl
@@ -25,5 +25,8 @@
oneway interface IAccessibilityManagerClient {
void setState(int stateFlags);
+
void notifyServicesStateChanged();
+
+ void setRelevantEventTypes(int eventTypes);
}
diff --git a/core/java/android/view/autofill/AutoFillId.aidl b/core/java/android/view/autofill/AutoFillId.aidl
index 56f0338..fc57ce7 100644
--- a/core/java/android/view/autofill/AutoFillId.aidl
+++ b/core/java/android/view/autofill/AutoFillId.aidl
@@ -16,4 +16,5 @@
package android.view.autofill;
+// @deprecated TODO(b/35956626): remove once clients use AutofillId
parcelable AutoFillId;
\ No newline at end of file
diff --git a/core/java/android/view/autofill/AutoFillId.java b/core/java/android/view/autofill/AutoFillId.java
index 38dc404..081fb02 100644
--- a/core/java/android/view/autofill/AutoFillId.java
+++ b/core/java/android/view/autofill/AutoFillId.java
@@ -15,67 +15,26 @@
*/
package android.view.autofill;
-import static android.view.autofill.Helper.DEBUG;
-
import android.os.Parcel;
import android.os.Parcelable;
/**
- * A unique identifier for an auto-fill node inside an {@link android.app.Activity}.
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use getAutoFilltype
*/
+@Deprecated
public final class AutoFillId implements Parcelable {
- private int mViewId;
- private boolean mVirtual;
- private int mVirtualId;
-
- // TODO(b/33197203): use factory and cache values, since they're immutable
- /** @hide */
- public AutoFillId(int id) {
- mVirtual = false;
- mViewId = id;
- }
+ private final AutofillId mRealId;
/** @hide */
- public AutoFillId(AutoFillId parent, int virtualChildId) {
- mVirtual = true;
- mViewId = parent.mViewId;
- mVirtualId = virtualChildId;
+ public AutoFillId(AutofillId daRealId) {
+ this.mRealId = daRealId;
}
- /** @hide */
- public AutoFillId(int parentId, int virtualChildId) {
- mVirtual = true;
- mViewId = parentId;
- mVirtualId = virtualChildId;
- }
-
- /** @hide */
- public int getViewId() {
- return mViewId;
- }
-
- /** @hide */
- public int getVirtualChildId() {
- return mVirtualId;
- }
-
- /** @hide */
- public boolean isVirtual() {
- return mVirtual;
- }
-
- /////////////////////////////////
- // Object "contract" methods. //
- /////////////////////////////////
-
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + mViewId;
- result = prime * result + mVirtualId;
- return result;
+ return mRealId.hashCode();
}
@Override
@@ -84,20 +43,7 @@
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final AutoFillId other = (AutoFillId) obj;
- if (mViewId != other.mViewId) return false;
- if (mVirtualId != other.mVirtualId) return false;
- return true;
- }
-
- @Override
- public String toString() {
- if (!DEBUG) return super.toString();
-
- final StringBuilder builder = new StringBuilder().append(mViewId);
- if (mVirtual) {
- builder.append(":").append(mVirtualId);
- }
- return builder.toString();
+ return mRealId.equals(other.mRealId);
}
@Override
@@ -107,15 +53,21 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeInt(mViewId);
- parcel.writeInt(mVirtual ? 1 : 0);
- parcel.writeInt(mVirtualId);
+ parcel.writeParcelable(mRealId, 0);
}
private AutoFillId(Parcel parcel) {
- mViewId = parcel.readInt();
- mVirtual = parcel.readInt() == 1;
- mVirtualId = parcel.readInt();
+ mRealId = parcel.readParcelable(null);
+ }
+
+ /** @hide */
+ public AutofillId getDaRealId() {
+ return mRealId;
+ }
+
+ /** @hide */
+ public static AutoFillId forDaRealId(AutofillId id) {
+ return id == null ? null : new AutoFillId(id);
}
public static final Parcelable.Creator<AutoFillId> CREATOR =
diff --git a/core/java/android/view/autofill/AutoFillType.java b/core/java/android/view/autofill/AutoFillType.java
index 37966b2..c508ba4 100644
--- a/core/java/android/view/autofill/AutoFillType.java
+++ b/core/java/android/view/autofill/AutoFillType.java
@@ -23,16 +23,18 @@
import android.view.View;
/**
- * Defines the type of a object that can be used to auto-fill a {@link View} so the
- * {@link android.service.autofill.AutoFillService} can use the proper {@link AutoFillValue} to
+ * Defines the type of a object that can be used to autofill a {@link View} so the
+ * {@link android.service.autofill.AutofillService} can use the proper {@link AutofillValue} to
* fill it.
*
- * TODO(b/35956626): remove once clients use getAutoFilltype
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use getAutoFilltype
*/
+@Deprecated
public final class AutoFillType implements Parcelable {
// Cached instance for types that don't have subtype; it uses the "lazy initialization holder
- // class idiom" (Effective Java, Item 71) to avoid memory utilization when auto-fill is not
+ // class idiom" (Effective Java, Item 71) to avoid memory utilization when autofill is not
// enabled.
private static class DefaultTypesHolder {
static final AutoFillType TEXT = new AutoFillType(TYPE_TEXT);
@@ -54,10 +56,6 @@
/**
* Checks if this is a type for a text field, which is filled by a {@link CharSequence}.
- *
- * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
- * {@link AutoFillValue#forText(CharSequence)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getTextValue()}.
*/
public boolean isText() {
return mType == TYPE_TEXT;
@@ -65,10 +63,6 @@
/**
* Checks if this is a a type for a togglable field, which is filled by a {@code boolean}.
- *
- * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
- * {@link AutoFillValue#forToggle(boolean)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getToggleValue()}.
*/
public boolean isToggle() {
return mType == TYPE_TOGGLE;
@@ -77,14 +71,7 @@
/**
* Checks if this is a type for a selection list field, which is filled by a {@code integer}
* representing the element index inside the list (starting at {@code 0}.
- *
- * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
- * {@link AutoFillValue#forList(int)}, and the value passed to auto-fill a
- * {@link View} can be fetched through {@link AutoFillValue#getListValue()}.
- *
- * <p>The available options in the selection list are typically provided by
- * {@link android.app.assist.AssistStructure.ViewNode#getAutoFillOptions()}.
- */
+ */
public boolean isList() {
return mType == TYPE_LIST;
}
@@ -93,10 +80,6 @@
* Checks if this is a type for a date and time, which is represented by a long representing
* the number of milliseconds since the standard base time known as "the epoch", namely
* January 1, 1970, 00:00:00 GMT (see {@link java.util.Date#getTime()}.
- *
- * <p>{@link AutoFillValue} instances for auto-filling a {@link View} can be obtained through
- * {@link AutoFillValue#forDate(long)}, and the values passed to
- * auto-fill a {@link View} can be fetched through {@link AutoFillValue#getDateValue()}.
*/
public boolean isDate() {
return mType == TYPE_DATE;
diff --git a/core/java/android/view/autofill/AutoFillValue.aidl b/core/java/android/view/autofill/AutoFillValue.aidl
index 3b284b9..05b7562 100644
--- a/core/java/android/view/autofill/AutoFillValue.aidl
+++ b/core/java/android/view/autofill/AutoFillValue.aidl
@@ -16,4 +16,5 @@
package android.view.autofill;
+// @deprecated TODO(b/35956626): remove once clients use AutofillValue
parcelable AutoFillValue;
\ No newline at end of file
diff --git a/core/java/android/view/autofill/AutoFillValue.java b/core/java/android/view/autofill/AutoFillValue.java
index 11fab68..5dd17f1 100644
--- a/core/java/android/view/autofill/AutoFillValue.java
+++ b/core/java/android/view/autofill/AutoFillValue.java
@@ -24,24 +24,15 @@
import android.view.View;
/**
- * Abstracts how a {@link View} can be auto-filled by an
- * {@link android.service.autofill.AutoFillService}.
- *
- * <p>Each {@link AutoFillValue} has a {@code type} and optionally a {@code sub-type}: the
- * {@code type} defines the view's UI control category (like a text field), while the optional
- * {@code sub-type} define its semantics (like a postal address).
+ * @hide
+ * @deprecated TODO(b/35956626): remove once clients use AutofillValue
*/
+@Deprecated
public final class AutoFillValue implements Parcelable {
- private final String mText;
- private final int mListIndex;
- private final boolean mToggle;
- private final long mDate;
+ private final AutofillValue mRealValue;
- private AutoFillValue(CharSequence text, int listIndex, boolean toggle, long date) {
- mText = (text == null) ? null : text.toString();
- mListIndex = listIndex;
- mToggle = toggle;
- mDate = date;
+ private AutoFillValue(AutofillValue daRealValue) {
+ this.mRealValue = daRealValue;
}
/**
@@ -50,7 +41,7 @@
* <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
*/
public CharSequence getTextValue() {
- return mText;
+ return mRealValue.getTextValue();
}
/**
@@ -59,7 +50,7 @@
* <p>See {@link View#AUTOFILL_TYPE_TOGGLE} for more info.
*/
public boolean getToggleValue() {
- return mToggle;
+ return mRealValue.getToggleValue();
}
/**
@@ -68,7 +59,7 @@
* <p>See {@link View#AUTOFILL_TYPE_LIST} for more info.
*/
public int getListValue() {
- return mListIndex;
+ return mRealValue.getListValue();
}
/**
@@ -77,7 +68,7 @@
* <p>See {@link View#AUTOFILL_TYPE_DATE} for more info.
*/
public long getDateValue() {
- return mDate;
+ return mRealValue.getDateValue();
}
/////////////////////////////////////
@@ -86,13 +77,7 @@
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mText == null) ? 0 : mText.hashCode());
- result = prime * result + mListIndex;
- result = prime * result + (mToggle ? 1231 : 1237);
- result = prime * result + (int) (mDate ^ (mDate >>> 32));
- return result;
+ return mRealValue.hashCode();
}
@Override
@@ -101,32 +86,19 @@
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final AutoFillValue other = (AutoFillValue) obj;
- if (mText == null) {
- if (other.mText != null) return false;
- } else {
- if (!mText.equals(other.mText)) return false;
- }
- if (mListIndex != other.mListIndex) return false;
- if (mToggle != other.mToggle) return false;
- if (mDate != other.mDate) return false;
- return true;
+ return mRealValue.equals(other.mRealValue);
}
/** @hide */
public String coerceToString() {
- // TODO(b/33197203): How can we filter on toggles or list values?
- return mText;
+ return mRealValue.coerceToString();
}
@Override
public String toString() {
if (!DEBUG) return super.toString();
- if (mText != null) {
- return mText.length() + "_chars";
- }
-
- return "[l=" + mListIndex + ", t=" + mToggle + ", d=" + mDate + "]";
+ return mRealValue.toString();
}
/////////////////////////////////////
@@ -140,17 +112,11 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeString(mText);
- parcel.writeInt(mListIndex);
- parcel.writeInt(mToggle ? 1 : 0);
- parcel.writeLong(mDate);
+ parcel.writeParcelable(mRealValue, 0);
}
private AutoFillValue(Parcel parcel) {
- mText = parcel.readString();
- mListIndex = parcel.readInt();
- mToggle = parcel.readInt() == 1;
- mDate = parcel.readLong();
+ mRealValue = parcel.readParcelable(null);
}
public static final Parcelable.Creator<AutoFillValue> CREATOR =
@@ -169,17 +135,14 @@
////////////////////
// Factory methods //
////////////////////
-
- // TODO(b/33197203): add unit tests for each supported type (new / get should return same value)
/**
* Creates a new {@link AutoFillValue} to autofill a {@link View} representing a text field.
*
* <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
*/
- // TODO(b/33197203): use cache
@Nullable
public static AutoFillValue forText(@Nullable CharSequence value) {
- return value == null ? null : new AutoFillValue(value, 0, false, 0);
+ return value == null ? null : new AutoFillValue(AutofillValue.forText(value));
}
/**
@@ -189,7 +152,7 @@
* <p>See {@link View#AUTOFILL_TYPE_TOGGLE} for more info.
*/
public static AutoFillValue forToggle(boolean value) {
- return new AutoFillValue(null, 0, value, 0);
+ return new AutoFillValue(AutofillValue.forToggle(value));
}
/**
@@ -199,7 +162,7 @@
* <p>See {@link View#AUTOFILL_TYPE_LIST} for more info.
*/
public static AutoFillValue forList(int value) {
- return new AutoFillValue(null, value, false, 0);
+ return new AutoFillValue(AutofillValue.forList(value));
}
/**
@@ -208,6 +171,16 @@
* <p>See {@link View#AUTOFILL_TYPE_DATE} for more info.
*/
public static AutoFillValue forDate(long date) {
- return new AutoFillValue(null, 0, false, date);
+ return new AutoFillValue(AutofillValue.forDate(date));
+ }
+
+ /** @hide */
+ public static AutoFillValue forDaRealValue(AutofillValue daRealValue) {
+ return new AutoFillValue(daRealValue);
+ }
+
+ /** @hide */
+ public AutofillValue getDaRealValue() {
+ return mRealValue;
}
}
diff --git a/core/java/android/view/autofill/AutofillId.aidl b/core/java/android/view/autofill/AutofillId.aidl
new file mode 100644
index 0000000..7ac3d5b
--- /dev/null
+++ b/core/java/android/view/autofill/AutofillId.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable AutofillId;
\ No newline at end of file
diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java
new file mode 100644
index 0000000..d678015
--- /dev/null
+++ b/core/java/android/view/autofill/AutofillId.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View;
+
+/**
+ * A unique identifier for an autofill node inside an {@link android.app.Activity}.
+ */
+public final class AutofillId implements Parcelable {
+
+ private final int mViewId;
+ private final boolean mVirtual;
+ private final int mVirtualId;
+
+ // TODO(b/33197203): use factory and cache values, since they're immutable
+ /** @hide */
+ public AutofillId(int id) {
+ mVirtual = false;
+ mViewId = id;
+ mVirtualId = View.NO_ID;
+ }
+
+ /** @hide */
+ public AutofillId(AutofillId parent, int virtualChildId) {
+ mVirtual = true;
+ mViewId = parent.mViewId;
+ mVirtualId = virtualChildId;
+ }
+
+ /** @hide */
+ public AutofillId(int parentId, int virtualChildId) {
+ mVirtual = true;
+ mViewId = parentId;
+ mVirtualId = virtualChildId;
+ }
+
+ /** @hide */
+ public int getViewId() {
+ return mViewId;
+ }
+
+ /** @hide */
+ public int getVirtualChildId() {
+ return mVirtualId;
+ }
+
+ /** @hide */
+ public boolean isVirtual() {
+ return mVirtual;
+ }
+
+ /////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + mViewId;
+ result = prime * result + mVirtualId;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AutofillId other = (AutofillId) obj;
+ if (mViewId != other.mViewId) return false;
+ if (mVirtualId != other.mVirtualId) return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ final StringBuilder builder = new StringBuilder().append(mViewId);
+ if (mVirtual) {
+ builder.append(":").append(mVirtualId);
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mViewId);
+ parcel.writeInt(mVirtual ? 1 : 0);
+ parcel.writeInt(mVirtualId);
+ }
+
+ private AutofillId(Parcel parcel) {
+ mViewId = parcel.readInt();
+ mVirtual = parcel.readInt() == 1;
+ mVirtualId = parcel.readInt();
+ }
+
+ public static final Parcelable.Creator<AutofillId> CREATOR =
+ new Parcelable.Creator<AutofillId>() {
+ @Override
+ public AutofillId createFromParcel(Parcel source) {
+ return new AutofillId(source);
+ }
+
+ @Override
+ public AutofillId[] newArray(int size) {
+ return new AutofillId[size];
+ }
+ };
+}
diff --git a/core/java/android/view/autofill/AutoFillManager.java b/core/java/android/view/autofill/AutofillManager.java
similarity index 70%
rename from core/java/android/view/autofill/AutoFillManager.java
rename to core/java/android/view/autofill/AutofillManager.java
index 8beaf4e..c4f90dc 100644
--- a/core/java/android/view/autofill/AutoFillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -44,9 +44,9 @@
*/
// TODO(b/33197203): improve this javadoc
//TODO(b/33197203): restrict manager calls to activity
-public final class AutoFillManager {
+public final class AutofillManager {
- private static final String TAG = "AutoFillManager";
+ private static final String TAG = "AutofillManager";
/**
* Intent extra: The assist structure which captures the filled screen.
@@ -72,8 +72,8 @@
"android.view.autofill.extra.AUTHENTICATION_RESULT";
/** @hide */ public static final int FLAG_START_SESSION = 0x1;
- /** @hide */ public static final int FLAG_FOCUS_GAINED = 0x2;
- /** @hide */ public static final int FLAG_FOCUS_LOST = 0x4;
+ /** @hide */ public static final int FLAG_VIEW_ENTERED = 0x2;
+ /** @hide */ public static final int FLAG_VIEW_EXITED = 0x4;
/** @hide */ public static final int FLAG_VALUE_CHANGED = 0x8;
private final Rect mTempRect = new Rect();
@@ -89,14 +89,14 @@
private boolean mEnabled;
/** @hide */
- public interface AutoFillClient {
+ public interface AutofillClient {
/**
- * Asks the client to perform an auto-fill.
+ * Asks the client to perform an autofill.
*
- * @param ids The values to auto-fill
- * @param values The values to auto-fill
+ * @param ids The values to autofill
+ * @param values The values to autofill
*/
- void autoFill(List<AutoFillId> ids, List<AutoFillValue> values);
+ void autofill(List<AutofillId> ids, List<AutofillValue> values);
/**
* Asks the client to start an authentication flow.
@@ -115,17 +115,17 @@
/**
* @hide
*/
- public AutoFillManager(Context context, IAutoFillManager service) {
+ public AutofillManager(Context context, IAutoFillManager service) {
mContext = context;
mService = service;
}
/**
- * Called when an auto-fill operation on a {@link View} should start.
+ * Called when a {@link View} that supports autofill is entered.
*
- * @param view {@link View} that triggered the auto-fill request.
+ * @param view {@link View} that was entered.
*/
- public void startAutoFillRequest(@NonNull View view) {
+ public void notifyViewEntered(@NonNull View view) {
ensureServiceClientAddedIfNeeded();
if (!mEnabled) {
@@ -134,43 +134,42 @@
final Rect bounds = mTempRect;
view.getBoundsOnScreen(bounds);
- final AutoFillId id = getAutoFillId(view);
- final AutoFillValue value = view.getAutoFillValue();
+ final AutofillId id = getAutofillId(view);
+ final AutofillValue value = view.getAutofillValue();
if (!mHasSession) {
// Starts new session.
startSession(id, view.getWindowToken(), bounds, value);
} else {
// Update focus on existing session.
- updateSession(id, bounds, value, FLAG_FOCUS_GAINED);
+ updateSession(id, bounds, value, FLAG_VIEW_ENTERED);
}
}
/**
- * Called when an auto-fill operation on a {@link View} should stop.
+ * Called when a {@link View} that supports autofill is exited.
*
- * @param view {@link View} that triggered the auto-fill request in
- * {@link #startAutoFillRequest(View)}.
+ * @param view {@link View} that was exited.
*/
- public void stopAutoFillRequest(@NonNull View view) {
+ public void notifyViewExited(@NonNull View view) {
ensureServiceClientAddedIfNeeded();
if (mEnabled && mHasSession) {
- final AutoFillId id = getAutoFillId(view);
+ final AutofillId id = getAutofillId(view);
// Update focus on existing session.
- updateSession(id, null, null, FLAG_FOCUS_LOST);
+ updateSession(id, null, null, FLAG_VIEW_EXITED);
}
}
/**
- * Called when an auto-fill operation on a virtual {@link View} should start.
+ * Called when a virtual view that supports autofill is entered.
*
- * @param parent parent of the {@link View} that triggered the auto-fill request.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param view the {@link View} whose descendant is the virtual view.
+ * @param childId id identifying the virtual child inside the view.
* @param bounds child boundaries, relative to the top window.
*/
- public void startAutoFillRequestOnVirtualView(@NonNull View parent, int childId,
+ public void notifyVirtualViewEntered(@NonNull View view, int childId,
@NonNull Rect bounds) {
ensureServiceClientAddedIfNeeded();
@@ -178,74 +177,73 @@
return;
}
- final AutoFillId id = getAutoFillId(parent, childId);
+ final AutofillId id = getAutofillId(view, childId);
if (!mHasSession) {
// Starts new session.
- startSession(id, parent.getWindowToken(), bounds, null);
+ startSession(id, view.getWindowToken(), bounds, null);
} else {
// Update focus on existing session.
- updateSession(id, bounds, null, FLAG_FOCUS_GAINED);
+ updateSession(id, bounds, null, FLAG_VIEW_ENTERED);
}
}
/**
- * Called when an auto-fill operation on a virtual {@link View} should stop.
+ * Called when a virtual view that supports autofill is exited.
*
- * @param parent parent of the {@link View} that triggered the auto-fill request in
- * {@link #startAutoFillRequestOnVirtualView(View, int, Rect)}.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param view the {@link View} whose descendant is the virtual view.
+ * @param childId id identifying the virtual child inside the view.
*/
- public void stopAutoFillRequestOnVirtualView(@NonNull View parent, int childId) {
+ public void notifyVirtualViewExited(@NonNull View view, int childId) {
ensureServiceClientAddedIfNeeded();
if (mEnabled && mHasSession) {
- final AutoFillId id = getAutoFillId(parent, childId);
+ final AutofillId id = getAutofillId(view, childId);
// Update focus on existing session.
- updateSession(id, null, null, FLAG_FOCUS_LOST);
+ updateSession(id, null, null, FLAG_VIEW_EXITED);
}
}
/**
- * Called to indicate the value of an auto-fillable {@link View} changed.
+ * Called to indicate the value of an autofillable {@link View} changed.
*
* @param view view whose value changed.
*/
- public void valueChanged(View view) {
+ public void notifyValueChanged(View view) {
if (!mEnabled || !mHasSession) {
return;
}
- final AutoFillId id = getAutoFillId(view);
- final AutoFillValue value = view.getAutoFillValue();
+ final AutofillId id = getAutofillId(view);
+ final AutofillValue value = view.getAutofillValue();
updateSession(id, null, value, FLAG_VALUE_CHANGED);
}
/**
- * Called to indicate the value of an auto-fillable virtual {@link View} changed.
+ * Called to indicate the value of an autofillable virtual {@link View} changed.
*
* @param parent parent view whose value changed.
* @param childId id identifying the virtual child inside the parent view.
* @param value new value of the child.
*/
- public void virtualValueChanged(View parent, int childId, AutoFillValue value) {
+ public void notifyVirtualValueChanged(View parent, int childId, AutofillValue value) {
if (!mEnabled || !mHasSession) {
return;
}
- final AutoFillId id = getAutoFillId(parent, childId);
+ final AutofillId id = getAutofillId(parent, childId);
updateSession(id, null, value, FLAG_VALUE_CHANGED);
}
/**
- * Called to indicate the current auto-fill context should be reset.
+ * Called to indicate the current autofill context should be commited.
*
* <p>For example, when a virtual view is rendering an {@code HTML} page with a form, it should
* call this method after the form is submitted and another page is rendered.
*/
- public void reset() {
+ public void commit() {
if (!mEnabled && !mHasSession) {
return;
}
@@ -253,9 +251,23 @@
finishSession();
}
- private AutoFillClient getClient() {
- if (mContext instanceof AutoFillClient) {
- return (AutoFillClient) mContext;
+ /**
+ * Called to indicate the current autofill context should be cancelled.
+ *
+ * <p>For example, when a virtual view is rendering an {@code HTML} page with a form, it should
+ * call this method if the user does not post the form but moves to another form in this page.
+ */
+ public void cancel() {
+ if (!mEnabled && !mHasSession) {
+ return;
+ }
+
+ cancelSession();
+ }
+
+ private AutofillClient getClient() {
+ if (mContext instanceof AutofillClient) {
+ return (AutofillClient) mContext;
}
return null;
}
@@ -283,16 +295,17 @@
}
}
- private static AutoFillId getAutoFillId(View view) {
- return new AutoFillId(view.getAccessibilityViewId());
+
+ private static AutofillId getAutofillId(View view) {
+ return new AutofillId(view.getAccessibilityViewId());
}
- private static AutoFillId getAutoFillId(View parent, int childId) {
- return new AutoFillId(parent.getAccessibilityViewId(), childId);
+ private static AutofillId getAutofillId(View parent, int childId) {
+ return new AutofillId(parent.getAccessibilityViewId(), childId);
}
- private void startSession(AutoFillId id, IBinder windowToken,
- Rect bounds, AutoFillValue value) {
+ private void startSession(AutofillId id, IBinder windowToken, Rect bounds,
+ AutofillValue value) {
if (DEBUG) {
Log.d(TAG, "startSession(): id=" + id + ", bounds=" + bounds + ", value=" + value);
}
@@ -301,7 +314,7 @@
mService.startSession(mContext.getActivityToken(), windowToken,
mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(),
mCallback != null);
- final AutoFillClient client = getClient();
+ final AutofillClient client = getClient();
if (client != null) {
client.resetableStateAvailable();
}
@@ -323,11 +336,23 @@
}
}
- private void updateSession(AutoFillId id, Rect bounds, AutoFillValue value, int flags) {
+ private void cancelSession() {
if (DEBUG) {
- if (VERBOSE || (flags & FLAG_FOCUS_LOST) != 0) {
+ Log.d(TAG, "cancelSession()");
+ }
+ mHasSession = false;
+ try {
+ mService.cancelSession(mContext.getActivityToken(), mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ private void updateSession(AutofillId id, Rect bounds, AutofillValue value, int flags) {
+ if (DEBUG) {
+ if (VERBOSE || (flags & FLAG_VIEW_EXITED) != 0) {
Log.d(TAG, "updateSession(): id=" + id + ", bounds=" + bounds + ", value=" + value
- + ", flags=" + flags);
+ + ", flags=" + flags);
}
}
@@ -344,7 +369,7 @@
return;
}
if (mServiceClient == null) {
- mServiceClient = new AutoFillManagerClient(this);
+ mServiceClient = new AutofillManagerClient(this);
try {
mEnabled = mService.addClient(mServiceClient, mContext.getUserId());
} catch (RemoteException e) {
@@ -392,7 +417,7 @@
}
}
- private void onAutofillEvent(IBinder windowToken, AutoFillId id, int event) {
+ private void onAutofillEvent(IBinder windowToken, AutofillId id, int event) {
if (mCallback == null) return;
if (id == null) {
Log.w(TAG, "onAutofillEvent(): no id for event " + event);
@@ -466,31 +491,30 @@
@AutofillEventType int event) {}
}
- private static final class AutoFillManagerClient extends IAutoFillManagerClient.Stub {
- private final WeakReference<AutoFillManager> mAutoFillManager;
+ private static final class AutofillManagerClient extends IAutoFillManagerClient.Stub {
+ private final WeakReference<AutofillManager> mAfm;
- AutoFillManagerClient(AutoFillManager autoFillManager) {
- mAutoFillManager = new WeakReference<>(autoFillManager);
+ AutofillManagerClient(AutofillManager autofillManager) {
+ mAfm = new WeakReference<>(autofillManager);
}
@Override
public void setState(boolean enabled) {
- final AutoFillManager autoFillManager = mAutoFillManager.get();
- if (autoFillManager != null) {
- autoFillManager.mContext.getMainThreadHandler().post(() ->
- autoFillManager.mEnabled = enabled);
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.mContext.getMainThreadHandler().post(() -> afm.mEnabled = enabled);
}
}
@Override
- public void autoFill(List<AutoFillId> ids, List<AutoFillValue> values) {
+ public void autofill(List<AutofillId> ids, List<AutofillValue> values) {
// TODO(b/33197203): must keep the dataset so subsequent calls pass the same
// dataset.extras to service
- final AutoFillManager autoFillManager = mAutoFillManager.get();
- if (autoFillManager != null) {
- autoFillManager.mContext.getMainThreadHandler().post(() -> {
- if (autoFillManager.getClient() != null) {
- autoFillManager.getClient().autoFill(ids, values);
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.mContext.getMainThreadHandler().post(() -> {
+ if (afm.getClient() != null) {
+ afm.getClient().autofill(ids, values);
}
});
}
@@ -498,23 +522,23 @@
@Override
public void authenticate(IntentSender intent, Intent fillInIntent) {
- final AutoFillManager autoFillManager = mAutoFillManager.get();
- if (autoFillManager != null) {
- autoFillManager.mContext.getMainThreadHandler().post(() -> {
- if (autoFillManager.getClient() != null) {
- autoFillManager.getClient().authenticate(intent, fillInIntent);
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.mContext.getMainThreadHandler().post(() -> {
+ if (afm.getClient() != null) {
+ afm.getClient().authenticate(intent, fillInIntent);
}
});
}
}
@Override
- public void onAutofillEvent(IBinder windowToken, AutoFillId id, int event) {
- final AutoFillManager autoFillManager = mAutoFillManager.get();
- if (autoFillManager != null) {
- autoFillManager.mContext.getMainThreadHandler().post(() -> {
- if (autoFillManager.getClient() != null) {
- autoFillManager.onAutofillEvent(windowToken, id, event);
+ public void onAutofillEvent(IBinder windowToken, AutofillId id, int event) {
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.mContext.getMainThreadHandler().post(() -> {
+ if (afm.getClient() != null) {
+ afm.onAutofillEvent(windowToken, id, event);
}
});
}
diff --git a/core/java/android/view/autofill/AutofillValue.aidl b/core/java/android/view/autofill/AutofillValue.aidl
new file mode 100644
index 0000000..a015bad
--- /dev/null
+++ b/core/java/android/view/autofill/AutofillValue.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+parcelable AutofillValue;
\ No newline at end of file
diff --git a/core/java/android/view/autofill/AutofillValue.java b/core/java/android/view/autofill/AutofillValue.java
new file mode 100644
index 0000000..0c7620e
--- /dev/null
+++ b/core/java/android/view/autofill/AutofillValue.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.autofill;
+
+import static android.view.autofill.Helper.DEBUG;
+
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View;
+
+/**
+ * Abstracts how a {@link View} can be autofilled by an
+ * {@link android.service.autofill.AutofillService}.
+ *
+ * <p>Each {@link AutofillValue} is associated with a {@code type}, as defined by
+ * {@link View#getAutofillType()}.
+ */
+public final class AutofillValue implements Parcelable {
+ private final String mText;
+ private final int mListIndex;
+ private final boolean mToggle;
+ private final long mDate;
+
+ private AutofillValue(CharSequence text, int listIndex, boolean toggle, long date) {
+ mText = (text == null) ? null : text.toString();
+ mListIndex = listIndex;
+ mToggle = toggle;
+ mDate = date;
+ }
+
+ /**
+ * Gets the value to autofill a text field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
+ */
+ public CharSequence getTextValue() {
+ return mText;
+ }
+
+ /**
+ * Gets the value to autofill a toggable field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_TOGGLE} for more info.
+ */
+ public boolean getToggleValue() {
+ return mToggle;
+ }
+
+ /**
+ * Gets the value to autofill a selection list field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_LIST} for more info.
+ */
+ public int getListValue() {
+ return mListIndex;
+ }
+
+ /**
+ * Gets the value to autofill a date field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_DATE} for more info.
+ */
+ public long getDateValue() {
+ return mDate;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((mText == null) ? 0 : mText.hashCode());
+ result = prime * result + mListIndex;
+ result = prime * result + (mToggle ? 1231 : 1237);
+ result = prime * result + (int) (mDate ^ (mDate >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AutofillValue other = (AutofillValue) obj;
+ if (mText == null) {
+ if (other.mText != null) return false;
+ } else {
+ if (!mText.equals(other.mText)) return false;
+ }
+ if (mListIndex != other.mListIndex) return false;
+ if (mToggle != other.mToggle) return false;
+ if (mDate != other.mDate) return false;
+ return true;
+ }
+
+ /** @hide */
+ public String coerceToString() {
+ // TODO(b/33197203): How can we filter on toggles or list values?
+ return mText;
+ }
+
+ @Override
+ public String toString() {
+ if (!DEBUG) return super.toString();
+
+ if (mText != null) {
+ return mText.length() + "_chars";
+ }
+
+ return "[l=" + mListIndex + ", t=" + mToggle + ", d=" + mDate + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mText);
+ parcel.writeInt(mListIndex);
+ parcel.writeInt(mToggle ? 1 : 0);
+ parcel.writeLong(mDate);
+ }
+
+ private AutofillValue(Parcel parcel) {
+ mText = parcel.readString();
+ mListIndex = parcel.readInt();
+ mToggle = parcel.readInt() == 1;
+ mDate = parcel.readLong();
+ }
+
+ public static final Parcelable.Creator<AutofillValue> CREATOR =
+ new Parcelable.Creator<AutofillValue>() {
+ @Override
+ public AutofillValue createFromParcel(Parcel source) {
+ return new AutofillValue(source);
+ }
+
+ @Override
+ public AutofillValue[] newArray(int size) {
+ return new AutofillValue[size];
+ }
+ };
+
+ ////////////////////
+ // Factory methods //
+ ////////////////////
+
+ /**
+ * Creates a new {@link AutofillValue} to autofill a {@link View} representing a text field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
+ */
+ // TODO(b/33197203): use cache
+ @Nullable
+ public static AutofillValue forText(@Nullable CharSequence value) {
+ return value == null ? null : new AutofillValue(value, 0, false, 0);
+ }
+
+ /**
+ * Creates a new {@link AutofillValue} to autofill a {@link View} representing a toggable
+ * field.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_TOGGLE} for more info.
+ */
+ public static AutofillValue forToggle(boolean value) {
+ return new AutofillValue(null, 0, value, 0);
+ }
+
+ /**
+ * Creates a new {@link AutofillValue} to autofill a {@link View} representing a selection
+ * list.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_LIST} for more info.
+ */
+ public static AutofillValue forList(int value) {
+ return new AutofillValue(null, value, false, 0);
+ }
+
+ /**
+ * Creates a new {@link AutofillValue} to autofill a {@link View} representing a date.
+ *
+ * <p>See {@link View#AUTOFILL_TYPE_DATE} for more info.
+ */
+ public static AutofillValue forDate(long value) {
+ return new AutofillValue(null, 0, false, value);
+ }
+}
diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl
index b36c0f1..86a4965 100644
--- a/core/java/android/view/autofill/IAutoFillManager.aidl
+++ b/core/java/android/view/autofill/IAutoFillManager.aidl
@@ -19,8 +19,8 @@
import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import android.view.autofill.IAutoFillManagerClient;
/**
@@ -31,11 +31,12 @@
interface IAutoFillManager {
boolean addClient(in IAutoFillManagerClient client, int userId);
oneway void startSession(in IBinder activityToken, IBinder windowToken, in IBinder appCallback,
- in AutoFillId autoFillId, in Rect bounds, in AutoFillValue value, int userId,
+ in AutofillId autoFillId, in Rect bounds, in AutofillValue value, int userId,
boolean hasCallback);
- oneway void updateSession(in IBinder activityToken, in AutoFillId id, in Rect bounds,
- in AutoFillValue value, int flags, int userId);
+ oneway void updateSession(in IBinder activityToken, in AutofillId id, in Rect bounds,
+ in AutofillValue value, int flags, int userId);
oneway void finishSession(in IBinder activityToken, int userId);
+ oneway void cancelSession(in IBinder activityToken, int userId);
oneway void setAuthenticationResult(in Bundle data,
in IBinder activityToken, int userId);
oneway void setHasCallback(in IBinder activityToken, int userId, boolean hasIt);
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 9eef7d0..eabf6b1 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -21,24 +21,24 @@
import android.content.Intent;
import android.content.IntentSender;
import android.os.IBinder;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
/**
- * Object running in the application process and responsible for auto-filling it.
+ * Object running in the application process and responsible for autofilling it.
*
* @hide
*/
oneway interface IAutoFillManagerClient {
/**
- * Notifies the client when the auto-fill enabled state changed.
+ * Notifies the client when the autofill enabled state changed.
*/
void setState(boolean enabled);
/**
- * Auto-fills the activity with the contents of a dataset.
+ * Autofills the activity with the contents of a dataset.
*/
- void autoFill(in List<AutoFillId> ids, in List<AutoFillValue> values);
+ void autofill(in List<AutofillId> ids, in List<AutofillValue> values);
/**
* Authenticates a fill response or a data set.
@@ -48,5 +48,5 @@
/**
* Notifies the client when the auto-fill UI changed.
*/
- void onAutofillEvent(in IBinder windowToken, in AutoFillId id, int event);
+ void onAutofillEvent(in IBinder windowToken, in AutofillId id, int event);
}
diff --git a/core/java/android/view/textclassifier/EntityConfidence.java b/core/java/android/view/textclassifier/EntityConfidence.java
index 7aab71f..0589d204 100644
--- a/core/java/android/view/textclassifier/EntityConfidence.java
+++ b/core/java/android/view/textclassifier/EntityConfidence.java
@@ -42,10 +42,10 @@
float score1 = mEntityConfidence.get(e1);
float score2 = mEntityConfidence.get(e2);
if (score1 > score2) {
- return 1;
+ return -1;
}
if (score1 < score2) {
- return -1;
+ return 1;
}
return 0;
};
diff --git a/core/java/android/view/textclassifier/LangId.java b/core/java/android/view/textclassifier/LangId.java
index 53bc1b0..23c7842 100644
--- a/core/java/android/view/textclassifier/LangId.java
+++ b/core/java/android/view/textclassifier/LangId.java
@@ -22,7 +22,7 @@
final class LangId {
static {
- System.loadLibrary("smart-selection_jni");
+ System.loadLibrary("textclassifier");
}
private final long mModelPtr;
@@ -37,8 +37,8 @@
/**
* Detects the language for given text.
*/
- public String findLanguage(String text) {
- return nativeFindLanguage(mModelPtr, text);
+ public ClassificationResult[] findLanguages(String text) {
+ return nativeFindLanguages(mModelPtr, text);
}
/**
@@ -50,8 +50,20 @@
private static native long nativeNew(int fd);
- private static native String nativeFindLanguage(long context, String text);
+ private static native ClassificationResult[] nativeFindLanguages(
+ long context, String text);
private static native void nativeClose(long context);
-}
+ /** Classification result for findLanguage method. */
+ static final class ClassificationResult {
+ final String mLanguage;
+ /** float range: 0 - 1 */
+ final float mScore;
+
+ ClassificationResult(String language, float score) {
+ mLanguage = language;
+ mScore = score;
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/SmartSelection.java b/core/java/android/view/textclassifier/SmartSelection.java
index 47c39e4..9397a41 100644
--- a/core/java/android/view/textclassifier/SmartSelection.java
+++ b/core/java/android/view/textclassifier/SmartSelection.java
@@ -23,7 +23,7 @@
final class SmartSelection {
static {
- System.loadLibrary("smart-selection_jni");
+ System.loadLibrary("textclassifier");
}
private final long mCtx;
@@ -55,9 +55,11 @@
*
* The begin and end params are character indices in the context string.
*
- * Returns the type of the selection, e.g. "email", "address", "phone".
+ * Returns an array of ClassificationResult objects with the probability
+ * scores for different collections.
*/
- public String classifyText(String context, int selectionBegin, int selectionEnd) {
+ public ClassificationResult[] classifyText(
+ String context, int selectionBegin, int selectionEnd) {
return nativeClassifyText(mCtx, context, selectionBegin, selectionEnd);
}
@@ -73,9 +75,20 @@
private static native int[] nativeSuggest(
long context, String text, int selectionBegin, int selectionEnd);
- private static native String nativeClassifyText(
+ private static native ClassificationResult[] nativeClassifyText(
long context, String text, int selectionBegin, int selectionEnd);
private static native void nativeClose(long context);
-}
+ /** Classification result for classifyText method. */
+ static final class ClassificationResult {
+ final String mCollection;
+ /** float range: 0 - 1 */
+ final float mScore;
+
+ ClassificationResult(String collection, float score) {
+ mCollection = collection;
+ mScore = score;
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/TextClassificationManager.java b/core/java/android/view/textclassifier/TextClassificationManager.java
index c4d64d1..f032414 100644
--- a/core/java/android/view/textclassifier/TextClassificationManager.java
+++ b/core/java/android/view/textclassifier/TextClassificationManager.java
@@ -85,12 +85,17 @@
Preconditions.checkArgument(text != null);
try {
if (text.length() > 0) {
- final String language = getLanguageDetector().findLanguage(text.toString());
- final Locale locale = new Locale.Builder().setLanguageTag(language).build();
- return Collections.unmodifiableList(Arrays.asList(
- new TextLanguage.Builder(0, text.length())
- .setLanguage(locale, 1.0f /* confidence */)
- .build()));
+ final LangId.ClassificationResult[] results =
+ getLanguageDetector().findLanguages(text.toString());
+ final TextLanguage.Builder tlBuilder = new TextLanguage.Builder(0, text.length());
+ final int size = results.length;
+ for (int i = 0; i < size; i++) {
+ tlBuilder.setLanguage(
+ new Locale.Builder().setLanguageTag(results[i].mLanguage).build(),
+ results[i].mScore);
+ }
+
+ return Collections.unmodifiableList(Arrays.asList(tlBuilder.build()));
}
} catch (Throwable t) {
// Avoid throwing from this method. Log the error.
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 0486f9f..c95a1fb 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -86,10 +86,14 @@
final int start = startEnd[0];
final int end = startEnd[1];
if (start >= 0 && end <= string.length() && start <= end) {
- final String type = getSmartSelection().classifyText(string, start, end);
- return new TextSelection.Builder(start, end)
- .setEntityType(type, 1.0f)
- .build();
+ final TextSelection.Builder tsBuilder = new TextSelection.Builder(start, end);
+ final SmartSelection.ClassificationResult[] results =
+ getSmartSelection().classifyText(string, start, end);
+ final int size = results.length;
+ for (int i = 0; i < size; i++) {
+ tsBuilder.setEntityType(results[i].mCollection, results[i].mScore);
+ }
+ return tsBuilder.build();
} else {
// We can not trust the result. Log the issue and ignore the result.
Log.d(LOG_TAG, "Got bad indices for input text. Ignoring result.");
@@ -113,13 +117,13 @@
try {
if (text.length() > 0) {
final CharSequence classified = text.subSequence(startIndex, endIndex);
- String type = getSmartSelection()
+ SmartSelection.ClassificationResult[] results = getSmartSelection()
.classifyText(text.toString(), startIndex, endIndex);
- if (!TextUtils.isEmpty(type)) {
- type = type.toLowerCase(Locale.ENGLISH).trim();
+ if (results.length > 0) {
// TODO: Added this log for debug only. Remove before release.
- Log.d(LOG_TAG, String.format("Classification type: %s", type));
- return createClassificationResult(type, classified);
+ Log.d(LOG_TAG,
+ String.format("Classification type: %s", results[0].mCollection));
+ return createClassificationResult(results, classified);
}
}
} catch (Throwable t) {
@@ -174,11 +178,17 @@
}
}
- private TextClassificationResult createClassificationResult(String type, CharSequence text) {
+ private TextClassificationResult createClassificationResult(
+ SmartSelection.ClassificationResult[] classifications, CharSequence text) {
final TextClassificationResult.Builder builder = new TextClassificationResult.Builder()
- .setText(text.toString())
- .setEntityType(type, 1.0f /* confidence */);
+ .setText(text.toString());
+ final int size = classifications.length;
+ for (int i = 0; i < size; i++) {
+ builder.setEntityType(classifications[i].mCollection, classifications[i].mScore);
+ }
+
+ final String type = classifications[0].mCollection;
final Intent intent = IntentFactory.create(mContext, type, text.toString());
final PackageManager pm;
final ResolveInfo resolveInfo;
@@ -252,14 +262,17 @@
final int selectionEnd = selection[1];
if (selectionStart >= 0 && selectionEnd <= text.length()
&& selectionStart <= selectionEnd) {
- final String type =
+ final SmartSelection.ClassificationResult[] results =
smartSelection.classifyText(text, selectionStart, selectionEnd);
- if (matches(type, linkMask)) {
- final Intent intent = IntentFactory.create(
- context, type, text.substring(selectionStart, selectionEnd));
- if (hasActivityHandler(context, intent)) {
- final ClickableSpan span = createSpan(context, intent);
- spans.add(new SpanSpec(selectionStart, selectionEnd, span));
+ if (results.length > 0) {
+ final String type = results[0].mCollection;
+ if (matches(type, linkMask)) {
+ final Intent intent = IntentFactory.create(
+ context, type, text.substring(selectionStart, selectionEnd));
+ if (hasActivityHandler(context, intent)) {
+ final ClickableSpan span = createSpan(context, intent);
+ spans.add(new SpanSpec(selectionStart, selectionEnd, span));
+ }
}
}
}
@@ -272,6 +285,7 @@
* Returns true if the classification type matches the specified linkMask.
*/
private static boolean matches(String type, int linkMask) {
+ type = type.trim().toLowerCase(Locale.ENGLISH);
if ((linkMask & Linkify.PHONE_NUMBERS) != 0
&& TextClassifier.TYPE_PHONE.equals(type)) {
return true;
@@ -403,6 +417,7 @@
@Nullable
public static Intent create(Context context, String type, String text) {
+ type = type.trim().toLowerCase(Locale.ENGLISH);
switch (type) {
case TextClassifier.TYPE_EMAIL:
return new Intent(Intent.ACTION_SENDTO)
@@ -418,12 +433,12 @@
.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
default:
return null;
- // TODO: Add other classification types.
}
}
@Nullable
public static String getLabel(Context context, String type) {
+ type = type.trim().toLowerCase(Locale.ENGLISH);
switch (type) {
case TextClassifier.TYPE_EMAIL:
return context.getString(com.android.internal.R.string.email);
@@ -435,7 +450,6 @@
return context.getString(com.android.internal.R.string.browse);
default:
return null;
- // TODO: Add other classification types.
}
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 3fbeb03..9a931c2 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2612,8 +2612,8 @@
}
@Override
- public void onProvideAutoFillVirtualStructure(ViewStructure structure, int flags) {
- mProvider.getViewDelegate().onProvideAutoFillVirtualStructure(structure, flags);
+ public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {
+ mProvider.getViewDelegate().onProvideAutofillVirtualStructure(structure, flags);
}
/** @hide */
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 0a73e17d..788908a 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -234,6 +234,8 @@
public static final int ERROR_FILE_NOT_FOUND = -14;
/** Too many requests during this load */
public static final int ERROR_TOO_MANY_REQUESTS = -15;
+ /** Resource load was cancelled by Safe Browsing */
+ public static final int ERROR_UNSAFE_RESOURCE = -16;
/**
* Report an error to the host application. These errors are unrecoverable
diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java
index ffc18b1..5724a9b 100644
--- a/core/java/android/webkit/WebViewProvider.java
+++ b/core/java/android/webkit/WebViewProvider.java
@@ -318,7 +318,7 @@
public void onProvideVirtualStructure(android.view.ViewStructure structure);
@SuppressWarnings("unused")
- public default void onProvideAutoFillVirtualStructure(android.view.ViewStructure structure,
+ public default void onProvideAutofillVirtualStructure(android.view.ViewStructure structure,
int flags) {
}
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index e6cd566..053574f 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -27,7 +27,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStructure;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillValue;
import com.android.internal.R;
@@ -492,8 +492,8 @@
// TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
@Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutofillStructure(structure, flags);
if (getAdapter() == null) return;
@@ -506,12 +506,12 @@
for (int i = 0; i < count; i++) {
options[i] = getAdapter().getItem(i).toString();
}
- structure.setAutoFillOptions(options);
+ structure.setAutofillOptions(options);
}
}
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
if (!isEnabled()) return;
final int position = value.getListValue();
@@ -524,7 +524,7 @@
}
@Override
- public AutoFillValue getAutoFillValue() {
- return isEnabled() ? AutoFillValue.forList(getSelectedItemPosition()) : null;
+ public AutofillValue getAutofillValue() {
+ return isEnabled() ? AutofillValue.forList(getSelectedItemPosition()) : null;
}
}
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 0b3cff1..5725b49 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -34,7 +34,7 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.autofill.AutoFillManager;
+import android.view.autofill.AutofillManager;
/**
* An AdapterView is a view whose children are determined by an {@link Adapter}.
@@ -915,10 +915,10 @@
dispatchOnItemSelected();
}
}
- // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
- final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ // Always notify AutoFillManager - it will return right away if autofill is disabled.
+ final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
- afm.valueChanged(this);
+ afm.notifyValueChanged(this);
}
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index dce33a0..d246405 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -35,8 +35,8 @@
import android.view.ViewStructure;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import com.android.internal.R;
@@ -69,7 +69,7 @@
private OnCheckedChangeListener mOnCheckedChangeWidgetListener;
// Indicates whether the toggle state was set from resources or dynamically, so it can be used
- // to sanitize auto-fill requests.
+ // to sanitize autofill requests.
private boolean mCheckedFromResource = false;
private static final int[] CHECKED_STATE_SET = {
@@ -171,9 +171,9 @@
if (mOnCheckedChangeWidgetListener != null) {
mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
}
- final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
- afm.valueChanged(this);
+ afm.notifyValueChanged(this);
}
mBroadcasting = false;
@@ -572,17 +572,17 @@
stream.addProperty("checked", isChecked());
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
+ // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
@Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutofillStructure(structure, flags);
structure.setSanitized(mCheckedFromResource);
}
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
if (!isEnabled()) return;
setChecked(value.getToggleValue());
@@ -594,7 +594,7 @@
}
@Override
- public AutoFillValue getAutoFillValue() {
- return isEnabled() ? AutoFillValue.forToggle(isChecked()) : null;
+ public AutofillValue getAutofillValue() {
+ return isEnabled() ? AutofillValue.forToggle(isChecked()) : null;
}
}
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index c905172..31a88d4 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -33,8 +33,8 @@
import android.view.View;
import android.view.ViewStructure;
import android.view.accessibility.AccessibilityEvent;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import com.android.internal.R;
@@ -180,9 +180,9 @@
}
mDelegate.setAutoFillChangeListener((v, y, m, d) -> {
- final AutoFillManager afm = context.getSystemService(AutoFillManager.class);
+ final AutofillManager afm = context.getSystemService(AutofillManager.class);
if (afm != null) {
- afm.valueChanged(this);
+ afm.notifyValueChanged(this);
}
});
}
@@ -761,18 +761,18 @@
void onValidationChanged(boolean valid);
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
+ // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
@Override
- public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
- // This view is self-sufficient for auto-fill, so it needs to call
+ public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ // This view is self-sufficient for autofill, so it needs to call
// onProvideAutoFillStructure() to fill itself, but it does not need to call
// dispatchProvideAutoFillStructure() to fill its children.
- onProvideAutoFillStructure(structure, flags);
+ onProvideAutofillStructure(structure, flags);
}
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
if (!isEnabled()) return;
mDelegate.updateDate(value.getDateValue());
@@ -784,7 +784,7 @@
}
@Override
- public AutoFillValue getAutoFillValue() {
- return isEnabled() ? AutoFillValue.forDate(mDelegate.getDate()) : null;
+ public AutofillValue getAutofillValue() {
+ return isEnabled() ? AutofillValue.forDate(mDelegate.getDate()) : null;
}
}
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index bb8cd28..dc9976d 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -16,7 +16,6 @@
package android.widget;
-
import android.annotation.IdRes;
import android.content.Context;
import android.content.res.TypedArray;
@@ -25,8 +24,8 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStructure;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import com.android.internal.R;
@@ -67,7 +66,7 @@
private PassThroughHierarchyChangeListener mPassThroughListener;
// Indicates whether the child was set from resources or dynamically, so it can be used
- // to sanitize auto-fill requests.
+ // to sanitize autofill requests.
private int mInitialCheckedId = View.NO_ID;
/**
@@ -187,9 +186,9 @@
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
}
- final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
- afm.valueChanged(this);
+ afm.notifyValueChanged(this);
}
}
@@ -417,16 +416,16 @@
}
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
+ // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
@Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutofillStructure(structure, flags);
structure.setSanitized(mCheckedId == mInitialCheckedId);
}
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
if (!isEnabled()) return;
final int index = value.getListValue();
@@ -444,14 +443,14 @@
}
@Override
- public AutoFillValue getAutoFillValue() {
+ public AutofillValue getAutofillValue() {
if (!isEnabled()) return null;
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getId() == mCheckedId) {
- return AutoFillValue.forList(i);
+ return AutofillValue.forList(i);
}
}
return null;
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 3811e1a..ddf0e74 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -41,7 +41,6 @@
import android.view.PointerIcon;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewStructure;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -914,27 +913,6 @@
return super.onResolvePointerIcon(event, pointerIndex);
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
-
- @Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
-
- if (getAdapter() == null) return;
-
- // TODO(b/33197203): implement sanitization so initial value is only sanitized when coming
- // from resources.
-
- final int count = getAdapter().getCount();
- if (count > 0) {
- final String[] options = new String[count];
- for (int i = 0; i < count; i++) {
- options[i] = getAdapter().getItem(i).toString();
- }
- structure.setAutoFillOptions(options);
- }
- }
-
static class SavedState extends AbsSpinner.SavedState {
boolean showDropdown;
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index a9257e6..40253a1 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -1406,17 +1406,17 @@
@Override
public void onProvideStructure(ViewStructure structure) {
super.onProvideStructure(structure);
- onProvideAutoFillStructureForAssistOrAutoFill(structure);
+ onProvideAutoFillStructureForAssistOrAutofill(structure);
}
@Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
- onProvideAutoFillStructureForAssistOrAutoFill(structure);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutofillStructure(structure, flags);
+ onProvideAutoFillStructureForAssistOrAutofill(structure);
}
// NOTE: currently there is no difference for Assist or AutoFill, so it doesn't take flags
- private void onProvideAutoFillStructureForAssistOrAutoFill(ViewStructure structure) {
+ private void onProvideAutoFillStructureForAssistOrAutofill(ViewStructure structure) {
CharSequence switchText = isChecked() ? mTextOn : mTextOff;
if (!TextUtils.isEmpty(switchText)) {
CharSequence oldText = structure.getText();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index b901ab4..d591316f 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -140,8 +140,8 @@
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.CorrectionInfo;
@@ -732,7 +732,7 @@
private boolean mHasPresetAutoSizeValues = false;
// Indicates whether the text was set from resources or dynamically, so it can be used to
- // sanitize auto-fill requests.
+ // sanitize autofill requests.
private boolean mTextFromResource = false;
/**
@@ -5231,7 +5231,7 @@
if (needEditableForNotification) {
sendAfterTextChanged((Editable) text);
} else {
- // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
+ // Always notify AutoFillManager - it will return right away if autofill is disabled.
notifyAutoFillManagerAfterTextChanged();
}
@@ -9124,19 +9124,19 @@
}
}
- // Always notify AutoFillManager - it will return right away if auto-fill is disabled.
+ // Always notify AutoFillManager - it will return right away if autofill is disabled.
notifyAutoFillManagerAfterTextChanged();
hideErrorIfUnchanged();
}
private void notifyAutoFillManagerAfterTextChanged() {
- final AutoFillManager afm = mContext.getSystemService(AutoFillManager.class);
+ final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
if (afm != null) {
if (DEBUG_AUTOFILL) {
Log.v(LOG_TAG, "sendAfterTextChanged(): notify AFM for text=" + mText);
}
- afm.valueChanged(TextView.this);
+ afm.notifyValueChanged(TextView.this);
}
}
@@ -9886,24 +9886,24 @@
@Override
public void onProvideStructure(ViewStructure structure) {
super.onProvideStructure(structure);
- onProvideAutoStructureForAssistOrAutoFill(structure, false);
+ onProvideAutoStructureForAssistOrAutofill(structure, false);
}
@Override
- public void onProvideAutoFillStructure(ViewStructure structure, int flags) {
- super.onProvideAutoFillStructure(structure, flags);
- onProvideAutoStructureForAssistOrAutoFill(structure, true);
+ public void onProvideAutofillStructure(ViewStructure structure, int flags) {
+ super.onProvideAutofillStructure(structure, flags);
+ onProvideAutoStructureForAssistOrAutofill(structure, true);
}
- private void onProvideAutoStructureForAssistOrAutoFill(ViewStructure structure,
- boolean forAutoFill) {
+ private void onProvideAutoStructureForAssistOrAutofill(ViewStructure structure,
+ boolean forAutofill) {
final boolean isPassword = hasPasswordTransformationMethod()
|| isPasswordInputType(getInputType());
- if (forAutoFill) {
+ if (forAutofill) {
structure.setSanitized(mTextFromResource);
}
- if (!isPassword || forAutoFill) {
+ if (!isPassword || forAutofill) {
if (mLayout == null) {
assumeLayout();
}
@@ -10010,10 +10010,10 @@
structure.setInputType(getInputType());
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods
+ // TODO(b/33197203): add unit/CTS tests for autofill methods
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
final CharSequence text = value.getTextValue();
if (text != null && isTextEditable()) {
@@ -10028,8 +10028,8 @@
@Override
@Nullable
- public AutoFillValue getAutoFillValue() {
- return isTextEditable() ? AutoFillValue.forText(getText()) : null;
+ public AutofillValue getAutofillValue() {
+ return isTextEditable() ? AutofillValue.forText(getText()) : null;
}
/** @hide */
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 3a19f21..9825f1e 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -31,8 +31,8 @@
import android.view.View;
import android.view.ViewStructure;
import android.view.accessibility.AccessibilityEvent;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import com.android.internal.R;
@@ -142,9 +142,9 @@
break;
}
mDelegate.setAutoFillChangeListener((v, h, m) -> {
- final AutoFillManager afm = context.getSystemService(AutoFillManager.class);
+ final AutofillManager afm = context.getSystemService(AutofillManager.class);
if (afm != null) {
- afm.valueChanged(this);
+ afm.notifyValueChanged(this);
}
});
}
@@ -516,18 +516,18 @@
}
}
- // TODO(b/33197203): add unit/CTS tests for auto-fill methods (and make sure they handle enable)
+ // TODO(b/33197203): add unit/CTS tests for autofill methods (and make sure they handle enable)
@Override
- public void dispatchProvideAutoFillStructure(ViewStructure structure, int flags) {
- // This view is self-sufficient for auto-fill, so it needs to call
+ public void dispatchProvideAutofillStructure(ViewStructure structure, int flags) {
+ // This view is self-sufficient for autofill, so it needs to call
// onProvideAutoFillStructure() to fill itself, but it does not need to call
// dispatchProvideAutoFillStructure() to fill its children.
- onProvideAutoFillStructure(structure, flags);
+ onProvideAutofillStructure(structure, flags);
}
@Override
- public void autoFill(AutoFillValue value) {
+ public void autofill(AutofillValue value) {
if (!isEnabled()) return;
mDelegate.setDate(value.getDateValue());
@@ -539,7 +539,7 @@
}
@Override
- public AutoFillValue getAutoFillValue() {
- return isEnabled() ? AutoFillValue.forDate(mDelegate.getDate()) : null;
+ public AutofillValue getAutofillValue() {
+ return isEnabled() ? AutofillValue.forDate(mDelegate.getDate()) : null;
}
}
diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
index cf1bf62..c6cb837 100644
--- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -19,6 +19,7 @@
import com.android.internal.R;
import android.content.Context;
+import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
@@ -29,20 +30,21 @@
public AmbientDisplayConfiguration(Context context) {
mContext = context;
}
-
+
public boolean enabled(int user) {
return pulseOnNotificationEnabled(user)
|| pulseOnPickupEnabled(user)
- || pulseOnDoubleTapEnabled(user);
+ || pulseOnDoubleTapEnabled(user)
+ || alwaysOnEnabled(user);
}
-
+
public boolean available() {
return pulseOnNotificationAvailable() || pulseOnPickupAvailable()
|| pulseOnDoubleTapAvailable();
}
-
+
public boolean pulseOnNotificationEnabled(int user) {
- return boolSetting(Settings.Secure.DOZE_ENABLED, user) && pulseOnNotificationAvailable();
+ return boolSettingDefaultOn(Settings.Secure.DOZE_ENABLED, user) && pulseOnNotificationAvailable();
}
public boolean pulseOnNotificationAvailable() {
@@ -50,17 +52,17 @@
}
public boolean pulseOnPickupEnabled(int user) {
- return boolSetting(Settings.Secure.DOZE_PULSE_ON_PICK_UP, user)
+ return boolSettingDefaultOn(Settings.Secure.DOZE_PULSE_ON_PICK_UP, user)
&& pulseOnPickupAvailable();
}
-
+
public boolean pulseOnPickupAvailable() {
return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup)
&& ambientDisplayAvailable();
}
-
+
public boolean pulseOnDoubleTapEnabled(int user) {
- return boolSetting(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, user)
+ return boolSettingDefaultOn(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, user)
&& pulseOnDoubleTapAvailable();
}
@@ -72,6 +74,16 @@
return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType);
}
+ public boolean alwaysOnEnabled(int user) {
+ return boolSettingDefaultOff(Settings.Secure.DOZE_ALWAYS_ON, user)
+ && alwaysOnAvailable();
+ }
+
+ public boolean alwaysOnAvailable() {
+ // TODO: introduce config_dozeAlwaysOnAvailable. For now just debuggable builds.
+ return Build.IS_DEBUGGABLE && ambientDisplayAvailable();
+ }
+
public String ambientDisplayComponent() {
return mContext.getResources().getString(R.string.config_dozeComponent);
}
@@ -80,8 +92,15 @@
return !TextUtils.isEmpty(ambientDisplayComponent());
}
- private boolean boolSetting(String name, int user) {
- return Settings.Secure.getIntForUser(mContext.getContentResolver(), name, 1, user) != 0;
+ private boolean boolSettingDefaultOn(String name, int user) {
+ return boolSetting(name, user, 1);
}
+ private boolean boolSettingDefaultOff(String name, int user) {
+ return boolSetting(name, user, 0);
+ }
+
+ private boolean boolSetting(String name, int user, int def) {
+ return Settings.Secure.getIntForUser(mContext.getContentResolver(), name, def, user) != 0;
+ }
}
diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java
index 949e7ac..a482929 100644
--- a/core/java/com/android/internal/logging/MetricsLogger.java
+++ b/core/java/com/android/internal/logging/MetricsLogger.java
@@ -31,109 +31,188 @@
// define metric categories in frameworks/base/proto/src/metrics_constants.proto.
// mirror changes in native version at system/core/libmetricslogger/metrics_logger.cpp
+ private static MetricsLogger sMetricsLogger;
+
+ private static MetricsLogger getLogger() {
+ if (sMetricsLogger == null) {
+ sMetricsLogger = new MetricsLogger();
+ }
+ return sMetricsLogger;
+ }
+
+ protected void saveLog(Object[] rep) {
+ EventLogTags.writeSysuiMultiAction(rep);
+ }
+
public static final int VIEW_UNKNOWN = MetricsEvent.VIEW_UNKNOWN;
public static final int LOGTAG = EventLogTags.SYSUI_MULTI_ACTION;
- public static void visible(Context context, int category) throws IllegalArgumentException {
+ public void write(LogMaker content) {
+ if (content.getType() == MetricsEvent.TYPE_UNKNOWN) {
+ content.setType(MetricsEvent.TYPE_ACTION);
+ }
+ saveLog(content.serialize());
+ }
+
+ public void visible(int category) throws IllegalArgumentException {
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
throw new IllegalArgumentException("Must define metric category");
}
EventLogTags.writeSysuiViewVisibility(category, 100);
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_OPEN)
.serialize());
}
- public static void hidden(Context context, int category) throws IllegalArgumentException {
+ public void hidden(int category) throws IllegalArgumentException {
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
throw new IllegalArgumentException("Must define metric category");
}
EventLogTags.writeSysuiViewVisibility(category, 0);
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_CLOSE)
.serialize());
}
- public static void visibility(Context context, int category, boolean visibile)
+ public void visibility(int category, boolean visibile)
throws IllegalArgumentException {
if (visibile) {
- visible(context, category);
+ visible(category);
} else {
- hidden(context, category);
+ hidden(category);
}
}
- public static void visibility(Context context, int category, int vis)
+ public void visibility(int category, int vis)
throws IllegalArgumentException {
- visibility(context, category, vis == View.VISIBLE);
+ visibility(category, vis == View.VISIBLE);
}
- public static void action(Context context, int category) {
+ public void action(int category) {
EventLogTags.writeSysuiAction(category, "");
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_ACTION)
.serialize());
}
- public static void action(Context context, int category, int value) {
+ public void action(int category, int value) {
EventLogTags.writeSysuiAction(category, Integer.toString(value));
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_ACTION)
.setSubtype(value)
.serialize());
}
- public static void action(Context context, int category, boolean value) {
+ public void action(int category, boolean value) {
EventLogTags.writeSysuiAction(category, Boolean.toString(value));
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_ACTION)
.setSubtype(value ? 1 : 0)
.serialize());
}
- public static void action(LogMaker content) {
- if (content.getType() == MetricsEvent.TYPE_UNKNOWN) {
- content.setType(MetricsEvent.TYPE_ACTION);
- }
- EventLogTags.writeSysuiMultiAction(content.serialize());
- }
-
-
- public static void action(Context context, int category, String pkg) {
+ public void action(int category, String pkg) {
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
throw new IllegalArgumentException("Must define metric category");
}
EventLogTags.writeSysuiAction(category, pkg);
- EventLogTags.writeSysuiMultiAction(new LogMaker(category)
+ saveLog(new LogMaker(category)
.setType(MetricsEvent.TYPE_ACTION)
.setPackageName(pkg)
.serialize());
}
/** Add an integer value to the monotonically increasing counter with the given name. */
- public static void count(Context context, String name, int value) {
+ public void count(String name, int value) {
EventLogTags.writeSysuiCount(name, value);
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(MetricsEvent.RESERVED_FOR_LOGBUILDER_COUNTER)
+ saveLog(new LogMaker(MetricsEvent.RESERVED_FOR_LOGBUILDER_COUNTER)
.setCounterName(name)
.setCounterValue(value)
.serialize());
}
/** Increment the bucket with the integer label on the histogram with the given name. */
- public static void histogram(Context context, String name, int bucket) {
+ public void histogram(String name, int bucket) {
// see LogHistogram in system/core/libmetricslogger/metrics_logger.cpp
EventLogTags.writeSysuiHistogram(name, bucket);
- EventLogTags.writeSysuiMultiAction(
- new LogMaker(MetricsEvent.RESERVED_FOR_LOGBUILDER_HISTOGRAM)
+ saveLog(new LogMaker(MetricsEvent.RESERVED_FOR_LOGBUILDER_HISTOGRAM)
.setCounterName(name)
.setCounterBucket(bucket)
.setCounterValue(1)
.serialize());
}
+
+ /** @deprecated use {@link #visible(int)} */
+ @Deprecated
+ public static void visible(Context context, int category) throws IllegalArgumentException {
+ getLogger().visible(category);
+ }
+
+ /** @deprecated use {@link #hidden(int)} */
+ @Deprecated
+ public static void hidden(Context context, int category) throws IllegalArgumentException {
+ getLogger().hidden(category);
+ }
+
+ /** @deprecated use {@link #visibility(int, boolean)} */
+ @Deprecated
+ public static void visibility(Context context, int category, boolean visibile)
+ throws IllegalArgumentException {
+ getLogger().visibility(category, visibile);
+ }
+
+ /** @deprecated use {@link #visibility(int, int)} */
+ @Deprecated
+ public static void visibility(Context context, int category, int vis)
+ throws IllegalArgumentException {
+ visibility(context, category, vis == View.VISIBLE);
+ }
+
+ /** @deprecated use {@link #action(int)} */
+ @Deprecated
+ public static void action(Context context, int category) {
+ getLogger().action(category);
+ }
+
+ /** @deprecated use {@link #action(int, int)} */
+ @Deprecated
+ public static void action(Context context, int category, int value) {
+ getLogger().action(category, value);
+ }
+
+ /** @deprecated use {@link #action(int, boolean)} */
+ @Deprecated
+ public static void action(Context context, int category, boolean value) {
+ getLogger().action(category, value);
+ }
+
+ /** @deprecated use {@link #write(LogMaker)} */
+ @Deprecated
+ public static void action(LogMaker content) {
+ getLogger().write(content);
+ }
+
+ /** @deprecated use {@link #action(int, String)} */
+ @Deprecated
+ public static void action(Context context, int category, String pkg) {
+ getLogger().action(category, pkg);
+ }
+
+ /**
+ * Add an integer value to the monotonically increasing counter with the given name.
+ * @deprecated use {@link #count(String, int)}
+ */
+ @Deprecated
+ public static void count(Context context, String name, int value) {
+ getLogger().count(name, value);
+ }
+
+ /**
+ * Increment the bucket with the integer label on the histogram with the given name.
+ * @deprecated use {@link #histogram(String, int)}
+ */
+ @Deprecated
+ public static void histogram(Context context, String name, int bucket) {
+ getLogger().histogram(name, bucket);
+ }
}
diff --git a/core/java/com/android/internal/logging/testing/FakeMetricsLogger.java b/core/java/com/android/internal/logging/testing/FakeMetricsLogger.java
new file mode 100644
index 0000000..fbaf87a
--- /dev/null
+++ b/core/java/com/android/internal/logging/testing/FakeMetricsLogger.java
@@ -0,0 +1,30 @@
+package com.android.internal.logging.testing;
+
+import android.metrics.LogMaker;
+
+import com.android.internal.logging.MetricsLogger;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * Fake logger that queues up logged events for inspection.
+ *
+ * @hide.
+ */
+public class FakeMetricsLogger extends MetricsLogger {
+ private Queue<LogMaker> logs = new LinkedList<>();
+
+ @Override
+ protected void saveLog(Object[] rep) {
+ logs.offer(new LogMaker(rep));
+ }
+
+ public Queue<LogMaker> getLogs() {
+ return logs;
+ }
+
+ public void reset() {
+ logs.clear();
+ }
+}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 2aeddb3..6aa7766 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6027,7 +6027,8 @@
* Clear all stats for this uid. Returns true if the uid is completely
* inactive so can be dropped.
*/
- boolean reset() {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public boolean reset() {
boolean active = false;
if (mWifiRunningTimer != null) {
@@ -6968,7 +6969,10 @@
boolean reset() {
if (mBgCounter != null) {
- mBgCounter.reset(true);
+ mBgCounter.reset(true /*detachIfReset*/);
+ // If we detach, we must null the mBgCounter reference so that it
+ // can be recreated and attached.
+ mBgCounter = null;
}
if (mTimer.reset(true)) {
mTimer = null;
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index fa71a62..e065843 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -100,6 +100,8 @@
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
int[] fdsToIgnore, String instructionSet, String appDataDir) {
VM_HOOKS.preFork();
+ // Resets nice priority for zygote process.
+ resetNicePriority();
int pid = nativeForkAndSpecialize(
uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
fdsToIgnore, instructionSet, appDataDir);
@@ -144,6 +146,8 @@
public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
VM_HOOKS.preFork();
+ // Resets nice priority for zygote process.
+ resetNicePriority();
int pid = nativeForkSystemServer(
uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
// Enable tracing as soon as we enter the system_server.
@@ -174,9 +178,13 @@
}
/**
- * Resets this process' priority to the default value (0).
+ * Resets the calling thread priority to the default value (Thread.NORM_PRIORITY
+ * or nice value 0). This updates both the priority value in java.lang.Thread and
+ * the nice value (setpriority).
*/
- native static void nativeResetNicePriority();
+ static void resetNicePriority() {
+ Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
+ }
/**
* Executes "/system/bin/sh -c <command>" using the exec() system call.
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 310cbc7..0516209 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -132,9 +132,6 @@
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadOpenGL");
preloadOpenGL();
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
- Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadOpenGL");
- preloadOpenGL();
- Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
preloadSharedLibraries();
preloadTextResources();
// Ask the WebViewFactory to do any initialization that must run in the zygote process,
@@ -715,7 +712,7 @@
SystemClock.uptimeMillis());
bootTimingsTraceLog.traceEnd(); // ZygotePreload
} else {
- Zygote.nativeResetNicePriority();
+ Zygote.resetNicePriority();
}
// Finish profiling the zygote initialization.
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 7ff115b..a8e16c9 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -16,6 +16,7 @@
package com.android.internal.policy;
+import android.view.accessibility.AccessibilityNodeInfo;
import com.android.internal.R;
import com.android.internal.policy.PhoneWindow.PanelFeatureState;
import com.android.internal.policy.PhoneWindow.PhoneWindowMenuCallback;
@@ -2251,6 +2252,11 @@
}
@Override
+ public int getAccessibilityViewId() {
+ return AccessibilityNodeInfo.ROOT_ITEM_ID;
+ }
+
+ @Override
public String toString() {
return "DecorView@" + Integer.toHexString(this.hashCode()) + "["
+ getTitleSuffix(mWindow.getAttributes()) + "]";
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 804bd29..6c9280a 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -3585,7 +3585,8 @@
synchronized (mWindows) {
if (!mIsWatching) {
try {
- WindowManagerHolder.sWindowManager.watchRotation(this);
+ WindowManagerHolder.sWindowManager.watchRotation(this,
+ phoneWindow.getContext().getDisplay().getDisplayId());
mHandler = new Handler();
mIsWatching = true;
} catch (RemoteException ex) {
diff --git a/core/java/com/android/internal/policy/PipSnapAlgorithm.java b/core/java/com/android/internal/policy/PipSnapAlgorithm.java
index f88ac49..ae31873 100644
--- a/core/java/com/android/internal/policy/PipSnapAlgorithm.java
+++ b/core/java/com/android/internal/policy/PipSnapAlgorithm.java
@@ -36,15 +36,18 @@
*/
public class PipSnapAlgorithm {
+ // The below SNAP_MODE_* constants correspond to the config resource value
+ // config_pictureInPictureSnapMode and should not be changed independently.
// Allows snapping to the four corners
private static final int SNAP_MODE_CORNERS_ONLY = 0;
// Allows snapping to the four corners and the mid-points on the long edge in each orientation
private static final int SNAP_MODE_CORNERS_AND_SIDES = 1;
// Allows snapping to anywhere along the edge of the screen
private static final int SNAP_MODE_EDGE = 2;
- // Allows snapping to four corners on a fling towards a corner or slow move near a corner
- // snaps anywhere along the edge of screen otherwise
- private static final int SNAP_MODE_CORNERS_AND_EDGES = 3;
+ // Allows snapping anywhere along the edge of the screen and magnets towards corners
+ private static final int SNAP_MODE_EDGE_MAGNET_CORNERS = 3;
+ // Allows snapping on the long edge in each orientation and magnets towards corners
+ private static final int SNAP_MODE_LONG_EDGE_MAGNET_CORNERS = 4;
// The friction multiplier to control how slippery the PIP is when flung
private static final float SCROLL_FRICTION_MULTIPLIER = 8f;
@@ -55,7 +58,7 @@
private final Context mContext;
private final ArrayList<Integer> mSnapGravities = new ArrayList<>();
- private final int mDefaultSnapMode = SNAP_MODE_CORNERS_AND_EDGES;
+ private final int mDefaultSnapMode = SNAP_MODE_EDGE_MAGNET_CORNERS;
private int mSnapMode = mDefaultSnapMode;
private final float mDefaultSizePercent;
@@ -85,7 +88,9 @@
* Updates the snap algorithm when the configuration changes.
*/
public void onConfigurationChanged() {
- mOrientation = mContext.getResources().getConfiguration().orientation;
+ Resources res = mContext.getResources();
+ mOrientation = res.getConfiguration().orientation;
+ mSnapMode = res.getInteger(com.android.internal.R.integer.config_pictureInPictureSnapMode);
calculateSnapTargets();
}
@@ -127,7 +132,8 @@
movementBounds.right + stackBounds.width(),
movementBounds.bottom + stackBounds.height());
final Rect newBounds = new Rect(stackBounds);
- if (mSnapMode == SNAP_MODE_CORNERS_AND_EDGES) {
+ if (mSnapMode == SNAP_MODE_LONG_EDGE_MAGNET_CORNERS
+ || mSnapMode == SNAP_MODE_EDGE_MAGNET_CORNERS) {
final Rect tmpBounds = new Rect();
final Point[] snapTargets = new Point[mSnapGravities.size()];
for (int i = 0; i < mSnapGravities.size(); i++) {
@@ -137,11 +143,11 @@
}
Point snapTarget = findClosestPoint(stackBounds.left, stackBounds.top, snapTargets);
float distance = distanceToPoint(snapTarget, stackBounds.left, stackBounds.top);
- final float thresh = stackBounds.width() * CORNER_MAGNET_THRESHOLD;
+ final float thresh = Math.max(stackBounds.width(), stackBounds.height())
+ * CORNER_MAGNET_THRESHOLD;
if (distance < thresh) {
newBounds.offsetTo(snapTarget.x, snapTarget.y);
} else {
- // Otherwise we snap to the edge
snapRectToClosestEdge(stackBounds, movementBounds, newBounds);
}
} else if (mSnapMode == SNAP_MODE_EDGE) {
@@ -324,11 +330,20 @@
final int fromTop = Math.abs(stackBounds.top - movementBounds.top);
final int fromRight = Math.abs(movementBounds.right - stackBounds.left);
final int fromBottom = Math.abs(movementBounds.bottom - stackBounds.top);
- if (fromLeft <= fromTop && fromLeft <= fromRight && fromLeft <= fromBottom) {
+ int shortest;
+ if (mSnapMode == SNAP_MODE_LONG_EDGE_MAGNET_CORNERS) {
+ // Only check longest edges
+ shortest = (mOrientation == Configuration.ORIENTATION_LANDSCAPE)
+ ? Math.min(fromTop, fromBottom)
+ : Math.min(fromLeft, fromRight);
+ } else {
+ shortest = Math.min(Math.min(fromLeft, fromRight), Math.min(fromTop, fromBottom));
+ }
+ if (shortest == fromLeft) {
boundsOut.offsetTo(movementBounds.left, boundedTop);
- } else if (fromTop <= fromLeft && fromTop <= fromRight && fromTop <= fromBottom) {
+ } else if (shortest == fromTop) {
boundsOut.offsetTo(boundedLeft, movementBounds.top);
- } else if (fromRight < fromLeft && fromRight < fromTop && fromRight < fromBottom) {
+ } else if (shortest == fromRight) {
boundsOut.offsetTo(movementBounds.right, boundedTop);
} else {
boundsOut.offsetTo(boundedLeft, movementBounds.bottom);
@@ -358,7 +373,8 @@
}
// Fall through
case SNAP_MODE_CORNERS_ONLY:
- case SNAP_MODE_CORNERS_AND_EDGES:
+ case SNAP_MODE_EDGE_MAGNET_CORNERS:
+ case SNAP_MODE_LONG_EDGE_MAGNET_CORNERS:
mSnapGravities.add(Gravity.TOP | Gravity.LEFT);
mSnapGravities.add(Gravity.TOP | Gravity.RIGHT);
mSnapGravities.add(Gravity.BOTTOM | Gravity.LEFT);
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index be69d9f8..d0fbe7c 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -237,6 +237,35 @@
return false;
}
+ @NonNull
+ public static <T> List<T> filter(@Nullable List<?> list, Class<T> c) {
+ if (isEmpty(list)) return Collections.emptyList();
+ ArrayList<T> result = null;
+ for (int i = 0; i < list.size(); i++) {
+ final Object item = list.get(i);
+ if (c.isInstance(item)) {
+ result = add(result, (T) item);
+ }
+ }
+ return emptyIfNull(result);
+ }
+
+ public static <T> boolean any(@Nullable List<T> items,
+ java.util.function.Predicate<T> predicate) {
+ return find(items, predicate) != null;
+ }
+
+ @Nullable
+ public static <T> T find(@Nullable List<T> items,
+ java.util.function.Predicate<T> predicate) {
+ if (isEmpty(items)) return null;
+ for (int i = 0; i < items.size(); i++) {
+ final T item = items.get(i);
+ if (predicate.test(item)) return item;
+ }
+ return null;
+ }
+
public static long total(@Nullable long[] array) {
long total = 0;
if (array != null) {
diff --git a/core/java/com/android/internal/util/BitUtils.java b/core/java/com/android/internal/util/BitUtils.java
new file mode 100644
index 0000000..a208ccb
--- /dev/null
+++ b/core/java/com/android/internal/util/BitUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.internal.util;
+
+import android.annotation.Nullable;
+
+import libcore.util.Objects;
+
+import java.util.Arrays;
+import java.util.UUID;
+
+public class BitUtils {
+ private BitUtils() {}
+
+ public static boolean maskedEquals(long a, long b, long mask) {
+ return (a & mask) == (b & mask);
+ }
+
+ public static boolean maskedEquals(byte a, byte b, byte mask) {
+ return (a & mask) == (b & mask);
+ }
+
+ public static boolean maskedEquals(byte[] a, byte[] b, @Nullable byte[] mask) {
+ if (a == null || b == null) return a == b;
+ Preconditions.checkArgument(a.length == b.length, "Inputs must be of same size");
+ if (mask == null) return Arrays.equals(a, b);
+ Preconditions.checkArgument(a.length == mask.length, "Mask must be of same size as inputs");
+ for (int i = 0; i < mask.length; i++) {
+ if (!maskedEquals(a[i], b[i], mask[i])) return false;
+ }
+ return true;
+ }
+
+ public static boolean maskedEquals(UUID a, UUID b, @Nullable UUID mask) {
+ if (mask == null) {
+ return Objects.equal(a, b);
+ }
+ return maskedEquals(a.getLeastSignificantBits(), b.getLeastSignificantBits(),
+ mask.getLeastSignificantBits())
+ && maskedEquals(a.getMostSignificantBits(), b.getMostSignificantBits(),
+ mask.getMostSignificantBits());
+ }
+}
diff --git a/core/java/com/android/internal/util/IntPair.java b/core/java/com/android/internal/util/IntPair.java
new file mode 100644
index 0000000..7992507
--- /dev/null
+++ b/core/java/com/android/internal/util/IntPair.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util;
+
+/**
+ * Utilities for treating a {@code long} as a pair of {@code int}s
+ *
+ * @hide
+ */
+public class IntPair {
+ private IntPair() {}
+
+ public static long of(int first, int second) {
+ return (((long)first) << 32) | ((long)second & 0xffffffffL);
+ }
+
+ public static int first(long intPair) {
+ return (int)(intPair >> 32);
+ }
+
+ public static int second(long intPair) {
+ return (int)intPair;
+ }
+}
diff --git a/core/java/com/android/internal/view/SurfaceCallbackHelper.java b/core/java/com/android/internal/view/SurfaceCallbackHelper.java
index 5b6a82c..507b673 100644
--- a/core/java/com/android/internal/view/SurfaceCallbackHelper.java
+++ b/core/java/com/android/internal/view/SurfaceCallbackHelper.java
@@ -17,14 +17,11 @@
package com.android.internal.view;
import android.os.RemoteException;
-import android.view.IWindow;
-import android.view.IWindowSession;
import android.view.Surface;
import android.view.SurfaceHolder;
public class SurfaceCallbackHelper {
- IWindowSession mSession;
- IWindow.Stub mWindow;
+ Runnable mRunnable;
int mFinishDrawingCollected = 0;
int mFinishDrawingExpected = 0;
@@ -37,26 +34,18 @@
if (mFinishDrawingCollected < mFinishDrawingExpected) {
return;
}
- try {
- mSession.finishDrawing(mWindow);
- } catch (RemoteException e) {
- }
+ mRunnable.run();
}
}
};
- public SurfaceCallbackHelper(IWindowSession session,
- IWindow.Stub window) {
- mSession = session;
- mWindow = window;
+ public SurfaceCallbackHelper(Runnable callbacksCollected) {
+ mRunnable = callbacksCollected;
}
public void dispatchSurfaceRedrawNeededAsync(SurfaceHolder holder, SurfaceHolder.Callback callbacks[]) {
if (callbacks == null || callbacks.length == 0) {
- try {
- mSession.finishDrawing(mWindow);
- } catch (RemoteException e) {
- }
+ mRunnable.run();
return;
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index c9f9d6f..af5fca2 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -197,7 +197,6 @@
$(JNI_H_INCLUDE) \
$(LOCAL_PATH)/android/graphics \
$(LOCAL_PATH)/../../libs/hwui \
- $(LOCAL_PATH)/../../../native/opengl/libs \
$(LOCAL_PATH)/../../../native/vulkan/include \
$(call include-path-for, bluedroid) \
$(call include-path-for, libhardware)/hardware \
@@ -287,6 +286,7 @@
libhwbinder \
libvintf \
libnativewindow \
+ libtextclassifier \
LOCAL_SHARED_LIBRARIES += \
libhwui \
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 417ef8a0..c1bb69d 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -633,8 +633,7 @@
return nullObjectReturn("Could not open file");
}
- std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file,
- SkFILEStream::kCallerPasses_Ownership));
+ std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file));
// If there is no offset for the file descriptor, we use SkFILEStream directly.
if (::lseek(descriptor, 0, SEEK_CUR) == 0) {
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index 7e417b4..a77ed62 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -42,53 +42,16 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static void Shader_destructor(JNIEnv* env, jobject o, jlong shaderHandle, jlong shaderWithLMHandle)
-{
+static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) {
SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle);
SkSafeUnref(shader);
}
-static jlong Shader_setLocalMatrix(JNIEnv* env, jobject o, jlong shaderHandle, jlong matrixHandle)
-{
- // ensure we have a valid matrix to use
- const SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
- if (NULL == matrix) {
- matrix = &SkMatrix::I();
- }
-
- // The current shader will no longer need a direct reference owned by Shader.java
- // as all the data needed is contained within the newly created LocalMatrixShader.
- SkASSERT(shaderHandle);
- sk_sp<SkShader> currentShader(reinterpret_cast<SkShader*>(shaderHandle));
-
- // Attempt to peel off an existing proxy shader and get the proxy's matrix. If
- // the proxy existed and it's matrix equals the desired matrix then just return
- // the proxy, otherwise replace it with a new proxy containing the desired matrix.
- //
- // refAsALocalMatrixShader(): if the shader contains a proxy then it unwraps the proxy
- // returning both the underlying shader and the proxy's matrix.
- // newWithLocalMatrix(): will return a proxy shader that wraps the provided shader and
- // concats the provided local matrix with the shader's matrix.
- //
- // WARNING: This proxy replacement only behaves like a setter because the Java
- // API enforces that all local matrices are set using this call and
- // not passed to the constructor of the Shader.
- SkMatrix proxyMatrix;
- sk_sp<SkShader> baseShader = currentShader->makeAsALocalMatrixShader(&proxyMatrix);
- if (baseShader.get()) {
- if (proxyMatrix == *matrix) {
- return reinterpret_cast<jlong>(currentShader.release());
- }
- return reinterpret_cast<jlong>(baseShader->makeWithLocalMatrix(*matrix).release());
- }
- return reinterpret_cast<jlong>(currentShader->makeWithLocalMatrix(*matrix).release());
-}
-
///////////////////////////////////////////////////////////////////////////////////////////////
-static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jobject jbitmap,
- jint tileModeX, jint tileModeY)
-{
+static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap,
+ jint tileModeX, jint tileModeY) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkBitmap bitmap;
if (jbitmap) {
// Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise,
@@ -97,8 +60,8 @@
}
sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
- sk_sp<SkShader> shader = image->makeShader((SkShader::TileMode)tileModeX,
- (SkShader::TileMode)tileModeY);
+ sk_sp<SkShader> shader = image->makeShader(
+ (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY, matrix);
ThrowIAE_IfNull(env, shader.get());
return reinterpret_cast<jlong>(shader.release());
@@ -106,10 +69,10 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static jlong LinearGradient_create1(JNIEnv* env, jobject o,
- jfloat x0, jfloat y0, jfloat x1, jfloat y1,
- jintArray colorArray, jfloatArray posArray, jint tileMode)
-{
+static jlong LinearGradient_create1(JNIEnv* env, jobject o, jlong matrixPtr,
+ jfloat x0, jfloat y0, jfloat x1, jfloat y1,
+ jintArray colorArray, jfloatArray posArray, jint tileMode) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkPoint pts[2];
pts[0].set(x0, y0);
pts[1].set(x1, y1);
@@ -126,17 +89,17 @@
SkShader* shader = SkGradientShader::MakeLinear(pts,
reinterpret_cast<const SkColor*>(colorValues), pos, count,
- static_cast<SkShader::TileMode>(tileMode)).release();
+ static_cast<SkShader::TileMode>(tileMode), /* flags */ 0, matrix).release();
env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT);
ThrowIAE_IfNull(env, shader);
return reinterpret_cast<jlong>(shader);
}
-static jlong LinearGradient_create2(JNIEnv* env, jobject o,
- jfloat x0, jfloat y0, jfloat x1, jfloat y1,
- jint color0, jint color1, jint tileMode)
-{
+static jlong LinearGradient_create2(JNIEnv* env, jobject o, jlong matrixPtr,
+ jfloat x0, jfloat y0, jfloat x1, jfloat y1, jint color0, jint color1, jint tileMode) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
+
SkPoint pts[2];
pts[0].set(x0, y0);
pts[1].set(x1, y1);
@@ -145,7 +108,8 @@
colors[0] = color0;
colors[1] = color1;
- SkShader* s = SkGradientShader::MakeLinear(pts, colors, NULL, 2, (SkShader::TileMode)tileMode).release();
+ SkShader* s = SkGradientShader::MakeLinear(pts, colors, NULL, 2,
+ (SkShader::TileMode)tileMode, /* flags */ 0, matrix).release();
ThrowIAE_IfNull(env, s);
return reinterpret_cast<jlong>(s);
@@ -153,8 +117,9 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static jlong RadialGradient_create1(JNIEnv* env, jobject, jfloat x, jfloat y, jfloat radius,
- jintArray colorArray, jfloatArray posArray, jint tileMode) {
+static jlong RadialGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
+ jfloat radius, jintArray colorArray, jfloatArray posArray, jint tileMode) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkPoint center;
center.set(x, y);
@@ -170,7 +135,7 @@
SkShader* shader = SkGradientShader::MakeRadial(center, radius,
reinterpret_cast<const SkColor*>(colorValues), pos, count,
- static_cast<SkShader::TileMode>(tileMode)).release();
+ static_cast<SkShader::TileMode>(tileMode), /* flags */ 0, matrix).release();
env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues),
JNI_ABORT);
@@ -178,8 +143,9 @@
return reinterpret_cast<jlong>(shader);
}
-static jlong RadialGradient_create2(JNIEnv* env, jobject, jfloat x, jfloat y, jfloat radius,
+static jlong RadialGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y, jfloat radius,
jint color0, jint color1, jint tileMode) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkPoint center;
center.set(x, y);
@@ -188,15 +154,16 @@
colors[1] = color1;
SkShader* s = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2,
- (SkShader::TileMode)tileMode).release();
+ (SkShader::TileMode)tileMode, /* flags */ 0, matrix).release();
ThrowIAE_IfNull(env, s);
return reinterpret_cast<jlong>(s);
}
///////////////////////////////////////////////////////////////////////////////
-static jlong SweepGradient_create1(JNIEnv* env, jobject, jfloat x, jfloat y,
+static jlong SweepGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
jintArray jcolors, jfloatArray jpositions) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
size_t count = env->GetArrayLength(jcolors);
const jint* colors = env->GetIntArrayElements(jcolors, NULL);
@@ -208,70 +175,78 @@
#endif
SkShader* shader = SkGradientShader::MakeSweep(x, y,
- reinterpret_cast<const SkColor*>(colors), pos, count).release();
+ reinterpret_cast<const SkColor*>(colors), pos, count, /* flags */ 0, matrix).release();
env->ReleaseIntArrayElements(jcolors, const_cast<jint*>(colors),
JNI_ABORT);
ThrowIAE_IfNull(env, shader);
return reinterpret_cast<jlong>(shader);
}
-static jlong SweepGradient_create2(JNIEnv* env, jobject, jfloat x, jfloat y,
+static jlong SweepGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat x, jfloat y,
int color0, int color1) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkColor colors[2];
colors[0] = color0;
colors[1] = color1;
- SkShader* s = SkGradientShader::MakeSweep(x, y, colors, NULL, 2).release();
+ SkShader* s = SkGradientShader::MakeSweep(x, y, colors, NULL, 2,
+ /* flags */ 0, matrix).release();
ThrowIAE_IfNull(env, s);
return reinterpret_cast<jlong>(s);
}
///////////////////////////////////////////////////////////////////////////////////////////////
-static jlong ComposeShader_create(JNIEnv* env, jobject o,
- jlong shaderAHandle, jlong shaderBHandle, jint xfermodeHandle)
-{
+static jlong ComposeShader_create(JNIEnv* env, jobject o, jlong matrixPtr,
+ jlong shaderAHandle, jlong shaderBHandle, jint xfermodeHandle) {
+ const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
SkShader* shaderA = reinterpret_cast<SkShader *>(shaderAHandle);
SkShader* shaderB = reinterpret_cast<SkShader *>(shaderBHandle);
SkBlendMode mode = static_cast<SkBlendMode>(xfermodeHandle);
- SkShader* shader = SkShader::MakeComposeShader(sk_ref_sp(shaderA),
- sk_ref_sp(shaderB),
- mode).release();
+ sk_sp<SkShader> baseShader(SkShader::MakeComposeShader(
+ sk_ref_sp(shaderA), sk_ref_sp(shaderB), mode));
+
+ SkShader* shader;
+
+ if (matrix) {
+ shader = baseShader->makeWithLocalMatrix(*matrix).release();
+ } else {
+ shader = baseShader.release();
+ }
return reinterpret_cast<jlong>(shader);
}
///////////////////////////////////////////////////////////////////////////////////////////////
static const JNINativeMethod gColorMethods[] = {
- { "nativeRGBToHSV", "(III[F)V", (void*)Color_RGBToHSV },
- { "nativeHSVToColor", "(I[F)I", (void*)Color_HSVToColor }
+ { "nativeRGBToHSV", "(III[F)V", (void*)Color_RGBToHSV },
+ { "nativeHSVToColor", "(I[F)I", (void*)Color_HSVToColor }
};
static const JNINativeMethod gShaderMethods[] = {
- { "nativeDestructor", "(J)V", (void*)Shader_destructor },
- { "nativeSetLocalMatrix", "(JJ)J", (void*)Shader_setLocalMatrix }
+ { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref },
};
static const JNINativeMethod gBitmapShaderMethods[] = {
- { "nativeCreate", "(Landroid/graphics/Bitmap;II)J", (void*)BitmapShader_constructor },
+ { "nativeCreate", "(JLandroid/graphics/Bitmap;II)J", (void*)BitmapShader_constructor },
};
static const JNINativeMethod gLinearGradientMethods[] = {
- { "nativeCreate1", "(FFFF[I[FI)J", (void*)LinearGradient_create1 },
- { "nativeCreate2", "(FFFFIII)J", (void*)LinearGradient_create2 },
+ { "nativeCreate1", "(JFFFF[I[FI)J", (void*)LinearGradient_create1 },
+ { "nativeCreate2", "(JFFFFIII)J", (void*)LinearGradient_create2 },
};
static const JNINativeMethod gRadialGradientMethods[] = {
- { "nativeCreate1", "(FFF[I[FI)J", (void*)RadialGradient_create1 },
- { "nativeCreate2", "(FFFIII)J", (void*)RadialGradient_create2 },
+ { "nativeCreate1", "(JFFF[I[FI)J", (void*)RadialGradient_create1 },
+ { "nativeCreate2", "(JFFFIII)J", (void*)RadialGradient_create2 },
};
static const JNINativeMethod gSweepGradientMethods[] = {
- { "nativeCreate1", "(FF[I[F)J", (void*)SweepGradient_create1 },
- { "nativeCreate2", "(FFII)J", (void*)SweepGradient_create2 },
+ { "nativeCreate1", "(JFF[I[F)J", (void*)SweepGradient_create1 },
+ { "nativeCreate2", "(JFFII)J", (void*)SweepGradient_create2 },
};
static const JNINativeMethod gComposeShaderMethods[] = {
- { "nativeCreate", "(JJI)J", (void*)ComposeShader_create },
+ { "nativeCreate", "(JJJI)J", (void*)ComposeShader_create },
};
int register_android_graphics_Shader(JNIEnv* env)
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index c261e41..253daaa 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -178,10 +178,10 @@
// from one to the other (though SkClipOp is destined to become a strict subset)
static_assert(SkRegion::kDifference_Op == static_cast<SkRegion::Op>(SkClipOp::kDifference), "");
static_assert(SkRegion::kIntersect_Op == static_cast<SkRegion::Op>(SkClipOp::kIntersect), "");
-static_assert(SkRegion::kUnion_Op == static_cast<SkRegion::Op>(SkClipOp::kUnion), "");
-static_assert(SkRegion::kXOR_Op == static_cast<SkRegion::Op>(SkClipOp::kXOR), "");
-static_assert(SkRegion::kReverseDifference_Op == static_cast<SkRegion::Op>(SkClipOp::kReverseDifference), "");
-static_assert(SkRegion::kReplace_Op == static_cast<SkRegion::Op>(SkClipOp::kReplace), "");
+static_assert(SkRegion::kUnion_Op == static_cast<SkRegion::Op>(SkClipOp::kUnion_deprecated), "");
+static_assert(SkRegion::kXOR_Op == static_cast<SkRegion::Op>(SkClipOp::kXOR_deprecated), "");
+static_assert(SkRegion::kReverseDifference_Op == static_cast<SkRegion::Op>(SkClipOp::kReverseDifference_deprecated), "");
+static_assert(SkRegion::kReplace_Op == static_cast<SkRegion::Op>(SkClipOp::kReplace_deprecated), "");
static SkClipOp opHandleToClipOp(jint opHandle) {
// The opHandle is defined in Canvas.java to be Region::Op
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index f221392..6e8c931 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -452,10 +452,6 @@
const RenderProperties& props = node.properties();
uirenderer::Rect bounds(props.getWidth(), props.getHeight());
transform.mapRect(bounds);
- bounds.left -= info.windowInsetLeft;
- bounds.right -= info.windowInsetLeft;
- bounds.top -= info.windowInsetTop;
- bounds.bottom -= info.windowInsetTop;
if (CC_LIKELY(transform.isPureTranslate())) {
// snap/round the computed bounds, so they match the rounding behavior
@@ -627,9 +623,9 @@
int register_android_view_RenderNode(JNIEnv* env) {
jclass clazz = FindClassOrDie(env, "android/view/SurfaceView");
gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz,
- "updateWindowPosition_renderWorker", "(JIIII)V");
+ "updateSurfacePosition_renderWorker", "(JIIII)V");
gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz,
- "windowPositionLost_uiRtSync", "(J)V");
+ "surfacePositionLost_uiRtSync", "(J)V");
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 6192271..713287e 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -21,6 +21,7 @@
#include "jni.h"
#include "JNIHelp.h"
#include "android_os_Parcel.h"
+#include "android/graphics/GraphicBuffer.h"
#include "android/graphics/GraphicsJNI.h"
#include "core_jni_helpers.h"
@@ -496,6 +497,30 @@
return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal);
}
+static jint nativeAttachAndQueueBuffer(JNIEnv *env, jclass clazz, jlong nativeObject,
+ jobject graphicBuffer) {
+ Surface* surface = reinterpret_cast<Surface*>(nativeObject);
+ sp<GraphicBuffer> bp = graphicBufferForJavaObject(env, graphicBuffer);
+ if (bp == nullptr) {
+ return BAD_VALUE;
+ }
+ int err = ((ANativeWindow*)surface)->perform(surface, NATIVE_WINDOW_API_CONNECT,
+ NATIVE_WINDOW_API_CPU);
+ if (err != OK) {
+ return err;
+ }
+ err = surface->attachBuffer(bp->getNativeBuffer());
+ if (err != OK) {
+ return err;
+ }
+ err = ((ANativeWindow*)surface)->queueBuffer(surface, bp->getNativeBuffer(), -1);
+ if (err != OK) {
+ return err;
+ }
+ err = surface->disconnect(NATIVE_WINDOW_API_CPU);
+ return err;
+}
+
namespace uirenderer {
using namespace android::uirenderer::renderthread;
@@ -574,6 +599,7 @@
{"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber },
{"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode },
{"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect},
+ {"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer},
// HWUI context
{"nHwuiCreate", "(JJ)J", (void*) hwui::create },
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index a81901d..6fbf49b 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -693,7 +693,6 @@
return JNI_TRUE;
}
-
static void nativeDeferTransactionUntil(JNIEnv* env, jclass clazz, jlong nativeObject,
jobject handleObject, jlong frameNumber) {
auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
@@ -702,6 +701,27 @@
ctrl->deferTransactionUntil(handle, frameNumber);
}
+static void nativeDeferTransactionUntilSurface(JNIEnv* env, jclass clazz, jlong nativeObject,
+ jlong surfaceObject, jlong frameNumber) {
+ auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
+ sp<Surface> barrier = reinterpret_cast<Surface *>(surfaceObject);
+
+ ctrl->deferTransactionUntil(barrier, frameNumber);
+}
+
+static void nativeReparentChildren(JNIEnv* env, jclass clazz, jlong nativeObject,
+ jobject newParentObject) {
+ auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
+ sp<IBinder> handle = ibinderForJavaObject(env, newParentObject);
+
+ ctrl->reparentChildren(handle);
+}
+
+static void nativeSeverChildren(JNIEnv* env, jclass clazz, jlong nativeObject) {
+ auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
+ ctrl->detachChildren();
+}
+
static void nativeSetOverrideScalingMode(JNIEnv* env, jclass clazz, jlong nativeObject,
jint scalingMode) {
auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
@@ -824,6 +844,12 @@
(void*)nativeSetDisplayPowerMode },
{"nativeDeferTransactionUntil", "(JLandroid/os/IBinder;J)V",
(void*)nativeDeferTransactionUntil },
+ {"nativeDeferTransactionUntilSurface", "(JJJ)V",
+ (void*)nativeDeferTransactionUntilSurface },
+ {"nativeReparentChildren", "(JLandroid/os/IBinder;)V",
+ (void*)nativeReparentChildren } ,
+ {"nativeSeverChildren", "(J)V",
+ (void*)nativeSeverChildren } ,
{"nativeSetOverrideScalingMode", "(JI)V",
(void*)nativeSetOverrideScalingMode },
{"nativeGetHandle", "(J)Landroid/os/IBinder;",
diff --git a/core/jni/android_view_SurfaceSession.cpp b/core/jni/android_view_SurfaceSession.cpp
index dad6958..508d897 100644
--- a/core/jni/android_view_SurfaceSession.cpp
+++ b/core/jni/android_view_SurfaceSession.cpp
@@ -24,6 +24,7 @@
#include <utils/RefBase.h>
#include <gui/SurfaceComposerClient.h>
+#include <gui/Surface.h>
namespace android {
@@ -45,6 +46,13 @@
return reinterpret_cast<jlong>(client);
}
+static jlong nativeCreateScoped(JNIEnv* env, jclass clazz, jlong surfaceObject) {
+ Surface *parent = reinterpret_cast<Surface*>(surfaceObject);
+ SurfaceComposerClient* client = new SurfaceComposerClient(parent->getIGraphicBufferProducer());
+ client->incStrong((void*)nativeCreate);
+ return reinterpret_cast<jlong>(client);
+}
+
static void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) {
SurfaceComposerClient* client = reinterpret_cast<SurfaceComposerClient*>(ptr);
client->decStrong((void*)nativeCreate);
@@ -55,11 +63,12 @@
client->dispose();
}
-
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "nativeCreate", "()J",
(void*)nativeCreate },
+ { "nativeCreateScoped", "(J)J",
+ (void*)nativeCreateScoped },
{ "nativeDestroy", "(J)V",
(void*)nativeDestroy },
{ "nativeKill", "(J)V",
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 37eae48a..e1c0a21 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -27,7 +27,7 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
-#include <EGL/egl_cache.h>
+#include <private/EGL/cache.h>
#include <utils/Looper.h>
#include <utils/RefBase.h>
@@ -178,13 +178,9 @@
}
}
// TODO: This is hacky
- info.windowInsetLeft = -stagingProperties().getLeft();
- info.windowInsetTop = -stagingProperties().getTop();
info.updateWindowPositions = true;
RenderNode::prepareTree(info);
info.updateWindowPositions = false;
- info.windowInsetLeft = 0;
- info.windowInsetTop = 0;
info.errorHandler = nullptr;
}
@@ -891,7 +887,7 @@
static void android_view_ThreadedRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
jstring diskCachePath) {
const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
- egl_cache_t::get()->setCacheFilename(cacheArray);
+ android::egl_set_cache_filename(cacheArray);
env->ReleaseStringUTFChars(diskCachePath, cacheArray);
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index c3f0e9d..0ab27f2 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -155,24 +155,6 @@
}
}
-// Resets nice priority for zygote process. Zygote priority can be set
-// to high value during boot phase to speed it up. We want to ensure
-// zygote is running at normal priority before childs are forked from it.
-//
-// This ends up being called repeatedly before each fork(), but there's
-// no real harm in that.
-static void ResetNicePriority(JNIEnv* env) {
- errno = 0;
- int prio = getpriority(PRIO_PROCESS, 0);
- if (prio == -1 && errno != 0) {
- ALOGW("getpriority failed: %s\n", strerror(errno));
- }
- if (prio != 0 && setpriority(PRIO_PROCESS, 0, 0) != 0) {
- ALOGE("setpriority(%d, 0, 0) failed: %s", PRIO_PROCESS, strerror(errno));
- RuntimeAbort(env, __LINE__, "setpriority failed");
- }
-}
-
// Sets the SIGCHLD handler back to default behavior in zygote children.
static void UnsetSigChldHandler() {
struct sigaction sa;
@@ -526,8 +508,6 @@
RuntimeAbort(env, __LINE__, "Unable to restat file descriptor table.");
}
- ResetNicePriority(env);
-
pid_t pid = fork();
if (pid == 0) {
@@ -806,10 +786,6 @@
UnmountTree("/storage");
}
-static void com_android_internal_os_Zygote_nativeResetNicePriority(JNIEnv* env, jclass) {
- ResetNicePriority(env);
-}
-
static const JNINativeMethod gMethods[] = {
{ "nativeForkAndSpecialize",
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
@@ -819,9 +795,7 @@
{ "nativeAllowFileAcrossFork", "(Ljava/lang/String;)V",
(void *) com_android_internal_os_Zygote_nativeAllowFileAcrossFork },
{ "nativeUnmountStorageOnInit", "()V",
- (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit },
- { "nativeResetNicePriority", "()V",
- (void *) com_android_internal_os_Zygote_nativeResetNicePriority }
+ (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit }
};
int register_com_android_internal_os_Zygote(JNIEnv* env) {
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index 56bec18..1ac05f9 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -22,9 +22,9 @@
#include <utils/misc.h>
-#include <EGL/egl_display.h>
#include <EGL/egl.h>
#include <GLES/gl.h>
+#include <private/EGL/display.h>
#include <gui/Surface.h>
#include <gui/GLConsumer.h>
@@ -180,8 +180,7 @@
static jint jni_getInitCount(JNIEnv *_env, jobject _clazz, jobject display) {
EGLDisplay dpy = getDisplay(_env, display);
- egl_display_t* eglDisplay = get_display_nowake(dpy);
- return eglDisplay ? eglDisplay->getRefsCount() : 0;
+ return android::egl_get_init_count(dpy);
}
static jboolean jni_eglReleaseThread(JNIEnv *_env, jobject _this) {
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index ee50c29..98c9e78 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -97,7 +97,7 @@
SettingProto download_max_bytes_over_mobile = 52;
SettingProto download_recommended_max_bytes_over_mobile = 53;
SettingProto hdmi_control_enabled = 54;
- SettingProto hdmi_system_audio_enabled = 55;
+ SettingProto hdmi_system_audio_control_enabled = 55;
SettingProto hdmi_control_auto_wakeup_enabled = 56;
SettingProto hdmi_control_auto_device_off_enabled = 57;
SettingProto mhl_input_switching_enabled = 58;
@@ -341,7 +341,7 @@
SettingProto input_methods_subtype_history = 5;
SettingProto input_method_selector_visibility = 6;
SettingProto voice_interaction_service = 7;
- SettingProto auto_fill_service = 8;
+ SettingProto autofill_service = 8;
SettingProto bluetooth_hci_log = 9;
SettingProto user_setup_complete = 10;
SettingProto completed_category_prefix = 11;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c2a2e69..c991f22 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -216,6 +216,7 @@
<protected-broadcast android:name="android.btopp.intent.action.OPEN_INBOUND" />
<protected-broadcast android:name="android.btopp.intent.action.TRANSFER_COMPLETE" />
<protected-broadcast android:name="android.btopp.intent.action.ACCEPT" />
+ <protected-broadcast android:name="android.btopp.intent.action.DECLINE" />
<protected-broadcast android:name="com.android.bluetooth.gatt.REFRESH_BATCHED_SCAN" />
<protected-broadcast android:name="com.android.bluetooth.pbap.authchall" />
<protected-broadcast android:name="com.android.bluetooth.pbap.userconfirmtimeout" />
@@ -2305,6 +2306,10 @@
<permission android:name="android.permission.RETRIEVE_WINDOW_TOKEN"
android:protectionLevel="signature" />
+ <!-- @hide Allows an application to modify accessibility information from another app. -->
+ <permission android:name="android.permission.MODIFY_ACCESSIBILITY_DATA"
+ android:protectionLevel="signature" />
+
<!-- @hide Allows an application to collect frame statistics -->
<permission android:name="android.permission.FRAME_STATS"
android:protectionLevel="signature" />
@@ -2440,10 +2445,16 @@
<permission android:name="android.permission.BIND_VOICE_INTERACTION"
android:protectionLevel="signature" />
- <!-- Must be required by a {@link android.service.autofill.AutoFillService},
+ <!-- Must be required by a {@link android.service.autofill.AutofillService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
+ <permission android:name="android.permission.BIND_AUTOFILL"
+ android:protectionLevel="signature" />
+
+ <!-- TODO(b/35956626): temporary until clients change to BIND_AUTOFILL
+ <p>Protection level: signature
+ -->
<permission android:name="android.permission.BIND_AUTO_FILL"
android:protectionLevel="signature" />
@@ -3285,6 +3296,11 @@
<permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to show notifications before the device is provisioned.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.NOTIFICATION_DURING_SETUP"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to manage auto-fill sessions.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_AUTO_FILL"
diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml
index 9b90de6..133265b 100644
--- a/core/res/res/layout/autofill_dataset_picker.xml
+++ b/core/res/res/layout/autofill_dataset_picker.xml
@@ -18,6 +18,7 @@
android:id="@+id/autofill_dataset_picker"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
- android:divider="?android:attr/listDivider"
- android:background="#ffffffff">
+ android:divider="@null"
+ android:background="#ffffffff"
+ android:elevation="@dimen/floating_window_z">
</ListView>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 08389b9..0ec27ba 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Inhoud versteek"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Inhoud word versteek volgens beleid"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuele sleutelbord"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fisieke sleutelbord"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sekuriteit"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Motormodus"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Rekeningstatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Ontwikkelaarboodskappe"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Opdaterings"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Netwerkstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Netwerkwaarskuwings"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Toesteladministrasie"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opletberigte"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kleinhandeldemonstrasie"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-verbinding"</string>
<string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skakel oor na persoonlik"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Laat die program toe om Tuisskerm-kortpaaie te verwyder sonder gebruikerinmenging."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"herlei uitgaande oproepe"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Laat die program toe om te sien watter nommer tydens \'n uitgaande oproep geskakel word, met die opsie om die oproep na \'n ander nommer te herlei of die oproep heeltemal te beëindig."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"antwoord foonoproepe"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Laat die program toe om inkomende foonoproepe te antwoord."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ontvang teksboodskappe (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Laat die program toe om SMS-boodskappe te ontvang en te verwerk. Dit beteken dat die program boodskappe wat na jou toestel gestuur is, kan monitor of uitvee, sonder dat jy dit gesien het."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ontvang teksboodskappe (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om taal en uitleg te kies"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> teken oor ander programme"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-program verskyn bo-op."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dele van hierdie program sal dalk altyd sigbaar wees. Skakel hierdie kenmerk af as dit nie reg werk nie."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SKAKEL AF"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Berei tans <xliff:g id="NAME">%s</xliff:g> voor"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kyk tans vir foute"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Om foto\'s en media oor te dra"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Gekorrupteerde <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is korrup. Tik om reg te maak."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Niegesteunde <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Hierdie toestel steun nie hierdie <xliff:g id="NAME">%s</xliff:g> nie. Tik om in \'n gesteunde formaat op te stel."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwags verwyder"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demonteer <xliff:g id="NAME">%s</xliff:g> voordat dit verwyder word om dataverlies te voorkom"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Het <xliff:g id="NAME">%s</xliff:g> verwyder"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-versoek is gewysig tot USSD-versoek."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-versoek is gewysig tot nuwe SS-versoek."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Uitvou-knoppie"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vou uit"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Vou in"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"wissel uitvou-aksie"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android-USB-randpoort"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index b5863fe..448ccf6 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ይዘቶች ተደብቀዋል"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ይዘቶች በመመሪያ ተደብቀዋል"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ምናባዊ የቁልፍ ሰሌዳ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"አካላዊ ቁልፍ ሰሌዳ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ደህንነት"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"የመኪና ሁነታ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"የመለያ ሁኔታ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"የገንቢ መልዕክቶች"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"ዝማኔዎች"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"የአውታረ መረብ ሁኔታ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"የአውታረ መረብ ማንቂያዎች"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"የቪፒኤን ሁኔታ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"የመሣሪያ አስተዳደር"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ማንቂያዎች"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"የችርቻሮ ማሳያ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"የዩኤስቢ ግንኙነት"</string>
<string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ስርዓት"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ወደ የግል ቀይር"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"መተግበሪያው ያለተጠቃሚ ጣልቃ-ገብነት የመነሻ ማያ ገጽ አቋራጮችን እንዲያስወግድ ያስችለዋል።"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"የወጪ ጥሪዎች አቅጣጫ ቀይር"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"በወጪ ጥሪ ጊዜ ጥሪውን ወደተለየ ቁጥር ከማዞር ወይም ጥሪውን በአጠቃላይ ከመተው አማራጭ ጋር እየተደወለለት ያለውን ቁጥር እንዲያይ ያስችለዋል።"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"የስልክ ጥሪዎችን አንሳ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"መተግበሪያው ገቢ የስልክ ጥሪን እንዲያነሳ ያስችለዋል።"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"የፅሁፍ መልዕክቶችን ተቀበል (ኤስ.ኤም.ኤስ.)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"መተግበሪያው የኤስ.ኤም.ኤስ. መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልዕክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"የፅሁፍ መልዕክቶችን ተቀበል (ኤም.ኤም.ኤስ.)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ቋንቋ እና አቀማመጥን ለመምረጥ መታ ያድርጉ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ ሣል"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> መተግበሪያ ከላይ እየታየ ያለ።"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"የዚህ መተግበሪያ ክፍሎች በሁሉም ጊዜያት የሚታዩ እንደሆኑ ሊቆዩ ይችላሉ። ይህ ባህሪ በትክክል የማይሠራ ከሆነ ያጥፉት።"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"አጥፋ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ን በማዘጋጀት ላይ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ስህተቶች ካሉ በመፈተሽ ላይ"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ፎቶዎችን እና ማህደረመረጃን ለማስተላለፍ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ተበላሽቷል <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ተበላሽቷል። ለማስተካከል መታ ያድርጉ።"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ያልተደገፈ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ይህ መሣሪያ ይህን <xliff:g id="NAME">%s</xliff:g> አይደግፍም። በሚደገፍ ቅርጸት ለማዘጋጀት መታ ያድርጉ።"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ሳይታሰብ ተወግዷል"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ውሂብ እንዳይጠፋ ለመከላከል ከማስወገድዎ በፊት <xliff:g id="NAME">%s</xliff:g>ን ያላቅቁት"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"«<xliff:g id="NAME">%s</xliff:g>» ተወግዷል"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ጥያቄ ወደ USSD ጥያቄ ተሻሽሎዋል።"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ጥያቄ ወደ አዲስ SS ጥያቄ ተሻሽሎዋል።"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"የስራ መገለጫ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"የዘርጋ አዝራር"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ዘርጋ"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ሰብስብ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ዝርጋታን ቀያይር"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"የAndroid USB Peripheral ወደብ"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 238c78b..7845a4e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -256,32 +256,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"المحتويات مخفية"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"تم إخفاء المحتويات بواسطة السياسة"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"لوحة المفاتيح الظاهرية"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"لوحة المفاتيح الفعلية"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"الأمان"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"وضع السيارة"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"حالة الحساب"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"رسائل مطوّر البرامج"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"التحديثات"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"حالة الشبكة"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"تنبيهات الشبكة"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"حالة الشبكة الظاهرية الخاصة"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"إدارة الجهاز"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"التنبيهات"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"عرض توضيحي لبائع التجزئة"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"اتصال USB"</string>
<string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"التبديل إلى الشخصي"</string>
@@ -330,10 +318,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"للسماح للتطبيق بإزالة اختصارات من الشاشة الرئيسية بدون تدخل المستخدم."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"إعادة توجيه المكالمات الصادرة"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"للسماح للتطبيق بالاطلاع على الرقم الذي يتم الاتصال به عند إجراء مكالمة صادرة مع وجود الخيار لإعادة توجيه المكالمة إلى رقم آخر أو إنهاء المكالمة تمامًا."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"الرد على المكالمات الهاتفية"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"للسماح للتطبيق بالرد على مكالمة هاتفية واردة."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"تلقي رسائل نصية (رسائل قصيرة SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"للسماح للتطبيق بتلقي ومعالجة الرسائل القصيرة SMS. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها إلى جهازك أو حذفها بدون عرضها لك."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"تلقي رسائل نصية (رسائل وسائط متعددة)"</string>
@@ -1277,9 +1263,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"انقر لاختيار لغة وتنسيق"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"يتم عرض تطبيق <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"قد تظل أجزاء من هذا التطبيق مرئية في جميع الأوقات. فإذا كانت هذه الميزة لا تعمل بشكل صحيح، يمكنك إيقافها."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"إيقاف"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"جارٍ تحضير <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"جارٍ التحقق من الأخطاء"</string>
@@ -1287,8 +1276,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"لنقل الصور والوسائط"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"أصاب <xliff:g id="NAME">%s</xliff:g> التلف"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> تالف. انقر لإصلاحه."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> غير متوافق"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"هذا الجهاز غير متوافق مع <xliff:g id="NAME">%s</xliff:g> هذا. انقر للإعداد بتنسيق متوافق."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"تمت إزالة <xliff:g id="NAME">%s</xliff:g> بشكل غير متوقع"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"إلغاء تحميل <xliff:g id="NAME">%s</xliff:g> قبل الإزالة لتجنب فقد البيانات"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"تمت إزالة <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1788,7 +1781,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"يتم تعديل طلب SS إلى طلب USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"يتم تعديل طلب SS إلى طلب SS الجديد."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"الملف الشخصي للعمل"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"زر \"توسيع\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"توسيع"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"تصغير"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"تبديل التوسيع"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"منفذ الأجهزة الطرفية المزودة بكابل USB ونظام التشغيل Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 25f9ca9..7e8adc2 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Məzmun gizlidir"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Məzmun siyasət tərəfindən gizlədilib"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fiziki klaviatura"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Təhlükəsizlik"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Avtomobil rejimi"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Hesab statusu"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Developer mesajı"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Güncəlləmələr"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Şəbəkə statusu"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Şəbəkə siqnalları"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN statusu"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Cihaz administrasiyası"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Siqnallar"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Pərakəndə demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB əlaqə"</string>
<string name="safeMode" msgid="2788228061547930246">"Təhlükəsiz rejim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistemi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Şəxsi profilə keçirin"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"İstifadəçi müdaxiləsi olmadan tətbiqə İş Stolu qısayollarını silməyə icazə verir."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"gedən zənglərin marşrutunu dəyişmək"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Tətbiqə gedən zəng zamanı yığılan nömrəni görməyə imkan verir. Bu zaman zəngi başqa nömrəyə yönləndirmək və ya bütün zəngləri ləğv etmək funsiyası da təqdim olunur."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"telefon zənglərinə cavab verin"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Gələn telefon zənglərinə cavab verməsi üçün tətbiqlərə icazə verin."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"SMS qəbul etmək"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Tətbiqə MMS mesajlarını almaq və emal etmək icazəsi verir. Bu o deməkdir ki, tətbiq sizin mesajlarınızı sizə göstərmədən monitorinq edə və ya silə bilər."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"mətn mesajlarını qəbul edir (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dil və tərtibatı seçmək üçün tıklayın"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> digər tətbiqlərin üzərinə çəkilir"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> tətbiqi üstdə göstərilir."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu tətbiqin hissələri həmişə görünən qala bilər. Bu funksiya düzgün işləmirsə, onu deaktiv edin."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTİV EDİN"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanır"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Səhvlər yoxlanılır"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoların və medianın köçürülməsi üçün"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Zədələnmiş <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> zədələnib. Düzəltmək üçün tıklayın."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Dəstəklənməyən <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> bu cihaz tərəfindən dəstəklənmir. Dəstəklənən formatda ayarlamaq üçün tıklayın."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> gözlənilmədən çıxarıldı"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Data itkisinin qarşısını almaq üçün <xliff:g id="NAME">%s</xliff:g> kartını çıxarın"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> çıxarıldı"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS sorğusu USSD sorğusuna dəyişdirildi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS sorğusu yeni SS sorğusuna dəyişdirildi."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"İş profili"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Genişlik düyməsi"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Genişləndirin"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Yığcamlaşdırın"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"keçid genişlənməsi"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 9b727e6..6f9e4cb 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sadržaj je sakriven"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Sadržaj je sakriven smernicama"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizička tastatura"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Bezbednost"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Režim rada u automobilu"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status naloga"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Poruke za programere"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ažuriranja"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status mreže"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Obaveštenja u vezi sa mrežom"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN-a"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administriranje uređaja"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Obaveštenja"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Režim demonstracije za maloprodajne objekte"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
<string name="safeMode" msgid="2788228061547930246">"Bezbedni režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Pređi na Lični profil"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Omogućava aplikaciji da uklanja prečice sa početnog ekrana bez intervencije korisnika."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"preusmeravanje odlaznih poziva"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Dozvoljava aplikaciji da vidi koji broj se bira pri odlaznom pozivu uz opciju da preusmeri poziv na drugi broj ili ga potpuno prekine."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odgovaraj na telefonske pozive"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Dozvoljava aplikaciji da odgovori na dolazni telefonski poziv."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"prijem tekstualnih poruka (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Dozvoljava aplikaciji da prima i obrađuje SMS poruke. To znači da aplikacija može da nadgleda ili briše poruke koje se šalju uređaju, a da vam ih ne prikaže."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"prijem tekstualnih poruka (MMS)"</string>
@@ -1217,9 +1203,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste izabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplikacija"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delovi ove aplikacije mogu da ostanu vidljivi u svakom trenutku. Ako ova funkcija ne radi ispravno, isključite je."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> se priprema"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Proverava se da li postoje greške"</string>
@@ -1227,8 +1216,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prenos slika i medija"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen. Dodirnite da biste ga popravili."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Uređaj <xliff:g id="NAME">%s</xliff:g> nije podržan"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ovaj uređaj ne podržava ovaj uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da biste podesili podržani format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Uređaj <xliff:g id="NAME">%s</xliff:g> je neočekivano uklonjen"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> pre uklanjanja da ne biste izgubili podatke"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
@@ -1698,7 +1691,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtev je promenjen u USSD zahtev."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtev je promenjen u novi SS zahtev."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za Work"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Dugme Proširi"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"uključite/isključite proširenje"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB port za periferijske uređaje"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 6f9fd0b..cef147c 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Змесціва схавана"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Змесціва, схаванае ў адпаведнасці з палітыкай"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальная клавіятура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Фізічная клавіятура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Бяспека"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Рэжым \"У машыне\""</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Стан уліковага запісу"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Паведамленні для распрацоўшчыкаў"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Абнаўленні"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Стан сеткі"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Абвесткі сеткі"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Стан VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Адміністраванне прылады"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Абвесткi"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Дэманстрацыйны рэжым для пунктаў продажу"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Падключэнне USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Бяспечны рэжым"</string>
<string name="android_system_label" msgid="6577375335728551336">"Сістэма Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Пераключыцца на асабісты"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Дазваляе праграме выдаляць ярлыкі з Галоўнага экрана без умяшання карыстальніка."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"перанакіраванне зыходзячых выклікіаў"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Дазваляе праграме бачыць набраны нумар падчас выходнага выкліку з магчымасцю перанакіравання выкліку на іншы нумар або спынення выкліку ў цэлым."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"адказваць на тэлефонныя выклікі"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Дазваляе праграме адказваць на ўваходны тэлефонны выклік."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"атрыманне тэкставых паведамленняў (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Дазваляе прыкладанням атрымліваць і апрацоўваць SMS-паведамленні. Гэта значыць, што прыкладанне можа кантраляваць або выдаляць паведамленні, адпраўленыя на прыладу, не паказваючы іх вам."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"атрыманне тэкставых паведамленняў (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Дакраніцеся, каб выбраць мову і раскладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> паверх іншых праграм"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Праграма <xliff:g id="NAME">%s</xliff:g> паказваецца зверху."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Часткі гэтай праграмы могуць заставацца бачнымі ў любы час. Калі гэта функцыя не працуе належным чынам, адключыце яе."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"АДКЛЮЧЫЦЬ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Падрыхтоўка <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Праверка на наяўнасць памылак"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перадачы фатаграфій і медыяфайлаў"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Пашкоджаны носьбіт <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носьбіт <xliff:g id="NAME">%s</xliff:g> пашкоджаны. Дакраніцеся, каб выправіць."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не падтрымліваецца"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Гэта прылада не падтрымлівае носьбіт <xliff:g id="NAME">%s</xliff:g>. Дакраніцеся, каб наладзіць яго ў фармаце, які падтрымліваецца."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Носьбіт <xliff:g id="NAME">%s</xliff:g> нечакана выняты"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Адключыце носьбіт <xliff:g id="NAME">%s</xliff:g>, перш чым вымаць яго, каб пазбегнуць страты даных."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Носьбіт <xliff:g id="NAME">%s</xliff:g> выдалены"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Запыт SS зменены на запыт USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Запыт SS зменены на новы запыт SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Працоўны профіль"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Кнопка \"Разгарнуць\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгарнуць"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Згарнуць"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"разгарнуць/згарнуць"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Перыферыйны USB-порт Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index e583435..7ac45f6 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Скрито съдържание"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Съдържанието е скрито чрез правило"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуална клавиатура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Физическа клавиатура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Сигурност"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Моторежим"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Състояние на профила"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Съобщения за програмистите"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Актуализации"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Състояние на мрежата"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Сигнали за мрежата"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Състояние на VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Администриране на устройство"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сигнали"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демонстрационен режим за магазини"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB връзка"</string>
<string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Системно от Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Превключване към личния потребителски профил"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Разрешава на приложението да премахва преки пътища от началния екран без намеса на потребителя."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"пренасочване на изходящите обаждания"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Разрешава на приложението да вижда набирания номер по време на изходящо обаждане и му дава възможност да пренасочи обаждането към друг номер или да го прекрати изцяло."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"отговаряне на телефонни обаждания"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Разрешава на приложението да отговаря на входящо телефонно обаждане."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"получаване на текстови съобщения (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Разрешава на приложението да получава и обработва SMS съобщения. Това означава, че то може да наблюдава или изтрива изпратените до устройството ви, без да ви ги покаже."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"получаване на текстови съобщения (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Докоснете, за да изберете език и подредба"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> се изобразява върху други приложения"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Части от това приложение може да останат видими за постоянно. Ако функцията не работи правилно, изключете я."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИЗКЛЮЧВАНЕ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>: Подготвя се"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверява се за грешки"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За прехвърляне на снимки и мултимедия"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>: Има повреда"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носителят (<xliff:g id="NAME">%s</xliff:g>) е повреден. Докоснете, за да отстраните проблема."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>: Не се поддържа"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Устройството не поддържа този носител (<xliff:g id="NAME">%s</xliff:g>). Докоснете, за да настроите в поддържан формат."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: Неочаквано премахване"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Спрете хранилището (<xliff:g id="NAME">%s</xliff:g>), преди да го извадите, за да не загубите данни"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Премахнахте <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS заявката е променена на USSD заявка."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS заявката е променена на нова SS заявка."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Служебен потребителски профил"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Бутон за разгъване"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Разгъване"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Свиване"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"превключване на разгъването"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Периферен USB порт под Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 337a292..da7103a 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"লুকানো বিষয়বস্তু"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"নীতির কারণে সামগ্রী লুকানো আছে"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ভার্চুয়াল কীবোর্ড"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ফিজিক্যাল কীবোর্ড"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"নিরাপত্তা"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"গাড়ি মোড"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"অ্যাকাউন্টের স্থিতি"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"বিকাশকারী সম্পর্কিত বার্তা"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"আপডেটগুলি"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"নেটওয়ার্কের স্থিতি"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"নেটওয়ার্ক সক্রান্ত অ্যালার্ট"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN এর স্থিতি"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ডিভাইস প্রশাসন"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"সতর্কতাগুলি"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"খুচরা বিক্রয়ের ডেমো"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB সংযোগ"</string>
<string name="safeMode" msgid="2788228061547930246">"নিরাপদ মোড"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android সিস্টেম"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ব্যক্তিগততে পাল্টান"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"অ্যাপ্লিকেশানটিকে ব্যবহারকারীর হস্তক্ষেপ ছাড়াই হোমস্ক্রীণের শর্টকাটগুলি সরানোর অনুমতি দেয়৷"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"আউটগোয়িং কলগুলি পুনঃচালিত করুন"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"অ্যাপ্লিকেশানকে কল চলাকালীন অন্য একটি নম্বরে কল পুনঃনির্দেশ বা কলটি একসথে বন্ধ করার সাথে ডায়াল করা নম্বরটি দেখতে দেয়৷"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ফোন কলের উত্তর দিতে দিন"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"অ্যাপটিকে ইনকামিং ফোন কলের উত্তর দিতে দেয়।"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"পাঠ্য বার্তা পান (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"অ্যাপ্লিকেশানটিকে এসএমএস প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"পাঠ্য বার্তা পান (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের উপরেও দেখা যায়"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> অ্যাপ সবার উপরে দেখা যাচ্ছে।"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"এই অ্যাপের কিছু কিছু অংশ সব সময় স্ক্রিনে দেখা যেতে পারে। যদি এই বৈশিষ্ট্যটি ঠিক ভাবে কাজ না করে, তাহলে অ্যাপটি বন্ধ করে দিন।"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"বন্ধ করুন"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> প্রস্তুত করা হচ্ছে"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ফটো এবং মিডিয়া ট্রান্সফার"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ত্রুটিপূর্ণ৷ ঠিক করতে আলতো চাপুন৷"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> অসমর্থিত"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"এই ডিভাইসটি <xliff:g id="NAME">%s</xliff:g> সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে আলতো চাপুন।"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ডেটা যাতে হারিয়ে না যায় তার জন্য সরানোর আগে <xliff:g id="NAME">%s</xliff:g> আনমাউন্ট করুন"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> সরানো হয়েছে"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS অনুরোধটিকে নতুন USSD অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS অনুরোধটিকে নতুন SS অনুরোধে রুপান্তরিত করা হয়েছে৷"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"কর্মস্থলের প্রোফাইল"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"প্রসারিত করার বোতাম"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"প্রসারিত করুন"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"সঙ্কুচিত করুন"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"টগল সম্প্রসারণ"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB পেরিফেরাল পোর্ট"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 88f2509..d67b260 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sadržaj je sakriven"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Sadržaj skriven u skladu sa pravilima"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizička tastatura"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sigurnost"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Način rada u automobilu"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status računa"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Poruke programera"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ažuriranja"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status mreže"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Mrežna upozorenja"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN-a"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administracija uređaja"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Promotivna demonstracija u maloprodaji"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
<string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prebacite se na lični"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Omogućava aplikaciji uklanjanje prečice početnog ekrana bez intervencije korisnika."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"preusmjeravanje odlaznih poziva"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Dozvoljava aplikaciji da vidi birani broj prilikom odlaznog poziva uz opciju da poziv preusmjeri na drugi broj ili da ga skroz prekine."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odgovor na telefonski poziv"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Omogućava aplikaciji odgovor na dolazni telefonski poziv."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"primanje tekstualnih poruka (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Omogućava aplikaciji primanje i obradu SMS poruka. Ovo znači da aplikacija može pratiti ili brisati poruke poslane na vaš uređaj, a da vam ih pritom ne prikazuje."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"primanje tekstualnih poruka (MMS)"</string>
@@ -1220,9 +1206,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva ostale aplikacije"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> prikazana je na vrhu."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dijelovi aplikacije mogu ostati vidljivi sve vrijeme. Ako ta funkcija ne radi ispravno, isključite je."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema se <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Provjera grešaka"</string>
@@ -1230,8 +1219,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prebacivanje slika i medijskih fajlova"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Uređaj <xliff:g id="NAME">%s</xliff:g> je oštećen. Dodirnite da biste popravili."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Uređaj <xliff:g id="NAME">%s</xliff:g> nije podržan"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ovaj uređaj ne podržava uređaj <xliff:g id="NAME">%s</xliff:g>. Dodirnite da biste ga postavili u podržanom formatu."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Neočekivano uklonjen uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> prije uklanjanja da izbjegnete gubitak podataka"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
@@ -1701,7 +1694,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev je izmijenjen u USSD zahtjev."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev je izmijenjen u novi SS zahtjev."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za posao"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Dugme za proširivanje"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"prebaci na proširenje"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ulaz za periferijske uređaje"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 66354e4..7caea45 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contingut amagat"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contingut amagat de conformitat amb la política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclat virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclat físic"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Seguretat"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mode de cotxe"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Estat del compte"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Missatges dels desenvolupadors"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Actualitzacions"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Estat de la xarxa"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertes de xarxa"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estat de la VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administració del dispositiu"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració comercial"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Connexió USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mode segur"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Canvia al perfil personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet que l\'aplicació suprimeixi les dreceres de la pantalla d\'inici sense la intervenció de l\'usuari."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"desviació de les trucades sortints"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permet que l\'aplicació vegi el número que s\'està marcant durant una trucada sortint, amb l\'opció de redirigir la trucada a un altre número o bé de cancel·lar-la completament."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"contestar a trucades"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permet que l\'aplicació contesti a una trucada entrant."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recepció de missatges de text (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permet que l\'aplicació rebi i processi missatges SMS. Això vol dir que l\'aplicació pot controlar o suprimir missatges que s\'han enviat al teu dispositiu sense mostrar-te\'ls."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recepció de missatges de text (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca per seleccionar l\'idioma i el disseny"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superposa a altres aplicacions"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"L\'aplicació <xliff:g id="NAME">%s</xliff:g> s\'està superposant."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Algunes parts d\'aquesta aplicació seran visibles en tot moment. Si aquesta funció presenta problemes, desactiva-la."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"S\'està preparant <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"S\'està comprovant si hi ha errors"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per transferir fotos i fitxers multimèdia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"S\'ha malmès <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"La unitat <xliff:g id="NAME">%s</xliff:g> està malmesa. Toca per solucionar-ho."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no és compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositiu no admet la unitat <xliff:g id="NAME">%s</xliff:g>. Toca per configurar-la amb un format compatible."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva <xliff:g id="NAME">%s</xliff:g> abans d\'extraure\'l per evitar perdre dades"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"S\'ha extret <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La sol·licitud SS s\'ha transformat en una sol·licitud USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La sol·licitud SS s\'ha transformat en una sol·licitud SS nova."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil professional"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botó Desplega"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Desplega"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Replega"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"desplega o replega"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port perifèric USB d\'Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 048c7c6..c322efa 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Skrytý obsah"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Obsah skrytý zásadami"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuální klávesnice"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fyzická klávesnice"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Zabezpečení"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Režim Auto"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Stav účtu"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Zprávy pro vývojáře"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Aktualizace"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Stav sítě"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Síťová upozornění"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stav sítě VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administrace zařízení"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornění"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Prodejní ukázka"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Připojení USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Přepnout na osobní profil"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Umožňuje aplikaci odebrat zástupce z plochy bez zásahu uživatele."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"přesměrování odchozích hovorů"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Umožňuje aplikaci sledovat při odchozích hovorech volaná čísla a přesměrovat hovor na jiné číslo nebo jej zcela zrušit."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odpovídání na telefonické hovory"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Umožňuje aplikaci odpovídat na příchozí telefonické hovory."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"příjem textových zpráv (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Umožňuje aplikaci přijmout a zpracovat zprávy SMS. Znamená to, že aplikace může sledovat zprávy odeslané do vašeho zařízení nebo je smazat, aniž by se vám zobrazily."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"příjem textových zpráv (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozvržení"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikace <xliff:g id="NAME">%s</xliff:g> se může vykreslovat přes ostatní aplikace"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikace <xliff:g id="NAME">%s</xliff:g> se zobrazuje nahoře."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Části této aplikace mohou zůstat vždy viditelné. Pokud tato funkce nepracuje správně, vypněte ji."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNOUT"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Probíhá příprava úložiště <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrola chyb"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"K přenosu fotek a médií"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Úložiště <xliff:g id="NAME">%s</xliff:g> je poškozeno. Klepnutím zahájíte opravu."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Úložiště <xliff:g id="NAME">%s</xliff:g> není podporováno"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Úložiště <xliff:g id="NAME">%s</xliff:g> není v tomto zařízení podporováno. Klepnutím zahájíte nastavení v podporovaném formátu."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úložiště <xliff:g id="NAME">%s</xliff:g> neočekávaně odpojeno"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Před odebráním úložiště <xliff:g id="NAME">%s</xliff:g> jej nejprve odpojte. Zabráníte tak ztrátě dat."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložiště <xliff:g id="NAME">%s</xliff:g> bylo odpojeno."</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Požadavek SS byl změněn na požadavek USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Požadavek SS byl změněn na nový požadavek SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Pracovní profil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Tlačítko rozbalení"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozbalit"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sbalit"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"přepnout rozbalení"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB pro periferní zařízení – Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 9939e91..2038f39 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Indholdet er skjult"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Indholdet er skjult af politikken"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fysisk tastatur"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sikkerhed"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Biltilstand"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Kontostatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Udviklermeddelelser"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Opdateringer"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Netværksstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Netværksunderretninger"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhedsadministration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo til udstilling i butik"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-forbindelse"</string>
<string name="safeMode" msgid="2788228061547930246">"Sikker tilstand"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skift til Tilpasset"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Tillader, at applikationen fjerner genveje på startskærmen uden brugerindgriben."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"omdirigere udgående opkald"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Tillader, at appen kan se det nummer, der ringes op til under et udgående opkald, og giver mulighed for at omdirigere opkaldet til et andet nummer eller afbryde opkaldet helt."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"besvar telefonopkald"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Giver appen tilladelse til at besvare et indgående opkald."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"modtage tekstbeskeder (sms)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Tillader, at appen kan modtage og behandle sms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"modtage tekstbeskeder (mms)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryk for at vælge sprog og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Appen <xliff:g id="NAME">%s</xliff:g> vises øverst."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dele af denne app kan være synlig hele tiden. Deaktiver denne funktion, hvis den ikke fungerer korrekt."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ FRA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrollerer for fejl"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til overførsel af billeder og medier"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> er beskadiget"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er beskadiget. Tryk for at rette problemet."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> understøttes ikke"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Tryk for at konfigurere det til et understøttet format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> blev fjernet uventet"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"For at undgå datatab skal <xliff:g id="NAME">%s</xliff:g> demonteres inden fjernelse"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> blev fjernet"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-anmodningen er ændret til en USSD-anmodning."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-anmodningen er ændret til en ny SS-anmodning."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbejdsprofil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Udvid-knap"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Udvid"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skjul"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Slå udvidelse til eller fra"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"USB-port til eksterne Android-enheder"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 507b358..2880318 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Inhalte ausgeblendet"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Inhalte aufgrund der Richtlinien ausgeblendet"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bildschirmtastatur"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Physische Tastatur"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sicherheit"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Automodus"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Kontostatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Nachrichten für Entwickler"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Updates"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Netzwerkstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Netzwerkwarnungen"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-Status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Geräteverwaltung"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Warnmeldungen"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo für Einzelhandel"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-Verbindung"</string>
<string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Zu \"Privat\" wechseln"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Ermöglicht einer App das Entfernen von Verknüpfungen vom Startbildschirm ohne Eingriff des Nutzers"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"Ausgehende Anrufe umleiten"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Ermöglicht der App die Erkennung der während eines ausgehenden Anrufs gewählten Nummer und gibt ihr die Möglichkeit, den Anruf an eine andere Nummer umzuleiten oder den Anruf ganz abzubrechen"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"Anrufe annehmen"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ermöglicht der App, eingehende Anrufe anzunehmen."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"SMS empfangen"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Ermöglicht der App, SMS zu empfangen und zu verarbeiten. Das bedeutet, dass die App an dein Gerät gesendete Nachrichten überwachen und löschen kann, ohne sie dir anzuzeigen."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"MMS empfangen"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps eingeblendet"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Die App \"<xliff:g id="NAME">%s</xliff:g>\" wird über anderen Apps angezeigt."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Teile dieser App werden die ganze Zeit eingeblendet. Wenn diese Funktion nicht richtig funktioniert, deaktiviere sie."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTIVIEREN"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Zum Übertragen von Fotos und Medien"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> beschädigt"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt. Zum Reparieren tippen."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nicht unterstützt"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zum Einrichten in einem unterstützten Format tippen."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Trenne die <xliff:g id="NAME">%s</xliff:g> vor dem Entfernen, um Datenverluste zu vermeiden."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-Anfrage wird in USSD-Anfrage geändert."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-Anfrage wird in neue SS-Anfrage geändert."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeitsprofil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Schaltfläche \"Maximieren\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Maximieren"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Minimieren"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Maximierung ein-/auschalten"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"USB-Port für Android-Peripheriegeräte"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index fca99cb..3312b35 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Κρυφό περιεχόμενο"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Το περιεχόμενο είναι κρυφό βάσει πολιτικής"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Εικονικό πληκτρολόγιο"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Φυσικό πληκτρολόγιο"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Ασφάλεια"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Λειτουργία αυτοκινήτου"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Κατάσταση λογαριασμού"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Μηνύματα προγραμματιστή"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ενημερώσεις"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Κατάσταση δικτύου"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Ειδοποιήσεις δικτύου"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Κατάσταση VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Διαχείριση συσκευής"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ειδοποιήσεις"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Επίδειξη λιανικής"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Σύνδεση USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string>
<string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Μετάβαση σε προσωπικό προφίλ"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Επιτρέπει στην εφαρμογή την κατάργηση συντομεύσεων από την Αρχική οθόνη χωρίς την παρέμβαση του χρήστη."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"αναδρομολογεί τις εξερχόμενες κλήσεις"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Επιτρέπει στην εφαρμογή να βλέπει τον αριθμό που καλέσατε κατά τη διάρκεια μιας εξερχόμενης κλήσης με επιλογή ανακατεύθυνσης της κλήσης σε έναν διαφορετικό αριθμό ή διακοπής της κλήσης."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"απάντηση σε τηλεφωνικές κλήσεις"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Επιτρέπει στην εφαρμογή να απαντά σε μια εισερχόμενη τηλεφωνική κλήση."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"λαμβάνει μηνύματα κειμένου (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων SMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"λαμβάνει μηνύματα κειμένου (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Πατήστε για να επιλέξετε γλώσσα και διάταξη"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικάλυψε άλλες εφαρμογές"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικαλύπτει άλλες."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Ορισμένα τμήματα αυτής της εφαρμογής μπορεί να παραμένουν συνεχώς ορατά. Εάν αυτή η λειτουργία δεν εκτελείται σωστά, απενεργοποιήστε την."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Προετοιμασία <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Έλεγχος για σφάλματα"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Για μεταφορά φωτ./πολυμέσων"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Η κάρτα <xliff:g id="NAME">%s</xliff:g> είναι κατεστραμμένη"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Το μέσο <xliff:g id="NAME">%s</xliff:g> είναι κατεστραμμένο. Πατήστε για επιδιόρθωση."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Η κάρτα <xliff:g id="NAME">%s</xliff:g> δεν υποστηρίζεται"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Αυτή η συσκευή δεν υποστηρίζει αυτό το μέσο <xliff:g id="NAME">%s</xliff:g>. Πατήστε για ρύθμιση σε μια υποστηριζόμενη μορφή."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Μη αναμενόμενη αφαίρεση <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Αποπροσαρτήστε το μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g> πριν τον αφαιρέσετε, προς αποφυγή απώλειας δεδομένων."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Καταργήθηκε το <xliff:g id="NAME">%s</xliff:g>."</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Το αίτημα SS τροποποιήθηκε σε αίτημα USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Το αίτημα SS τροποποιήθηκε σε νέο αίτημα SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Προφίλ εργασίας"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Κουμπί ανάπτυξης"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Ανάπτυξη"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Σύμπτυξη"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"εναλλαγή επέκτασης"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Περιφερειακή θύρα USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index d83f1fc..4eb2815 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contents hidden"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contents hidden by policy"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Physical keyboard"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Security"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Car mode"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Account status"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Developer messages"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Updates"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Network status"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Network alerts"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Device administration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Allows the application to remove Home screen shortcuts without user intervention."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reroute outgoing calls"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Allows the app to see the number being dialled during an outgoing call with the option to redirect the call to a different number or abort the call altogether."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"answer phone calls"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Allows the app to answer an incoming phone call."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receive text messages (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Allows the app to receive and process SMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receive text messages (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Expand button"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"toggle expansion"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index d83f1fc..4eb2815 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contents hidden"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contents hidden by policy"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Physical keyboard"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Security"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Car mode"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Account status"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Developer messages"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Updates"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Network status"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Network alerts"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Device administration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Allows the application to remove Home screen shortcuts without user intervention."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reroute outgoing calls"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Allows the app to see the number being dialled during an outgoing call with the option to redirect the call to a different number or abort the call altogether."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"answer phone calls"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Allows the app to answer an incoming phone call."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receive text messages (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Allows the app to receive and process SMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receive text messages (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Expand button"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"toggle expansion"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index d83f1fc..4eb2815 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contents hidden"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contents hidden by policy"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Physical keyboard"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Security"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Car mode"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Account status"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Developer messages"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Updates"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Network status"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Network alerts"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Device administration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB connection"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Switch to Personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Allows the application to remove Home screen shortcuts without user intervention."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reroute outgoing calls"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Allows the app to see the number being dialled during an outgoing call with the option to redirect the call to a different number or abort the call altogether."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"answer phone calls"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Allows the app to answer an incoming phone call."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receive text messages (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Allows the app to receive and process SMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receive text messages (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> draw over other apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> app displaying on top."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For transferring photos and media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrupted <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is corrupt. Tap to fix."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Unsupported <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"This device doesn’t support this <xliff:g id="NAME">%s</xliff:g>. Tap to set up in a supported format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> unexpectedly removed"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Unmount <xliff:g id="NAME">%s</xliff:g> before removing to avoid data loss"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Removed <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS request is modified to USSD request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS request is modified to new SS request."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profile"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Expand button"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expand"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Collapse"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"toggle expansion"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 42a92ad..1cef8c2 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenidos ocultos"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contenido oculto debido a la política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Seguridad"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo auto"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Estado de la cuenta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensajes de programadores"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Actualizaciones"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Estado de la red"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de red"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estado de VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administración del dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo para punto de venta"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Conexión USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar al perfil personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que la aplicación elimine accesos directos de la pantalla principal sin que el usuario intervenga."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redireccionar llamadas salientes"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que la aplicación vea el número marcado al realizar una llamada, con la opción de redirigir esta llamada a un número distinto o cancelarla completamente."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"responder llamadas telefónicas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que la app responda a una llamada telefónica entrante."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recibir mensajes de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que la aplicación reciba y procese mensajes SMS, lo que significa que podría controlar o eliminar mensajes enviados al dispositivo sin mostrártelos."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recibir mensajes de texto (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Presiona para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Es posible que ciertas partes de esta app permanezcan visibles todo el tiempo. Si esta función tiene problemas, desactívala."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando el medio <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> está dañado"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está dañado. Presiona para solucionar el problema."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no es compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no es compatible con <xliff:g id="NAME">%s</xliff:g>. Presiona la pantalla para configurarlo en un formato compatible."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Para evitar que se pierdan datos, desactiva el dispositivo <xliff:g id="NAME">%s</xliff:g> antes de extraerlo."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Se extrajo el medio <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS cambió por una solicitud USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS cambió por una nueva solicitud SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botón Expandir"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"activar o desactivar la expansión"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Puerto USB de periféricos Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index c03e0d1..9e05e99 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenidos ocultos"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contenidos ocultos por política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Seguridad"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo de coche"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Estado de la cuenta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensajes de desarrolladores"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Actualizaciones"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Estado de la red"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de la red"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estado de la VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administración del dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo para tiendas"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Conexión USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar a perfil personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que la aplicación elimine accesos directos de la pantalla de inicio sin la intervención del usuario."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirigir llamadas salientes"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que la aplicación vea el número que se marca al realizar una llamada con la opción de redirigir la llamada a otro número o cancelar la llamada."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"responder llamadas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que la aplicación responda una llamada."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recibir mensajes de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que la aplicación reciba y procese mensajes MMS, lo que significa que podría utilizar este permiso para controlar o eliminar mensajes enviados al dispositivo sin mostrárselos al usuario."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recibir mensajes de texto (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras aplicaciones"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se muestra en primer plano."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Es posible que algunas partes de esta aplicación permanezcan visibles en todo momento. Desactiva esta función si no funciona correctamente."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando errores"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y multimedia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Medio externo (<xliff:g id="NAME">%s</xliff:g>) dañado"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está en mal estado. Toca para solucionar el problema."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Medio externo (<xliff:g id="NAME">%s</xliff:g>) no admitido"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no admite este medio externo (<xliff:g id="NAME">%s</xliff:g>). Toca para configurarlo con un formato admitido."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Extracción inesperada de <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva tu <xliff:g id="NAME">%s</xliff:g> antes de extraer la unidad para evitar pérdidas de datos"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Tu <xliff:g id="NAME">%s</xliff:g> se ha extraído"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La solicitud SS se ha modificado para la solicitud USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La solicitud SS se ha modificado para la nueva solicitud SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabajo"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botón Mostrar"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Mostrar"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ocultar"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"alternar mostrar y ocultar"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Puerto periférico USB (Android)"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 4281c4f..6e03668 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sisu on peidetud"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Sisu on eeskirjadega peidetud"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalne klaviatuur"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Füüsiline klaviatuur"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Turvalisus"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Autorežiim"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Konto olek"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Arendaja sõnumid"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Värskendused"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Võrgu olek"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Võrguteavitused"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-i olek"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Seadme haldamine"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Teatised"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Poedemo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-ühendus"</string>
<string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-süsteem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Lülita isiklikule profiilile"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Lubab rakendusel eemaldada avaekraani otseteid ilma kasutaja sekkumiseta."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"marsruutige väljuvad kõned uuesti"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Lubab rakendusel näha, mis number valitakse väljahelistamisel, ning laseb suunata kõne teisele numbrile või selle üldse katkestada."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"vastamine telefonikõnedele"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Lubab rakendusel vastata sissetulevale telefonikõnele."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"võtke vastu tekstisõnumeid (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Võimaldab rakendusel vastu võtta ja töödelda SMS-sõnumeid. See tähendab, et rakendus võib jälgida või kustutada teie seadmele saadetud sõnumeid neid teile näitamata."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"võtke vastu tekstisõnumeid (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Puudutage keele ja paigutuse valimiseks"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Rakendus <xliff:g id="NAME">%s</xliff:g> joonistab teiste rakenduste peale"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Rakend. <xliff:g id="NAME">%s</xliff:g> kuvatakse kõige peal."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Selle rakenduse osad võivad alati nähtaval olla. Kui see funktsioon ei tööta korralikult, lülitage see välja."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"LÜLITA VÄLJA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Üksuse <xliff:g id="NAME">%s</xliff:g> ettevalmistamine"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Vigade kontrollimine"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotode ja meedia ülekandmiseks"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Rikutud <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Üksus <xliff:g id="NAME">%s</xliff:g> on rikutud. Puudutage parandamiseks."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Toetamata <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"See seade ei toeta üksust <xliff:g id="NAME">%s</xliff:g>. Puudutage toetatud vormingus seadistamiseks."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati ootamatult"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Andmekao vältimiseks lahutage üksus <xliff:g id="NAME">%s</xliff:g> enne eemaldamist"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Üksus <xliff:g id="NAME">%s</xliff:g> on eemaldatud"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-päring muudeti USSD-päringuks."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-päring muudeti uueks SS-päringuks."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Tööprofiil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Laiendamisnupp"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laienda"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ahenda"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"vaheta laiendamist"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidi väline USB-port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index fe45f88..d2a32de 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Edukiak ezkutatuta daude"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Gidalerro batzuk ezkutatu dira, gidalerroei jarraiki"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teklatu birtuala"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teklatu fisikoa"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Segurtasuna"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Auto modua"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Kontuaren egoera"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Garatzaileentzako mezuak"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Eguneratzeak"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Sarearen egoera"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Sarearen alertak"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN egoera"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Gailuen administrazioa"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Abisuak"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Saltzaileentzako demoa"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB konexioa"</string>
<string name="safeMode" msgid="2788228061547930246">"Modu segurua"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistema"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Aldatu profil pertsonalera"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Erabiltzaileak ezer egin gabe hasierako pantailako lasterbideak kentzeko aukera ematen die aplikazioei."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"irteerako deiak birbideratzea"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Irteerako deian markatutako zenbakia ikustea baimentzen die aplikazioei, deia beste zenbaki batera birbideratzeko edo deia bertan behera uzteko aukerarekin."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"Erantzun telefono-deiak"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Sarrerako deiak hartzea baimentzen dio aplikazioari."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"testu-mezuak (SMSak) jasotzea"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS mezuak jasotzeko eta prozesatzeko baimena ematen die aplikazioei. Horrela, aplikazioak gailura bidalitako mezuak kontrola eta ezaba ditzake zuri erakutsi gabe."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"testu-mezuak (MMSak) jasotzea"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Hizkuntza eta diseinua hautatzeko, sakatu hau"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> zerbitzuak beste aplikazio batzuk gainjarri ditu pantailan"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> gainjarri da pantailan."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Aplikazioaren atal batzuk ikusgai gera litezke uneoro. Eginbideak behar bezala funtzionatzen ez badu, desaktiba ezazu."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESAKTIBATU"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> prestatzen"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Errorerik dagoen egiaztatzen"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Argazkiak eta multimedia-fitxategiak transferitzeko"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> hondatuta dago. Sakatu konpontzeko."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Ez da onartzen <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Sakatu onartzen den formatu batean konfiguratzeko."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Daturik ez galtzeko, desmuntatu <xliff:g id="NAME">%s</xliff:g> memoria kendu aurretik"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ez dago"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS eskaera USSD eskaerara aldatu da."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS eskaera SS eskaera berrira aldatu da."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work profila"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Zabaltzeko botoia"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Zabaldu"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tolestu"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"zabaldu edo tolestu"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ataka periferikoa"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 345888d..22d8029 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"بیشتر از 999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"محتواها پنهان هستند"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"محتوا بر اساس خطمشی پنهان شده است"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"صفحهکلید مجازی"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"صفحهکلید فیزیکی"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"امنیت"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"حالت خودرو"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"وضعیت حساب"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"پیامهای برنامهنویس"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"بهروزرسانیها"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"وضعیت شبکه"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"هشدارهای شبکه"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"وضعیت VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"سرپرست دستگاه"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"هشدارها"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"نمونه برای خردهفروشان"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"اتصال USB"</string>
<string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"رفتن به نمایه شخصی"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"به برنامه اجازه میدهد میانبرهای صفحه اصلی را بدون دخالت کاربر حذف کند."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ترسیم مجدد مسیر تماسهای خروجی"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"به برنامه اجازه میدهد عددی را که در طی یک تماس خروجی شمارهگیری شده، ببیند و این اختیار را دارد که تماس را به شماره دیگری هدایت کند یا کلاً تماس را قطع کند."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"پاسخ دادن به تماسهای تلفنی"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"به برنامه امکان میدهد به تماس تلفنی ورودی پاسخ دهد."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"دریافت پیامهای نوشتاری (پیامک)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"به برنامه اجازه میدهد پیامکها را دریافت و پردازش کند. این یعنی برنامه میتواند پیامهای ارسالی به دستگاه شما را بدون نمایش آنها به شما حذف یا کنترل کند."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"دریافت پیامهای نوشتاری (فراپیام)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"برای انتخاب زبان و چیدمان ضربه بزنید"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"نمایش <xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"نمایش برنامه <xliff:g id="NAME">%s</xliff:g> در بالا."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ممکن است قسمتهایی از این برنامه همیشه قابل مشاهده بمانند. اگر این قابلیت بهدرستی کار نمیکند، آن را خاموش کنید."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"خاموش کردن"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"در حال آمادهسازی <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"در حال بررسی برای خطاها"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"برای انتقال عکسها و رسانه"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> خراب است"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> خراب است. برای برطرف کردن مشکل ضربه بزنید."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> پشتیبانی نشده"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"این دستگاه از این <xliff:g id="NAME">%s</xliff:g> پشتیبانی نمیکند. برای نصب آن در قالب پشتیبانیشده ضربه بزنید."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> بهطور غیرمنتظره جدا شد"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"قبل از جدا کردن، برای جلوگیری از از دست رفتن اطلاعات، ارتباط <xliff:g id="NAME">%s</xliff:g> را قطع کنید."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> جدا شده است"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"درخواست SS به درخواست USSD اصلاح میشود."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"درخواست SS به درخواست SS جدید اصلاح میشود."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"نمایه کاری"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"دکمه بزرگ کردن"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"بزرگ کردن"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"کوچک کردن"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"روشن/خاموش کردن بزرگنمایی"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"درگاه جانبی Android USB"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index b199b95..e0017d4 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sisältö piilotettu"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Sisältö on piilotettu käytännön perusteella."</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalinen näppäimistö"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fyysinen näppäimistö"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Tietosuoja"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Autotila"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Tilin tila"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Kehittäjien viestit"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Päivitykset"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Verkon tila"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Verkkoilmoitukset"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-tila"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Laitteen järjestelmänvalvonta"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ilmoitukset"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Esittelytila"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-yhteys"</string>
<string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Siirry henkilökohtaiseen profiiliin"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Antaa sovelluksen poistaa aloitusruudun pikakuvakkeita ilman käyttäjän toimia."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ohjaa uudelleen lähtevät puhelut"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Sallii sovelluksen nähdä numeron, joka valitaan lähtevää puhelua soitettaessa, ja antaa mahdollisuuden ohjata puhelun eri numeroon tai keskeyttää puhelun kokonaan."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"puheluihin vastaaminen"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Sovellus saa luvan vastata saapuvaan puheluun."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"vastaanota tekstiviestejä (teksti)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Antaa sovelluksen vastaanottaa ja käsitellä tekstiviestejä. Sovellus voi valvoa tai poistaa laitteeseesi lähetettyjä viestejä näyttämättä niitä sinulle."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"vastaanota tekstiviestejä (multimedia)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Valitse kieli ja asettelu koskettamalla."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> piirtää muiden sovellusten päälle"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Sovellus <xliff:g id="NAME">%s</xliff:g> näkyy päällä"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Osia sovelluksesta voi olla aina näkyvissä. Jos ominaisuus ei toimi oikein, poista se käytöstä."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"POISTA KÄYTÖSTÄ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Valmistellaan kohdetta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tarkistetaan virheiden varalta."</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kuvien ja median siirtämiseen"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Vioittunut <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> on viallinen. Korjaa napauttamalla."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Epäyhteensopiva <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> ei ole yhteensopiva tämän laitteen kanssa. Ota se käyttöön tuetussa tilassa napauttamalla."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> poistettiin yllättäen"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Poista <xliff:g id="NAME">%s</xliff:g> käytöstä ennen sen irrottamista estääksesi tietoja katoamasta."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> on poistettu"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-pyyntö muutettiin USSD-pyynnöksi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-pyyntö muutettiin uudeksi SS-pyynnöksi."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Työprofiili"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Laajennuspainike"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Laajenna"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Tiivistä"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Laajenna/tiivistä painikkeella"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidin USB-oheislaiteportti"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 1fd0f75..edfaf2e 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenus masqués"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contenu masqué conformément aux politiques"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Clavier physique"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sécurité"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mode Voiture"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"État du compte"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Messages des concepteurs"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Mises à jour"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"État du réseau"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertes réseau"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"État du RPV"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administration d\'appareils"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Démo en magasin"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Connexion USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet à l\'application de supprimer des raccourcis de la page d\'accueil sans intervention de l\'utilisateur."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"transférer les appels sortants"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permet à l\'application de lire le numéro composé lors d\'un appel sortant et lui donne la possibilité de rediriger l\'appel vers un autre numéro ou d\'abandonner l\'appel."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"répondre aux appels téléphoniques"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permet à l\'application de répondre aux appels entrants."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recevoir des messages texte"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permet à l\'application de recevoir et de traiter les messages texte. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recevoir des messages multimédias"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Touchez pour sélectionner la langue et la configuration du clavier"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applications"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> s\'affiche par-dessus les autres"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Certaines parties de cette application restent visibles en tout temps. Si cette option ne fonctionne pas correctement, désactivez-la."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation de « <xliff:g id="NAME">%s</xliff:g> » en cours"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs en cours..."</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Corrompue : <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> est corrompu. Touchez pour corriger le problème."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> ». Touchez pour la configurer dans un format compatible."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de la mémoire « <xliff:g id="NAME">%s</xliff:g> »"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire « <xliff:g id="NAME">%s</xliff:g> » avant de la retirer pour éviter toute perte de données."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> » retirée"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La demande SS a été modifiée et est maintenant une demande USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La demande SS a été modifiée et est maintenant une nouvelle demande SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Bouton Développer"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"activer/désactiver le développement"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB de l\'appareil Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index aae5672..569b053 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenus masqués"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contenu masqué conformément aux règles"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Clavier physique"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sécurité"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mode Voiture"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"État du compte"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Messages relatifs aux développeurs"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Mises à jour"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"État du réseau"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertes réseau"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"État du VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Gestion de l\'appareil"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Démonstration en magasin"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Connexion USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permettre à l\'application de supprimer des raccourcis de l\'écran d\'accueil sans l\'intervention de l\'utilisateur"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"transférer les appels sortants"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permettre à l\'application de lire le numéro composé lors d\'un appel sortant, et lui donner la possibilité de rediriger l\'appel vers un autre numéro ou d\'abandonner l\'appel"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"répondre aux appels téléphoniques"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Autorise l\'application à répondre à un appel téléphonique entrant."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recevoir des messages texte (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permet à l\'application de recevoir et de traiter les SMS. Cette autorisation lui donne la possibilité de surveiller ou supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recevoir des messages texte (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applications"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Superposition de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Certaines sections de cette application peuvent rester visibles en permanence. Si cette fonctionnalité ne s\'exécute pas correctement, désactivez-la."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation mémoire \"<xliff:g id="NAME">%s</xliff:g>\" en cours"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer photos et fichiers"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" corrompue"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"La mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" est corrompue. Appuyez ici pour la réparer."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\". Appuyez ici pour le configurer dans un format accepté."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Désinstallez la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" avant de la retirer pour éviter toute perte de données."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" retirée"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La requête SS a été remplacée par une requête USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La requête SS a été remplacée par une autre requête SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Bouton \"Développer\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Développer"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Réduire"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"activer/désactiver le développement"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port du périphérique USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index bd1ee38..406cc87 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contido oculto"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Ocultouse contido por causa da política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Seguranza"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo coche"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Estado da conta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensaxes para programadores"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Actualizacións"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Estado da rede"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de rede"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estado da VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administración de dispositivos"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostración comercial"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"conexión USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Cambiar ao perfil persoal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite á aplicación eliminar atallos da pantalla de inicio sen a intervención do usuario."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redireccionar as chamadas saíntes"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite á aplicación ver o número que se está marcando durante unha chamada saínte coa opción de redirixir a chamada a un número diferente ou abortar a chamada."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"responder chamadas telefónicas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que a aplicación responda a unha chamada telefónica entrante."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"recibir mensaxes de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite á aplicación recibir e procesar mensaxes SMS. Isto significa que a aplicación pode supervisar ou eliminar mensaxes enviadas ao teu dispositivo sen mostrarchas."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"recibir mensaxes de texto (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar o idioma e o deseño"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> superponse a outras aplicacións"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"A aplicación <xliff:g id="NAME">%s</xliff:g> móstrase enriba."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desta aplicación poden permanecer visibles en todo momento. Se esta función non traballa correctamente, desactívaa."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando a <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e contidos multimedia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danado"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"A <xliff:g id="NAME">%s</xliff:g> está danada. Toca para corrixir o problema."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> incompatible"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo non é compatible con esta <xliff:g id="NAME">%s</xliff:g>. Toca para configurala nun formato compatible."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retirouse a <xliff:g id="NAME">%s</xliff:g> de forma inesperada"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desactiva a <xliff:g id="NAME">%s</xliff:g> antes de retirala para evitar a perda de datos"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Retirouse a <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitude SS transformouse nunha solicitude USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitude SS transformouse nunha nova solicitude SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de traballo"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botón Despregar"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Despregar"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Contraer"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"alterna a expansión"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porto periférico USB de Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index eb90c8c..c9b2172 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"સામગ્રીઓ છુપાવેલ છે"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"નીતિ દ્વારા સામગ્રી છુપાવાઈ"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"વર્ચ્યુઅલ કીબોર્ડ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ભૌતિક કીબોર્ડ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"સુરક્ષા"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"કાર મોડ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"એકાઉન્ટ સ્થિતિ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"વિકાસકર્તા માટેના સંદેશા"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"અપડેટ્સ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"નેટવર્ક સ્થિતિ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"નેટવર્ક ચેતવણીઓ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN સ્થિતિ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ઉપકરણ વ્યવસ્થાપન"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ચેતવણીઓ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"રિટેલ ડેમો"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB કનેક્શન"</string>
<string name="safeMode" msgid="2788228061547930246">"સુરક્ષિત મોડ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android સિસ્ટમ"</string>
<string name="user_owner_label" msgid="1119010402169916617">"વ્યક્તિગત પર સ્વિચ કરો"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"એપ્લિકેશનને વપરાશકર્તા હસ્તક્ષેપ વગર હોમસ્ક્રીન શોર્ટકટ્સ દૂર કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"આઉટગોઇંગ કૉલ્સને ફરીથી રૂટ કરો"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"એપ્લિકેશનને આઉટગોઇંગ કૉલ દરમિયાન કૉલને એક અલગ નંબર પર રીડાયરેક્ટ કરવા અથવા કૉલને સંપૂર્ણપણે છોડી દેવાનાં વિકલ્પ સાથે ડાયલ થઈ રહેલા નંબરને જોવાની મંજૂરી આપે છે."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ફોન કૉલને જવાબ આપો"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ઍપ્લિકેશનને ઇનકમિંગ ફોન કૉલને જવાબ આપવાની મંજૂરી આપે છે."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ટેક્સ્ટ સંદેશા (SMS) પ્રાપ્ત કરો"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ઍપ્લિકેશનને SMS સંદેશા પ્રાપ્ત કરવાની અને તેના પર પ્રક્રિયા કરવાની મંજૂરી આપે છે. આનો અર્થ એ કે ઍપ્લિકેશન તમને દર્શાવ્યા વિના તમારા ઉપકરણ પર મોકલેલ સંદેશાઓનું નિરીક્ષણ કરી શકે છે અથવા કાઢી નાખી શકે છે."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ટેક્સ્ટ સંદેશા (MMS) પ્રાપ્ત કરો"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર ડ્રો કરે છે"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ઍપ્લિકેશન સૌથી ઉપર દેખાઈ રહી છે."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"આ ઍપ્લિકેશનના ભાગ હંમેશાં દૃશ્યક્ષમ રહી શકે છે. જો આ સુવિધા યોગ્ય રીતે કાર્ય કરી રહી ન હોય, તો તેને બંધ કરો."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"બંધ કરો"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ને તૈયાર કરી રહ્યું છે"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ભૂલો માટે તપાસી રહ્યું છે"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ફોટા અને મીડિયા સ્થાનાંતરિત કરવા માટે"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"દૂષિત <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> દૂષિત છે. ઠીક કરવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"અસમર્થિત <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"આ ઉપકરણ આ <xliff:g id="NAME">%s</xliff:g> નું સમર્થન કરતું નથી. સમર્થિત ફોર્મેટમાં સેટ કરવા માટે ટૅપ કરો."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> અનપેક્ષિત રીતે દૂર કર્યું"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ડેટા નુકસાનને ટાળવા માટે <xliff:g id="NAME">%s</xliff:g> ને દૂર કરતાં પહેલાં અનમાઉન્ટ કરો."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> દૂર કર્યું"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS વિનંતીને USSD વિનંતી પર સંશોધિત કરી."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS વિનંતીને નવી SS વિનંતી પર સંશોધિત કરી."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"કાર્ય પ્રોફાઇલ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"વિસ્તૃત કરો બટન"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"વિસ્તૃત કરો"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"સંકુચિત કરો"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"વિસ્તરણ ટૉગલ કરો"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB પેરિફેરલ પોર્ટ"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index bd1c585..982e77b 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"छिपी हुई सामग्री"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"सामग्री पॉलिसी के द्वारा छिपी हुई है"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"वर्चुअल कीबोर्ड"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"भौतिक कीबोर्ड"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"सुरक्षा"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"कार मोड"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"खाते की स्थिति"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"डेवलपर के संदेश"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"अपडेट"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"नेटवर्क की स्थिति"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"नेटवर्क संबंधी सूचनाएं"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN की स्थिति"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"डिवाइस का व्यवस्थापन"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"सूचनाएं"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"खुदरा डेमो"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB कनेक्शन"</string>
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string>
<string name="user_owner_label" msgid="1119010402169916617">"व्यक्तिगत प्रोफ़ाइल में स्विच करें"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"एप्लिकेशन को उपयोगकर्ता के हस्तक्षेप के बिना होमस्क्रीन शॉर्टकट निकालने की अनुमति देता है."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"आउटगोइंग कॉल को कहीं और भेजें"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ऐप्स को किसी कॉल को भिन्न नंबर पर रिडायरेक्ट करने या पूरी तरह से कॉल निरस्त करने के विकल्प के साथ आउटगोइंग कॉल के दौरान डायल किए जा रहे नंबर को देखने की अनुमति देती है."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"फ़ोन कॉल का जवाब दें"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ऐप्लिकेशन को किसी इनकमिंग फ़ोन कॉल का जवाब देने देती है."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"लेख संदेश (SMS) प्राप्त करें"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ऐप्स को SMS संदेशों को प्राप्त और संसाधित करने देता है. इसका अर्थ है कि ऐप्स आपके डिवाइस पर भेजे गए संदेशों की निगरानी आपको दिखाए बिना कर सकता है और उन्हें हटा सकता है."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"लेख संदेश (MMS) प्राप्त करें"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा और लेआउट चुनने के लिए टैप करें"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> दूसरे ऐप पर आरेखण करते हैं"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ऐप ऊपर दिखा रहा है."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"हो सकता है कि इस ऐप के कुछ हिस्से हर समय दिखाई पड़ें. अगर यह सुविधा ठीक तरह से काम नहीं कर रही है, तो इसे बंद कर दें."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करें"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> को तैयार किया जा रहा है"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटियों की जांच कर रहा है"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फ़ोटो और मीडिया ट्रांसफर करने के लिए"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"दूषित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> दूषित है. ठीक करने के लिए टैप करें."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"यह डिवाइस इस <xliff:g id="NAME">%s</xliff:g> का समर्थन नहीं करता है. समर्थित प्रारूप में सेट करने के लिए टैप करें."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूप से निकाला गया"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा हानि से बचने के लिए <xliff:g id="NAME">%s</xliff:g> को निकालने से पहले अनमाउंट करें"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> निकाल दिया गया"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध को USSD अनुरोध में बदल दिया गया है."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध को नए SS अनुरोध में बदल दिया गया है."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफ़ाइल"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"विस्तृत करें बटन"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत करें"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संक्षिप्त करें"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"टॉगल विस्तार"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB पेरिफ़ेरल पोर्ट"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 26d54e4..21accc5 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sadržaj je skriven"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Sadržaj je skriven prema pravilima"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualna tipkovnica"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizička tipkovnica"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sigurnost"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Način rada u automobilu"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status računa"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Poruke razvojnog programera"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ažuriranja"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Mrežni status"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Mrežna upozorenja"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN-a"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administracija uređaja"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Prodajni demo-način"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
<string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sustav Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prijeđite na osobni"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Aplikaciji omogućuje uklanjanje prečaca početnog zaslona bez intervencije korisnika."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"preusmjeravanje odlaznih poziva"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Omogućuje aplikaciji da vidi broj koji se bira prilikom odlaznog poziva uz opciju preusmjeravanja poziva na neki drugi broj ili prekidanja poziva."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odgovoriti na telefonske pozive"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Aplikaciji omogućuje da odgovori na dolazni telefonski poziv."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"primanje tekstnih poruka (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Aplikaciji omogućuje primanje i obradu SMS poruka. To znači da aplikacija može nadzirati ili izbrisati poruke poslane na vaš uređaj, a da vam ih ne prikaže."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"primanje tekstnih poruka (MMS)"</string>
@@ -1217,9 +1203,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste odabrali jezik i raspored"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se preko drugih aplikacija"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se gore."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Dijelovi ove aplikacije mogu ostati vidljivi cijelo vrijeme. Ako ta značajka ne funkcionira pravilno, isključite je."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema uređaja <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Traženje pogrešaka"</string>
@@ -1227,8 +1216,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prijenos fotografija i medija"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Oštećeni medij za pohranu <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ima pogrešku. Dodirnite da biste je ispravili."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodržani medij za pohranu <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Uređaj ne podržava ovaj medij (<xliff:g id="NAME">%s</xliff:g>). Dodirnite da biste ga postavili u podržanom formatu."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Uređaj <xliff:g id="NAME">%s</xliff:g> iznenada je uklonjen"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Isključite uređaj <xliff:g id="NAME">%s</xliff:g> prije uklanjanja da ne biste izgubili podatke"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Uklonjen je uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1698,7 +1691,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS zahtjev izmijenjen je u USSD zahtjev."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS zahtjev izmijenjen je u novi SS zahtjev."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Radni profil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Gumb za proširivanje"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširivanje"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sažimanje"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"promjena proširenja"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Androidov USB priključak za periferne uređaje"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 2e786e9..18fd4b1 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Tartalom elrejtve"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"A tartalom irányelv miatt elrejtve"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuális billentyűzet"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizikai billentyűzet"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Biztonság"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Autós üzemmód"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Fiókállapot"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Fejlesztői üzenetek"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Frissítések"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Hálózati állapot"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Hálózati értesítések"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-állapot"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Eszközfelügyelet"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Értesítések"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kiskereskedelmi bemutató"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-kapcsolat"</string>
<string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Átváltás személyes profilra"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül távolítson el parancsikonokat a kezdőképernyőről."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"kimenő hívások átirányítása"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Lehetővé teszi, hogy az alkalmazás kimenő híváskor lássa a tárcsázott számot, valamint a hívást átirányítsa egy másik számra, vagy megszakítsa."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"válaszol a hívásokra"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Engedélyezi az alkalmazásnak, hogy válaszoljon a bejövő hívásokra."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"szöveges üzenetek (SMS) fogadása"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Lehetővé teszi az alkalmazás számára, hogy SMS-eket fogadjon és dolgozzon fel. Ez azt jelenti, hogy az alkalmazás megfigyelheti vagy törölheti a beérkező üzeneteket anélkül, hogy Ön látná azokat."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"szöveges üzenetek (MMS) fogadása"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"A(z) <xliff:g id="NAME">%s</xliff:g> a többi alkalmazás felett jelenik meg"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"A(z) <xliff:g id="NAME">%s</xliff:g> legfelül jelenik meg."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Előfordulhat, hogy ezen alkalmazás egyes részei mindig láthatók maradnak. Ha ez a funkció nem működik megfelelően, kapcsolja ki."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KIKAPCSOLÁS"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> előkészítése"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hibák keresése"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotók és más tartalmak átviteléhez"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Sérült <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült. Koppintson rá a javításhoz."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nem támogatott <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ez az eszköz nem támogatja ezt a(z) <xliff:g id="NAME">%s</xliff:g> eszközt. Koppintson rá a támogatott formátumban való beállításhoz."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"A(z) <xliff:g id="NAME">%s</xliff:g> váratlanul eltávolítva"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Az adatvesztés elkerülése érdekében kezdje a(z) <xliff:g id="NAME">%s</xliff:g> leválasztásával, mielőtt eltávolítaná azt"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> eltávolítva"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Az SS-kérés módosítva USSD-kérésre."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Az SS-kérés módosítva új SS-kérésre."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Munkaprofil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Kibontás gomb"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Kibontás"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Összecsukás"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"kibontás be- és kikapcsolása"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB-perifériaport"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 0169647..5a622d3 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Բովանդակությունը թաքցված է"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Բովանդակությունը թաքցվել է ըստ քաղաքականության"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Վիրտուալ ստեղնաշար"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Ֆիզիկական ստեղնաշար"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Անվտանգություն"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Մեքենայի ռեժիմ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Հաշվի կարգավիճակ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Մշակողի հաղորդագրություններ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Թարմացումներ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Ցանցի կարգավիճակ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Ցանցային զգուշացումներ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN կարգավիճակ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Սարքի կառավարում"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ծանուցումներ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Խանութի ցուցադրական ռեժիմ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB կապակցում"</string>
<string name="safeMode" msgid="2788228061547930246">"Անվտանգ ռեժիմ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android համակարգ"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Անցնել անհատական պրոֆիլին"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Հավելվածին թույլ է տալիս հեռացնել գլխավոր էկրանի դյուրանցումները՝ առանց օգտագործողի միջամտության:"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"վերաուղղել ելքային զանգերը"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Թույլ է տալիս ծրագրին ելքային զանգի ընթացքում տեսնել արդեն հավաքած համարը՝ հնարավորություն տալով վերահղել կամ անջատել զանգը։"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"պատասխանել հեռախոսազանգերին"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Հավելվածին թույլ է տալիս պատասխանել մուտքային հեռախոսազանգերին:"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ստանալ տեքստային հաղորդագրություններ (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Թույլ է տալիս հավելվածին ստանալ և մշակել SMS հաղորդագրությունները: Սա նշանակում է, որ հավելվածը կարող է ստուգել կամ ջնջել ձեր սարքին ուղարկված հաղորդագրությունները` առանց դրանք ձեզ ցուցադրելու:"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ստանալ տեքստային հաղորդագրություններ (MMS)"</string>
@@ -477,7 +463,7 @@
<string name="permlab_nfc" msgid="4423351274757876953">"վերահսկել Մոտ Տարածությամբ Հաղորդակցումը"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"Թույլ է տալիս հավելվածին հաղորդակցվել Մոտ տարածությամբ հաղորդակցման (NFC) պիտակների, քարտերի և ընթերցիչների հետ:"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"անջատել ձեր էկրանի կողպեքը"</string>
- <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Թույլ է տալիս հավելվածին անջատել ստեղնաշարի կողպումը և ցանկացած համակցված գաղտնաբառի պաշտպանվածությունը: Սրա ճիշտ օրինակն է, երբ հեռախոսը անջատում է ստեղնաշարի կողպումը մուտքային զանգ ստանալիս, հետո այն կրկին միացնում է, երբ զանգը ավարտվում է:"</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Թույլ է տալիս հավելվածին անջատել ստեղնաշարի կողպումը և ցանկացած կապված գաղտնաբառի պաշտպանվածությունը: Սրա ճիշտ օրինակն է, երբ հեռախոսը անջատում է ստեղնաշարի կողպումը մուտքային զանգ ստանալիս, հետո այն կրկին միացնում է, երբ զանգը ավարտվում է:"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"կառավարել մատնահետքերի գրանցման սարքը"</string>
<string name="permdesc_manageFingerprint" msgid="178208705828055464">"Հավելվածին թույլ է տալիս կատարել այնպիսի գործառույթներ, որոնց միջոցով կարելի է օգտագործման համար ավելացնել և հեռացնել մատնահետքերի նմուշներ:"</string>
<string name="permlab_useFingerprint" msgid="3150478619915124905">"օգտագործել մատնահետքերի գրանցման սարքը"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ցուցադրել այլ հավելվածների վերևում"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է վերևում։"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Այս հավելվածի որոշ հատվածներ կարող են միշտ տեսանելի լինել։ Եթե այս գործառույթն ինչպես հարկն է չի աշխատում, անջատեք այն։"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ԱՆՋԱՏԵԼ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ի նախապատրաստում"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Սխալների ստուգում"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Լուսանկարներ և մեդիա ֆայլեր տեղափոխելու համար"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>-ը վնասված է: Հպեք՝ շտկելու համար:"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Չապահովվող <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Այս սարքը չի աջակցում այս <xliff:g id="NAME">%s</xliff:g>-ը: Հպեք՝ աջակցվող ձևաչափով կարգավորելու համար:"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացվել է առանց անջատելու"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Տվյալները չկորցնելու համար անջատեք <xliff:g id="NAME">%s</xliff:g>-ը՝ մինչ հեռացնելը"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ը հեռացված է"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS հարցումը փոխվել է USSD հարցման:"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS հարցումը փոխվել է նոր SS հարցման:"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Աշխատանքային պրոֆիլ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"«Ընդարձակել» կոճակ"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Ընդարձակել"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Կոծկել"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Կոծկել/Ընդարձակել"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB արտաքին միացք"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 7363a78..eb08916 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Konten tersembunyi"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Konten disembunyikan menurut kebijakan"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Keyboard virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Keyboard fisik"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Keamanan"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mode mobil"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status akun"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Pesan developer"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Update"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status jaringan"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Notifikasi jaringan"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administrasi perangkat"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikasi"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo promo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Sambungan USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mode aman"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Beralih ke Pribadi"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Mengizinkan aplikasi menghapus pintasan Layar Utama tanpa tindakan dari pengguna."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ubah rute panggilan keluar"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Memungkinkan aplikasi melihat nomor yang dihubungi saat melakukan panggilan keluar dengan opsi untuk mengalihkan panggilan ke nomor lain atau membatalkan panggilan sepenuhnya."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"jawab panggilan telepon"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Mengizinkan aplikasi menjawab panggilan telepon masuk."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"terima pesan teks (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Memungkinkan aplikasi menerima dan memproses pesan SMS. Ini artinya aplikasi dapat memantau atau menghapus pesan yang dikirim ke perangkat Anda tanpa menunjukkannya kepada Anda."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"terima pesan teks (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> muncul di atas aplikasi lain"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikasi <xliff:g id="NAME">%s</xliff:g> muncul di atas."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Sebagian aplikasi ini mungkin selalu terlihat. Jika fitur ini tidak berfungsi dengan baik, nonaktifkan."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"NONAKTIFKAN"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyiapkan <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Memeriksa kesalahan"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk mentransfer foto dan media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> rusak"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> sudah rusak. Ketuk untuk memperbaiki."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak didukung"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Perangkat tidak mendukung <xliff:g id="NAME">%s</xliff:g> ini. Ketuk untuk menyiapkan dalam format yang didukung."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tiba-tiba dicabut"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Lingsirkan <xliff:g id="NAME">%s</xliff:g> sebelum mencabut agar data tidak hilang"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dicabut"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah menjadi permintaan USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah menjadi permintaan SS baru."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Tombol luaskan"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Luaskan"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Ciutkan"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"beralih ke perluasan"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port Periferal USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 3089d7a..eeb8819 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innihald falið"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Efni falið með reglu"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sýndarlyklaborð"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Vélbúnaðarlyklaborð"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Öryggi"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Bílastilling"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Staða reiknings"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Skilaboð þróunaraðila"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Uppfærslur"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Staða netkerfis"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Viðvaranir netkerfis"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Staða VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Stjórnun tækis"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Tilkynningar"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Kynningarútgáfa fyrir verslanir"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-tenging"</string>
<string name="safeMode" msgid="2788228061547930246">"Örugg stilling"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android kerfið"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Skipta yfir í persónulegt snið"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Leyfir forriti að fjarlægja flýtileiðir af heimaskjá án inngrips notanda."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"endurbeina hringdum símtölum"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Leyfir forriti að sjá símanúmerið þegar símtöl eru hringd, með möguleika á að beina símtalinu áfram á annað númer eða hætta alveg við símtalið."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"svara símtölum"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Heimilar forritinu að svara símtali sem berst."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"taka á móti textaskilaboðum (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Leyfir forriti að taka á móti og vinna úr SMS-skilaboðum. Þetta þýðir að forritið getur fylgst með eða eytt skilaboðum sem send eru í tækið án þess að birta þér þau."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"taka á móti textaskilaboðum (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ýttu til að velja tungumál og útlit"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> teiknar yfir önnur forrit"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> forritið birtist efst."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Hluti af þessu forriti gæti verið ávallt sýnilegur. Ef þessi eiginleiki virkar ekki sem skyldi skaltu slökkva á honum."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÖKKVA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Undirbýr <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Leitar að villum"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til að flytja myndir og aðrar skrár"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Skemmt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er skemmt. Ýttu til að laga."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Óstutt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Ýttu til að setja upp með studdu sniði."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> fjarlægt án fyrirvara"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Aftengdu <xliff:g id="NAME">%s</xliff:g> áður en þú fjarlægir það til að koma í veg fyrir gagnatap"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> fjarlægt"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-beiðni er breytt í USSD-beiðni."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-beiðni er breytt í nýja SS-beiðni."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Vinnusnið"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Stækka hnapp"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Stækka"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Minnka"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"stækka eða minnka"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB-tengi fyrir jaðartæki"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index c7d1fa5..821403a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenuti nascosti"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Contenuti nascosti in base alle norme"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Tastiera fisica"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sicurezza"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modalità automobile"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Stato dell\'account"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Messaggi dello sviluppatore"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Aggiornamenti"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Stato della rete"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Avvisi di rete"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stato della VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Amministrazione dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Avvisi"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo retail"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Connessione USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Passa al profilo personale"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Consente all\'applicazione di rimuovere le scorciatoie della schermata Home automaticamente."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reindirizzamento chiamate in uscita"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Consente all\'app di rilevare il numero digitato durante una chiamata in uscita, con la possibilità di reindirizzare la telefonata a un numero diverso o interromperla del tutto."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"rispondi a telefonate in arrivo"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Consente all\'app di rispondere a una telefonata in arrivo."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ricezione messaggi di testo (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Consente all\'applicazione di ricevere ed elaborare messaggi SMS. Significa che l\'applicazione potrebbe monitorare o eliminare i messaggi inviati al tuo dispositivo senza mostrarteli."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ricezione messaggi di testo (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tocca per selezionare la lingua e il layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> visualizzata sopra altre app"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"App <xliff:g id="NAME">%s</xliff:g> visualizzata sulle altre."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Alcune parti di questa app possono rimanere sempre visibili. Disattiva la funzione qualora non funzionasse correttamente."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DISATTIVA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparazione della <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ricerca errori"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per trasferire foto e altri file"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danneggiata"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"L\'elemento <xliff:g id="NAME">%s</xliff:g> è danneggiato. Tocca per risolvere."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non supportata"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Il dispositivo non supporta il seguente elemento: <xliff:g id="NAME">%s</xliff:g>. Tocca per configurare un formato supportato."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Rimozione imprevista della <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Per evitare di perdere dati, smonta la <xliff:g id="NAME">%s</xliff:g> prima di rimuoverla"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> rimossa"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"La richiesta SS è stata modificata in richiesta USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La richiesta SS è stata modificata in nuova richiesta SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profilo di lavoro"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Pulsante Espandi"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Espandi"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Comprimi"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"attiva/disattiva l\'espansione"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta periferica USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 12b2643..2209b48 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"התוכן מוסתר"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"התוכן מוסתר על ידי המדיניות"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"מקלדת וירטואלית"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"מקלדת פיזית"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"אבטחה"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"מצב נהיגה"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"סטטוס החשבון"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"הודעות למפתחים"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"עדכונים"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"סטטוס הרשת"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"התראות רשת"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"סטטוס ה-VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ניהול מכשירים"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"התראות"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"הדגמה לקמעונאים"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"חיבור USB"</string>
<string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string>
<string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"עבור ל\'אישי\'"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"מאפשר לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ניתוב מחדש של שיחות יוצאות"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"מאפשרת לאפליקציה לראות את המספר המחויג במהלך ביצוע שיחה יוצאת, עם האפשרות להפנות את השיחה למספר אחר או לבטל את השיחה לחלוטין."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"מענה לשיחות טלפון"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"מתירה לאפליקציה לענות לשיחות טלפון נכנסות"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"קבלת הודעות טקסט (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"מאפשר לאפליקציה לקבל ולעבד הודעות SMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"קבלת הודעות טקסט (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"הקש כדי לבחור שפה ופריסה"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> יכולה להופיע מעל אפליקציות אחרות"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> מופיעה מעל אפליקציות אחרות."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"חלקים באפליקציה הזו עשויים להופיע במסך כל הזמן. כבה את התכונה הזו אם היא לא עובדת כראוי."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"כבה"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"הכנת <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"בודק אם יש שגיאות"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"להעברת תמונות ומדיה"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> פגום"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> פגום. הקש כדי לתקן."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> לא נתמך"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"מכשיר זה אינו תומך ב-<xliff:g id="NAME">%s</xliff:g> זה. הקש כדי להגדיר בפורמט נתמך."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> הוסר באופן בלתי צפוי"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"בטל טעינה של <xliff:g id="NAME">%s</xliff:g> לפני הסרתו כדי למנוע אובדן נתונים"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> הוסר"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"בקשת SS שונתה לבקשת USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"בקשת SS שונתה לבקשת SS חדשה."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"פרופיל עבודה"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"לחצן הרחבה"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"הרחב"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"כווץ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"החלפת מצב הרחבה"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"יציאת USB בציוד היקפי של Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 4f9f2c3..f0b09f6 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"コンテンツが非表示"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ポリシーによって非表示になっているコンテンツ"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"仮想キーボード"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"物理キーボード"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"セキュリティ"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"運転モード"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"アカウントのステータス"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"デベロッパー メッセージ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"アップデート"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ネットワークのステータス"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ネットワーク通知"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN のステータス"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"端末管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"販売店デモ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB 接続"</string>
<string name="safeMode" msgid="2788228061547930246">"セーフモード"</string>
<string name="android_system_label" msgid="6577375335728551336">"Androidシステム"</string>
<string name="user_owner_label" msgid="1119010402169916617">"個人用に切り替える"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ユーザー操作なしでホーム画面のショートカットを削除することをアプリに許可します。"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"発信先の変更"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"発信を別の番号に転送するか完全に中止するオプションで、発信中にダイヤルされた番号にアクセスすることをアプリに許可します。"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"電話の応答"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"通話着信に応答することをアプリに許可します。"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"テキストメッセージ(SMS)の受信"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMSメッセージの受信と処理をアプリに許可します。これにより、アプリが端末に届いたメッセージを表示することなく監視または削除できるようになります。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"テキストメッセージ(MMS)の受信"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"タップして言語とレイアウトを選択してください"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>を重ねて表示中"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"このアプリの一部は常に表示され続けます。この機能が正常に動作しない場合は OFF にしてください。"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"OFF にする"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"写真などのメディア転送用"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>は破損しています"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>は破損しています。タップして修正してください。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"対応していない<xliff:g id="NAME">%s</xliff:g>です"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"この端末はこの <xliff:g id="NAME">%s</xliff:g>に対応していません。タップして、対応している形式でセットアップしてください。"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>が不適切に取り外されました"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"データの喪失を防ぐため<xliff:g id="NAME">%s</xliff:g>を取り外す前にマウントを解除してください。"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>が取り外されました"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SSリクエストはUSSDリクエストに変更されました。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SSリクエストは新しいSSリクエストに変更されました。"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"仕事用プロファイル"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"展開ボタン"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"折りたたむ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"展開の切り替え"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB周辺機器ポート"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 1c974fe..0e2aa7c 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"შიგთავსი დამალულია"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"შიგთავსი დამალულია წესების შესაბამისად"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ვირტუალური კლავიატურა"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ფიზიკური კლავიატურა"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"უსაფრთხოება"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"მანქანის რეჟიმი"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ანგარიშის სტატუსი"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"დეველოპერებთან დაკავშირებული შეტყობინებები"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"განახლებები"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ქსელის სტატუსი"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ქსელის გაფრთხილებები"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-ის სტატუსი"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"მოწყობილობის ადმინისტრირება"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"გაფრთხილებები"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"დემო-რეჟიმი საცალო მოვაჭრეებისთვის"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB კავშირი"</string>
<string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემა"</string>
<string name="user_owner_label" msgid="1119010402169916617">"პირად პროფილზე გადართვა"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"მთავარ ეკრანზე აპლიკაციისთვის მალსახმობების დამოუკიდებლად წაშლის უფლების მიცემა."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"გამავალი ზარების გადამისამართება"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"საშუალებას აძლევს აპს გამავალი ზარის დროს დაინახონ ზარის მიმღების ნომერი, ზარის სხვა მისამართზე გადამისამართებით ან ზარის საერთოდ შეწყვეტის საშუალებით."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"სატელეფონო ზარებზე პასუხი"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ნებართვას ანიჭებს აპს, უპასუხოს შემომავალ სატელეფონო ზარებს."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ტექსტური შეტყობინებების (SMS) მიღება"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"აპს შეეძლება SMS შეტყობინებების მიღება და დამუშავება. ეს ნიშნავს, რომ აპს შეეძლება თქვენ მოწყობილობაზე გამოგზავნილი შეტყობინებების მონიტორინგი და მათი წაშლა თქვენთვის ჩვენების გარეშე."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ტექსტური შეტყობინებების (MMS) მიღება"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"შეეხეთ ენისა და განლაგების ასარჩევად"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>-ის სხვა აპების ინტერფეისზე გადაწერა"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> აპის მიერ ზემოდან ჩვენება."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"აპის გარკვეული ნაწილები შესაძლოა ყოველთვის ხილული იყოს. თუ ეს ფუნქცია გამართულად არ მუშაობს, გამორთეთ."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"გამორთვა"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ის მომზადება"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"შეცდომების შემოწმება"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ფოტოებისა და მედიის გადასატანად"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"დაზიანებული <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია. შეეხეთ გასასწორებლად."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"მხარდაუჭერელი <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ეს <xliff:g id="NAME">%s</xliff:g> მხარდაუჭერელია არ მოწყობილობაზე. შეეხეთ მხარდაჭერილ ფორმატში დასაყენებლად."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"მოულოდნელად მოხდა <xliff:g id="NAME">%s</xliff:g>-ის ამოღება"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"მონაცემთა დაკარგვის თავიდან ასაცილებლად, ფიზიკურად ამოღებამდე, სისტემურად მოხსენით <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ამოღებულია"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS მოთხოვნა შეიცვალა ახალი SS მოთხოვნით."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"სამსახურის პროფილი"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"გაშლის ღილაკი"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"გაშლა"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ჩაკეცვა"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"გაშლის გადართვა"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android-ის პერიფერიული USB პორტი"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index c6bc07c..8f7a607 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Мазмұн жасырылған"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Мазмұн саясатқа сай жасырылған"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалды пернетақта"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Қатты пернетақта"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Қауіпсіздік"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Көлік режимі"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Есептік жазба күйі"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Әзірлеуші хабарлары"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Жаңартылған нұсқалар"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Желі күйі"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Желі дабылдары"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN күйі"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Құрылғыны басқару"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Дабылдар"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Бөлшек саудаға арналған демо нұсқасы"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB байланысы"</string>
<string name="safeMode" msgid="2788228061547930246">"Қауіпсіз режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android жүйесі"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Жекеге ауысу"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Қолданбаға Негізгі экранның төте пернелерін пайдаланушының қатысуынсыз алып тастау мүмкіндігін береді."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"шығыс қоңырауларды қайта бағыттау"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Қолданбаға шығыс қоңырау кезінде қоңырауды басқа нөмірге қайта бағыттау немесе қоңырауды мүлде доғару опциясы бар теріліп жатқан нөмірді көруге рұқсат береді."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"телефон қоңырауларына жауап беру"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Қолданбаға кіріс телефон қоңырауына жауап беруге рұқсат береді."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"мәтін хабарларын алу (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Қолданбаға SMS хабарларын алу және өңдеу мүмкіндігін береді. Бұл қолданба құрылғыңызға жіберілген хабарларды сізге көрсетпестен қабылдай және жоя алады дегенді білдіреді."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"мәтін хабарларын алу (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тіл мен пернетақта схемасын таңдау үшін түртіңіз"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> қолданбасы жоғарғы жағында көрсетіледі."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Бұл қолданбаның бір бөлігі үнемі көрініп тұруы мүмкін. Егер бұл функция дұрыс жұмыс істемесе, оны өшіріңіз."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨШІРУ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> дайындалуда"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Қателер тексерілуде"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Фотосуреттер мен медиа файлдарын тасымалдау үшін"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Бүлінген <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> бұзылды. Түзету үшін түртіңіз."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Қолданылмайтын <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бұл құрылғы <xliff:g id="NAME">%s</xliff:g> картасына қолдау көрсетеді. Қолдау көрсетілетін пішімде орнату үшін түртіңіз."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> кенеттен шығарылды"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Деректер жоғалып қалмауы үшін <xliff:g id="NAME">%s</xliff:g> құрылғысын ажыратып барып, шығару керек"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сұрауы USSD сұрауына өзгертілді."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сұрауы жаңа SS сұрауына өзгертілді."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жұмыс профилі"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Жаю түймесі"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жаю"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жию"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"жаю/жию"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB перифериялық порты"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index aaeba97..b594313 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"បានលាក់មាតិកា"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"មាតិកាត្រូវបានលាក់ដោយផ្អែកលើគោលការណ៍"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ក្ដារចុចនិម្មិត"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ក្ដារចុចរូបវន្ត"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"សុវត្ថិភាព"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"មុខងាររថយន្ត"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ស្ថានភាពគណនី"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"សារពីអ្នកអភិវឌ្ឍន៍"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"បច្ចុប្បន្នភាព"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ស្ថានភាពបណ្តាញ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ការជូនដំណឹងអំពីបណ្តាញ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"ស្ថានភាព VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ការគ្រប់គ្រងឧបករណ៍"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ការជូនដំណឹង"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"របៀបដាក់បង្ហាញក្នុងហាង"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"ការតភ្ជាប់ USB"</string>
<string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string>
<string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ប្តូរទៅផ្ទាល់ខ្លួន"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ឲ្យកម្មវិធីលុបផ្លូវកាត់អេក្រង់ដើមដោយគ្មានអំពើពីអ្នកប្រើ។"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"នាំផ្លូវការហៅចេញឡើងវិញ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ឲ្យកម្មវិធីឃើញលេខដែលកំពុងត្រូវបានហៅអំឡុងពេលហៅចេញដោយប្រើជម្រើស ដើម្បីបញ្ជូនការហៅបន្តទៅលេខផ្សេង ឬបោះបង់ការហៅរួមគ្នា។"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ទទួលការហៅទូរសព្ទ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"អនុញ្ញាតឲ្យកម្មវិធីនេះទទួលការហៅទូរសព្ទចូល។"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ទទួលសារអត្ថបទ (សារ SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ឲ្យកម្មវិធីទទួល និងដំណើរការសារ MMS ។ មានន័យថា កម្មវិធីអាចត្រួតពិនិត្យ ឬលុបសារដែលបានផ្ញើទៅឧបករណ៍របស់អ្នក ដោយមិនបង្ហាញអ្នក។"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ទទួលសារអត្ថបទ (MMS)"</string>
@@ -1199,9 +1185,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ប៉ះដើម្បីជ្រើសភាសា និងប្លង់"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> គូរពីលើកម្មវិធីផ្សេងទៀត"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"កម្មវិធី <xliff:g id="NAME">%s</xliff:g> បង្ហាញនៅលើគេ។"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ផ្នែកខ្លះនៃកម្មវិធីនេះនឹងនៅតែអាចមើលឃើញបានគ្រប់ពេល។ ប្រសិនបើមុខងារនេះដំណើរការមិនប្រក្រតីទេ សូមបិទវា។"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"បិទ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"កំពុងរៀបចំ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"កំពុងពិនិត្យរកកំហុស"</string>
@@ -1209,8 +1198,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"សម្រាប់ផ្ទេររូបភាព និងមេឌៀ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ខូច"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> បានខូចហើយ សូមប៉ះដើម្បីជួសជុល។"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> មិនគាំទ្រ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ឧបករណ៍នេះមិនគាំទ្រ <xliff:g id="NAME">%s</xliff:g> នេះទេ។ ប៉ះដើម្បីកំណត់ទម្រង់ដែលគាំទ្រ។"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញដោយមិនបានរំពឹងទុក"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ផ្តាច់ <xliff:g id="NAME">%s</xliff:g> មុនពេលដកចេញដើម្បីជៀងវាងការបាត់បង់ទិន្នន័យ"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"បានដក <xliff:g id="NAME">%s</xliff:g> ចេញ"</string>
@@ -1670,7 +1663,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ USSD។"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"សំណើរ SS ត្រូវបានកែសម្រួលទៅតាមសំណើរ SS ថ្មី។"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ប្រវត្តិរូបការងារ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"ប៊ូតុងពង្រីក"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ពង្រីក"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"លាក់"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"បិទ/បើកការពង្រីក"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"ឧបករណ៍រន្ធ USB Android បន្ថែម"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 4f14a55..5242ee4 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ವಿಷಯಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ನೀತಿಯಿಂದ ಮರೆಮಾಡಲಾಗಿರುವ ವಿಷಯಗಳು"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ಭದ್ರತೆ"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"ಕಾರ್ ಮೋಡ್"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ಖಾತೆಯ ಸ್ಥಿತಿ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ಡೆವಲಪರ್ ಸಂದೇಶಗಳು"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"ಅಪ್ಡೇಟ್ಗಳು"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ನೆಟ್ವರ್ಕ್ ಸ್ಥಿತಿ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ನೆಟ್ವರ್ಕ್ ಎಚ್ಚರಿಕೆಗಳು"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN ಸ್ಥಿತಿ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ಸಾಧನ ನಿರ್ವಹಣೆ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ಎಚ್ಚರಿಕೆಗಳು"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"ರಿಟೇಲ್ ಡೆಮೋ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB ಸಂಪರ್ಕ"</string>
<string name="safeMode" msgid="2788228061547930246">"ಸುರಕ್ಷಿತ ಮೋಡ್"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android ಸಿಸ್ಟಂ"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ವೈಯಕ್ತಿಕಗೆ ಬದಲಿಸಿ"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ಬಳಕೆದಾರರ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಹೋಮ್ಸ್ಕ್ರೀನ್ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ಹೊರಹೋಗುವ ಕರೆಗಳ ಮಾರ್ಗ ಬದಲಿಸಿ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ಬೇರೊಂದು ಸಂಖ್ಯೆಗೆ ಕರೆಯನ್ನು ಮರುನಿರ್ದೇಶಿಸಲು ಆಯ್ಕೆಯ ಜೊತೆಗೆ ಹೊರ ಹೋಗುವ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಡಯಲ್ ಮಾಡಿದ ಸಂಖ್ಯೆಯನ್ನು ನೋಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸಿ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ಒಳಬರುವ ಫೋನ್ ಕರೆಗೆ ಉತ್ತರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲೆ <xliff:g id="NAME">%s</xliff:g> ಎಳೆಯಿರಿ"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಮೇಲೆ ಕಾಣಿಸುತ್ತಿದೆ."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ಈ ಅಪ್ಲಿಕೇಶನ್ನ ಭಾಗಗಳು ಎಲ್ಲ ಸಮಯದಲ್ಲೂ ಕಾಣುತ್ತಿರುತ್ತದೆ. ಈ ವೈಶಿಷ್ಟ್ಯವು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿದ್ದರೆ, ಆಫ್ ಮಾಡಿ."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ಆಫ್ ಮಾಡಿ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ಫೋಟೋಗಳು ಮತ್ತು ಮಾಧ್ಯಮವನ್ನು ವರ್ಗಾಯಿಸಲು"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ದೋಷಪೂರಿತವಾಗಿದೆ. ಸರಿಪಡಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ಬೆಂಬಲಿಸದಿರುವ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ಈ ಸಾಧನವು <xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬೆಂಬಲಿತ ಫಾರ್ಮ್ಯಾಟ್ನಲ್ಲಿ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ಅನಿರೀಕ್ಷಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ಡೇಟಾ ನಷ್ಟವನ್ನು ತಪ್ಪಿಸಲು ತೆಗೆದುಹಾಕುವುದಕ್ಕೂ ಮುನ್ನ <xliff:g id="NAME">%s</xliff:g> ಅಳವಡಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ವಿನಂತಿಯನ್ನು ಹೊಸ SS ವಿನಂತಿಗೆ ಮಾರ್ಪಡಿಸಲಾಗಿದೆ."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"ವಿಸ್ತರಿಸು ಬಟನ್"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ಕುಗ್ಗಿಸಿ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ವಿಸ್ತರಣೆ ಟಾಗಲ್ ಮಾಡಿ"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ಪೆರಿಪೆರಲ್ ಪೋರ್ಟ್"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 93ee599..6b4cb4d 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"숨겨진 콘텐츠"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"콘텐츠가 정책에 의해 숨겨졌습니다."</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"가상 키보드"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"물리적 키보드"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"보안"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"운전모드"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"계정 상태"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"개발자 메시지"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"업데이트"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"네트워크 상태"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"네트워크 알림"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 상태"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"기기 관리"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"알림"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"소매 데모"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB 연결"</string>
<string name="safeMode" msgid="2788228061547930246">"안전 모드"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string>
<string name="user_owner_label" msgid="1119010402169916617">"개인으로 전환"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"애플리케이션이 사용자의 작업 없이 홈 화면 바로가기를 삭제할 수 있도록 허용합니다."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"발신전화 경로 전환"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"다른 번호로 다시 걸거나 중단시키는 옵션을 사용하여 발신한 번호를 볼 수 있게 허용합니다."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"전화 받기"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"앱에서 수신 전화를 받도록 허용합니다."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"문자 메시지 받기(SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"앱이 SMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 확인 또는 삭제할 수도 있습니다."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"문자 메시지 받기(MMS)"</string>
@@ -333,9 +319,9 @@
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS 메시지 전송 및 보기"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"앱이 SMS 메시지를 보낼 수 있도록 허용합니다. 이 경우 예상치 못한 통화 요금이 부과될 수 있습니다. 이 경우 악성 앱이 사용자의 확인 없이 메시지를 전송해 요금이 부과될 수 있습니다."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"내 문자 메시지 읽기(SMS 또는 MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"이 앱은 태블릿에 저장된 모든 SMS(문자 메시지)를 읽을 수 있습니다."</string>
- <string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"이 앱은 TV에 저장된 모든 SMS(문자 메시지)를 읽을 수 있습니다."</string>
- <string name="permdesc_readSms" product="default" msgid="6826832415656437652">"이 앱은 휴대전화에 저장된 모든 SMS(문자 메시지)를 읽을 수 있습니다."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"앱이 태블릿에 저장된 모든 내용의 SMS 메시지를 읽을 수 있도록 허용합니다."</string>
+ <string name="permdesc_readSms" product="tv" msgid="5796670395641116592">"앱이 TV에 저장된 모든 내용의 SMS 메시지를 읽을 수 있도록 허용합니다."</string>
+ <string name="permdesc_readSms" product="default" msgid="6826832415656437652">"앱이 휴대전화에 저장된 모든 내용의 SMS 메시지를 읽을 수 있도록 허용합니다."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"문자 메시지 받기(WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"앱이 WAP 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"실행 중인 앱 검색"</string>
@@ -391,9 +377,9 @@
<string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"이 앱은 TV에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
<string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"이 앱은 휴대전화에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"소유자에게 알리지 않고 캘린더 일정을 추가 또는 수정하고 참석자에게 이메일 전송"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"이 앱은 태블릿의 캘린더 일정을 추가, 삭제, 변경할 수 있습니다. 이 앱은 발신자가 캘린더 소유자인 메시지를 전송하거나 소유자가 모르는 사이에 일정을 수정할 수 있습니다."</string>
- <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"이 앱은 TV의 캘린더 일정을 추가, 삭제, 변경할 수 있습니다. 이 앱은 발신자가 캘린더 소유자인 메시지를 전송하거나 소유자가 모르는 사이에 일정을 수정할 수 있습니다."</string>
- <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"이 앱은 휴대전화의 캘린더 일정을 추가, 삭제, 변경할 수 있습니다. 이 앱은 발신자가 캘린더 소유자인 메시지를 전송하거나 소유자가 모르는 사이에 일정을 수정할 수 있습니다."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"앱이 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 앱이 메시지를 전송하거나 사용자에게 별도 표시 없이 일정을 수정할 수도 있습니다."</string>
+ <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"앱이 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 앱이 메시지를 전송하거나 사용자에게 별도 표시 없이 일정을 수정할 수도 있습니다."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"앱이 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 앱이 메시지를 전송하거나 사용자에게 별도 표시 없이 일정을 수정할 수도 있습니다."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"추가 위치 제공업체 명령에 접근"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"앱이 추가 위치 정보 제공 기능의 명령에 접근하도록 허용합니다. 이 경우 앱이 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
<string name="permlab_accessFineLocation" msgid="251034415460950944">"정확한 위치(GPS 및 네트워크 기반)에 액세스"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"탭하여 언어와 레이아웃을 선택하세요."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> 앱이 상단에 표시됨"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"이 앱의 일부는 항상 표시될 수도 있습니다. 기능이 제대로 작동되지 않으면 사용 중지하세요."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"사용 중지"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> 준비 중"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"오류 확인 중"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"사진 및 미디어를 전송하는 데 사용합니다."</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"손상된 <xliff:g id="NAME">%s</xliff:g>입니다."</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>이(가) 손상되었습니다. 해결하려면 탭하세요."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"지원되지 않는 <xliff:g id="NAME">%s</xliff:g>입니다."</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"이 기기는 <xliff:g id="NAME">%s</xliff:g>을(를) 지원하지 않습니다. 지원하는 형식으로 설정하려면 탭하세요."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>이(가) 예기치 않게 삭제됨"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"데이터 손실을 피하려면 <xliff:g id="NAME">%s</xliff:g>을(를) 마운트 해제한 다음 삭제하세요."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> 삭제됨"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 요청이 USSD 요청으로 수정됩니다."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 요청이 새로운 SS 요청으로 수정됩니다."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"직장 프로필"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"펼치기 버튼"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"펼치기"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"접기"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"확장 전환"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 주변기기 포트"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index fe6e541..e823cdf 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Мазмундар жашырылган"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Тийиштүү саясат боюнча жашырылган мазмундар"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалдык баскычтоп"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Аппараттык баскычтоп"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Коопсуздук"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Унаа режими"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Каттоо эсебинин абалы"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Иштеп чыгуучунун билдирүүлөрү"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Жаңыртуулар"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Тармактын абалы"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Тармактын эскертүүлөрү"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN абалы"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Түзмөктү администрациялоо"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Эскертүүлөр"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Чекене соода дүкөнү үчүн демо режим"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB аркылуу туташуу"</string>
<string name="safeMode" msgid="2788228061547930246">"Коопсуз режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android тутуму"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Жеке профилге которулуу"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Колдонмого колдонуучунун катышуусусуз үй экранынын тез чакырмаларын жок кылуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"чыгыш чалууларды кайра багыттоо"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Колдонмого кимдир-бирөөгө чалып жаткан учурда терилип жаткан номерди көрүү, ошондой эле чалууну башка номерге буруу же чалууну таптакыр токтотуп коюу мүмкүнчүлүгү берилет."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"телефон чалууларга жооп берүү"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Телефонго чалганда колдонмого жооп берүүгө уруксат берүү."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"билдирүүлөрдү (SMS) кабыл алуу"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Колдонмого SMS билдирүүлөрүн кабыл алууга жана аларды иштетип чыгууга уруксат берет. Бул, колдонмо сизге билгизбестен түзмөгүңүзгө жөнөтүлгөн билдирүүлөрдү мониторлой же жок кыла алат дегенди билдирет."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"билдирүүлөрдү (MMS) кабыл алуу"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тил жана калып тандоо үчүн таптап коюңуз"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> колд-сун эң үстүндө көрсөтүү"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Бул колдонмонун бөлүктөрү дайыма көрүнүп турушу мүмкүн. Эгер бул функция туура иштебесе, аны өчүрүп коюңуз."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ӨЧҮРҮҮ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> даярдалууда"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Каталар текшерилүүдө"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Сүрөттөрдү жана медиа өткөрүү үчүн"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> бузулган"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> - бузук. Оңдоо үчүн таптап коюңуз."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> колдоого алынбайт"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Бул түзмөктө <xliff:g id="NAME">%s</xliff:g> колдоого алынбайт. Колдоого алынуучу форматта орнотуу үчүн таптап коюңуз."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> күтүүсүздөн алынып салынды"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Дайындарды жоготуунун алдын алуу үчүн чыгаруудан мурун <xliff:g id="NAME">%s</xliff:g> түзмөгүн бошотуңуз"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> алынды"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS сурамы USSD сурамына өзгөртүлдү."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сурамы жаңы SS сурамына өзгөртүлдү."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жумуш профили"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Жайып көрсөтүү баскычы"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Жайып көрсөтүү"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Жыйыштыруу"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"жайып көрсөтүү же жыйыштыруу"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Сырткы оюкча"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index b7979f1..bb9dab6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ເນື້ອຫາຖືກເຊື່ອງໄວ້"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ເນື້ອຫາຖືກເຊື່ອງຕາມນະໂຍບາຍ"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ແປ້ນພິມສະເໝືອນ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ແປ້ນພິມພາຍນອກ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ຄວາມປອດໄພ"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"ໂໝດຂັບລົດ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ສະຖານະບັນຊີ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ຂໍ້ຄວາມນັກພັດທະນາ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"ອັບເດດ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ສະຖານະເຄືອຂ່າຍ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ແຈ້ງເຕືອນເຄືອຂ່າຍ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"ສະຖານະ VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ການເບິ່ງແຍງອຸປະກອນ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ການເຕືອນ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"ເດໂມສຳລັບຮ້ານຂາຍ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"ການເຊື່ອມຕໍ່ USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ສະລັບໄປໂປຣໄຟລ໌ສ່ວນຕົວ"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນລຶບທາງລັດໃນໜ້າຫຼັກໄດ້ ໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ປ່ຽນເສັ້ນທາງການໂທອອກ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ອະນຸຍາດໃຫ້ແອັບຯເບິ່ງໝາຍເລກເບີໂທ ໃນລະຫວ່າງການໂທອອກ ພ້ອມທັງໂຕເລືອກໃນການປ່ຽນເສັ້ນທາງການໂທໄປຫາເບີອື່ນ ຫຼື ລາຍລະອຽດກ່ຽວກັບເບີໂທລະສັບ."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ຮັບສາຍ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ອະນຸຍາດໃຫ້ແອັບຮັບສາຍໂທເຂົ້າໄດ້."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ຮັບຂໍ້ຄວາມສັ້ນ (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ອະນຸຍາດໃຫ້ແອັບຯຮັບ ແລະປະມວນຜົນຂໍ້ຄວາມ SMS. ນີ້ໝາຍຄວາມວ່າແອັບຯສາມາດຕິດຕາມ ຫຼືລຶບຂໍ້ຄວາມທີ່ສົ່ງເຂົ້າອຸປະກອນຂອງທ່ານ ໂດຍທີ່ບໍ່ສະແດງພວກມັນໃຫ້ທ່ານເຫັນ."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ຮັບຂໍ້ຄວາມ (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ແຕະເພື່ອເລືອກພາສາ ແລະ ໂຄງແປ້ນພິມ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ແຕ້ມທັບແອັບອື່ນ"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"ແອັບ <xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຢູ່ໜ້າສຸດ."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ບາງພາກສ່ວນຂອງແອັບນີ້ຈະປາກົດຢູ່ຕະຫຼອດເວລາ. ຫາກຄຸນສົມບັດນີ້ໃຊ້ໄດ້ບໍ່ດີ, ໃຫ້ປິດມັນໄວ້."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ປິດໄວ້"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"ກຳລັງກຽມ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ກຳລັງກວດຫາຂໍ້ຜິດພາດ"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ສຳລັບການໂອນຮູບຖ່າຍ ແລະມີເດຍ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ເສຍຫາຍແລ້ວ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ເສຍຫາຍ. ແຕະເພື່ອສ້ອມແປງ."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ບໍ່ຮອງຮັບ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບ <xliff:g id="NAME">%s</xliff:g> ນີ້. ແຕະເພື່ອຕັ້ງຄ່າໃນຮູບແບບທີ່ຮອງຮັບ."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ຖືກຖອດອອກໄປແບບບໍ່ຄາດຄິດ"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ຖອດເຊື່ອມຕໍ່ <xliff:g id="NAME">%s</xliff:g> ກ່ອນເອົາອອກໄປ ເພື່ອຫຼີກເວັ້ນການເສຍຂໍ້ມູນ"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ເອົາ <xliff:g id="NAME">%s</xliff:g> ອອກໄປແລ້ວ"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"ການຂໍ SS ຖືກດັດແປງເປັນການຂໍ USSD ແລ້ວ."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"ການຂໍ SS ຖືກດັດແປງເປັນການຂໍ SS ໃໝ່ແລ້ວ."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"ປຸ່ມຂະຫຍາຍ"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ຂະຫຍາຍ"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ຫຍໍ້ເຂົ້າ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ປິດ/ເປີດ ການຂະຫຍາຍ"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"ຜອດຮອບນອກ Android USB"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index f907836..67c1871 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Turinys paslėptas"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Turinys paslėptas vadovaujantis politika"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualioji klaviatūra"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizinė klaviatūra"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sauga"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Automobilio režimas"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Paskyros būsena"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Kūrėjų pranešimai"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Naujiniai"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Tinklo būsena"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Tinklo įspėjimai"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN būsena"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Įrenginio administravimas"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Įspėjimai"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstracinė versija mažmenininkams"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB jungtis"</string>
<string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string>
<string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Perjungti į asmeninį režimą"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Programai leidžiama pašalinti sparčiuosius klavišus iš pagrindinio ekrano be naudotojo įsikišimo."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"peradresuoti išsiunčiamuosius skambučius"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Leidžiama programai peržiūrėti renkamą numerį siunčiamojo skambučio metu suteikiant galimybę peradresuoti skambutį kitu numeriu arba visiškai nutraukti skambutį."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"atsakyti į telefonų skambučius"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Programai leidžiama atsakyti į gaunamąjį telefono skambutį."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"gauti teksto pranešimus (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Leidžiama programai gauti ir apdoroti SMS pranešimus. Tai reiškia, kad programa gali stebėti ir ištrinti į jūsų įrenginį siunčiamus pranešimus jums jų neparodžiusi."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"gauti teksto pranešimus (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Palieskite, kad pasirinktumėte kalbą ir išdėstymą"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> programa rodoma virš kitų programų"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> programa rodoma virš kitų."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Šios programos dalys gali likti matomos visą laiką. Jei ši funkcija tinkamai neveikia, išjunkite ją."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IŠJUNGTI"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ruošiama <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tikrinama, ar nėra klaidų"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Norint perkelti nuotraukas ir mediją"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Saugykla (<xliff:g id="NAME">%s</xliff:g>) sugadinta"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> sugadinta. Palieskite, kad ištaisytumėte."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepalaikoma saugykla (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Šis įrenginys nepalaiko šios <xliff:g id="NAME">%s</xliff:g>. Palieskite, kad nustatytumėte palaikomu formatu."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> netikėtai pašalinta"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Išmontuokite <xliff:g id="NAME">%s</xliff:g> prieš pašalindami, kad neprarastumėte duomenų."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Pašalinta <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS užklausa pakeista į USSD užklausą."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS užklausa pakeista į naują SS užklausą."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Darbo profilis"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Išskleidimo mygtukas"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Išskleisti"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sutraukti"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"perjungti išskleidimą"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"„Android“ USB išorinis prievadas"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index fe2fda8..f2f8e75 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Saturs paslēpts"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Saskaņā ar politiku saturs ir paslēpts."</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuālā tastatūra"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fiziskā tastatūra"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Drošība"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Automašīnas režīms"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Konta statuss"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Izstrādātāju ziņojumi"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Atjauninājumi"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Tīkla statuss"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Tīkla brīdinājumi"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN statuss"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Ierīces administrēšana"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Brīdinājumi"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrācijas versija veikaliem"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB savienojums"</string>
<string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Pārslēgt personīgo profilu"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Ļauj lietojumprogrammai noņemt saīsnes no sākuma ekrāna, nejautājot lietotājam."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"pārmaršrutēt izejošos zvanus"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Ļauj lietotnei skatīt ievadīto tālruņa numuru izejošā zvana laikā un piedāvā iespēju šo zvanu pāradresēt uz citu numuru vai vispār pārtraukt zvanu."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"Atbildēšana uz tālruņa zvaniem"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ļauj lietotnei atbildēt uz ienākošu tālruņa zvanu."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"saņemt īsziņas (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Ļauj lietotnei saņemt un apstrādāt īsziņas. Tas nozīmē, ka lietotne var pārraudzīt vai dzēst uz jūsu ierīci nosūtītos ziņojumus, neparādot tos jums."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"saņemt ziņojumus (MMS)"</string>
@@ -1217,9 +1203,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Pieskarieties, lai atlasītu valodu un izkārtojumu"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Lietotne <xliff:g id="NAME">%s</xliff:g> tiek rādīta pāri citām lietotnēm"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Lietotne <xliff:g id="NAME">%s</xliff:g> ir redzama virspusē."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Šīs lietotnes daļas joprojām var būt redzamas visu laiku. Ja šī funkcija nedarbojas pareizi, izslēdziet to."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZSLĒGT"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Notiek <xliff:g id="NAME">%s</xliff:g> sagatavošana"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tiek meklētas kļūdas"</string>
@@ -1227,8 +1216,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoattēlu un satura pārsūtīšanai."</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Bojāts datu nesējs (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Datu nesējs <xliff:g id="NAME">%s</xliff:g> ir bojāts. Pieskarieties, lai labotu."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Neatbalstīts datu nesējs (<xliff:g id="NAME">%s</xliff:g>)"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Šī ierīce neatbalsta datu nesēju <xliff:g id="NAME">%s</xliff:g>. Pieskarieties, lai iestatītu to atbalstītā formātā."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> tika negaidīti izņemta"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Pirms izņemšanas atvienojiet <xliff:g id="NAME">%s</xliff:g>, lai nezaudētu datus."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> tika izņemta"</string>
@@ -1698,7 +1691,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS pieprasījums ir mainīts uz USSD pieprasījumu."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS pieprasījums ir mainīts uz jaunu SS pieprasījumu."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Darba profils"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Poga Izvērst"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Izvērst"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Sakļaut"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"izvērst/sakļaut"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB perifērijas ports"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 3cd56a3..a0587d0 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Содржините се скриени"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Содржините се скриени поради политиката"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Физичка тастатура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Безбедност"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Режим на работа во автомобил"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Статус на сметка"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Пораки за програмери"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ажурирања"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Статус на мрежа"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Известувања на мрежа"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-статус"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Управување со уред"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Предупредувања"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демонстрација за малопродажба"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-врска"</string>
<string name="safeMode" msgid="2788228061547930246">"Безбеден режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Систем Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Префрлете на личен профил"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Овозможува апликацијата да отстранува кратенки до почетниот екран без интервенција на корисникот."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"пренасочи појдовни повици"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Дозволува апликацијата да го види бројот што се повикува за време на појдовен повик, со опција да го пренасочи повикот кон друг број или да го прекине повикот."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"одговара телефонски повици"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Дозволува апликацијата да одговара на дојдовен телефонски повик."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"прими текстуални пораки (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Овозможува апликацијата да прима и да обработува SMS пораки. Тоа значи дека апликацијата може да следи или да брише пораки испратени до вашиот уред без да ви ги прикаже вам."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"прими текстуални пораки (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Допрете за избирање јазик и распоред"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> пишува врз други апликации"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Апликацијата <xliff:g id="NAME">%s</xliff:g> е одозгора."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Делови од апликацијава може да бидат видливи цело време. Ако функцијава не работи правилно, исклучете ја."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЛУЧИ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Се подготвува <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Се проверува за грешки"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренесување фотографии и медиуми"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Оштетена <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> е оштетена. Допрете за поправање."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Неподдржана <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Уредот не ја поддржува оваа <xliff:g id="NAME">%s</xliff:g>. Допрете за поставување во поддржан формат."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> неочекувано е отстранета"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Откачете ја <xliff:g id="NAME">%s</xliff:g> пред да ја отстраните за да избегнете губење на податоците"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Отстранета <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1671,7 +1664,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Барањето SS е изменето во барање USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Барањето SS е изменето во ново барање SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Работен профил"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Копче Прошири"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Прошири"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Собери"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"вклучи/исклучи проширување"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Надворешна порта на УСБ за Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 404e5b8..9e8f497 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"കോൺടാക്റ്റുകൾ മറച്ചു"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"നയം അനുസരിച്ച് ഉള്ളടക്കം മറച്ചിരിക്കുന്നു"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോർഡ്"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"കീബോർഡ്"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"സുരക്ഷ"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"കാർ മോഡ്"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"അക്കൗണ്ട് നില"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ഡെവലപ്പർ സന്ദേശങ്ങൾ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"അപ്ഡേറ്റുകൾ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"നെറ്റ്വർക്ക് നില"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"നെറ്റ്വർക്ക് അലേർട്ടുകൾ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN നില"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ഉപകരണ അഡ്മിനിസ്ട്രേഷൻ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"അലേർട്ടുകൾ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"റീട്ടെയിൽ ഡെമോ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB കണക്ഷൻ"</string>
<string name="safeMode" msgid="2788228061547930246">"സുരക്ഷിത മോഡ്"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android സിസ്റ്റം"</string>
<string name="user_owner_label" msgid="1119010402169916617">"വ്യക്തിഗത പ്രൊഫൈലിലേക്ക് മാറുക"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ഉപയോക്തൃ ഇടപെടലില്ലാതെ ഹോംസ്ക്രീൻ കുറുക്കുവഴികൾ നീക്കംചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ഔട്ട്ഗോയിംഗ് കോളുകൾ വീണ്ടും റൂട്ടുചെയ്യുക"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"മറ്റ് നമ്പരിലേക്ക് കോൾ റീഡയറക്ടുചെയ്യുന്നതിനോ എല്ലാ കോളുകളും ഒപ്പം ഇല്ലാതാക്കുന്നതിനോ ഉള്ള ആയ ഓപ്ഷൻ ഉപയോഗിക്കുന്ന ഔട്ട്ഗോയിംഗ് കോളിൽ ഡയൽ ചെയ്യുന്ന നമ്പർ കാണുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ഫോൺ കോളുകൾക്ക് മറുപടി നൽകുക"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ഇൻകമിംഗ് ഫോൺ കോളിന് മറുപടി നൽകാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"വാചക സന്ദേശം നേടുക (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS സന്ദേശങ്ങൾ നേടാനും പ്രോസസ്സുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങളുടെ ഉപകരണത്തിലേക്ക് അയയ്ക്കുന്ന സന്ദേശങ്ങൾ നിങ്ങൾക്ക് ദൃശ്യമാക്കാതെ തന്നെ അപ്ലിക്കേഷന് നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ കഴിയുമെന്നാണ് ഇതിനർത്ഥം."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"വാചക സന്ദേശം നേടുക (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ഭാഷയും ലേഔട്ടും തിരഞ്ഞെടുക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രവർത്തിക്കും"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> മുകളിൽ ദൃശ്യമാകുന്നു."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ഈ ആപ്പിന്റെ ഭാഗങ്ങൾ തുടർന്നും ദൃശ്യമായേക്കാം. ഈ ഫീച്ചർ ശരിയായി പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ അത് ഓഫ് ചെയ്യുക."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ഓഫാക്കുക"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> തയ്യാറാകുന്നു"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ഫോട്ടോകളും മീഡിയയും ട്രാൻസ്ഫർ ചെയ്യാൻ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"കേടായ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> കേടായിരിക്കുന്നു. പരിഹരിക്കാൻ ടാപ്പുചെയ്യുക."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"പിന്തുണയില്ലാത്ത <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ഈ ഉപകരണം <xliff:g id="NAME">%s</xliff:g> പിന്തുണയ്ക്കുന്നതല്ല. പിന്തുണയുള്ള ഫോർമാറ്റിൽ സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> അപ്രതീക്ഷിതമായി നീക്കംചെയ്തു"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"വിവരങ്ങൾ നഷ്ടപ്പെടുന്നത് ഒഴിവാക്കാൻ നീക്കംചെയ്യുന്നതിനുമുമ്പ് <xliff:g id="NAME">%s</xliff:g> അൺമൗണ്ടുചെയ്യുക"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> നീക്കംചെയ്തു"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS അഭ്യർത്ഥന, USSD അഭ്യർത്ഥനയായി പരിഷ്ക്കരിച്ചു."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS അഭ്യർത്ഥന, പുതിയ SS അഭ്യർത്ഥനയായി പരിഷ്ക്കരിച്ചു."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"\'വികസിപ്പിക്കുക\' ബട്ടൺ"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"വികസിപ്പിക്കുക"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ചുരുക്കുക"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"വികസിപ്പിക്കൽ ടോഗിൾ ചെയ്യുക"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB പെരിഫറൽ പോർട്ട്"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index ce3619c..d12c8d9 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Контентыг нуусан"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Удирдамжийн дагуу нуусан агуулга"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуал гар"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Бодит гар"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Аюулгүй байдал"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Машины горим"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Бүртгэлийн төлөв"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Хөгжүүлэгчийн мессеж"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Шинэчлэлтүүд"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Сүлжээний төлөв"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Сүлжээний сануулга"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN төлөв"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Төхөөрөмжийн удирдлага"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сануулга"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Жижиглэнгийн жишээ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB холболт"</string>
<string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string>
<string name="user_owner_label" msgid="1119010402169916617">"\"Хувийн\" руу шилжих"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Аппликешн нь хэрэглэгчийн оролцоогүйгээр Нүүр дэлгэцний товчлолыг устгаж чадна."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"гарсан дуудлагыг чиглэлийг өөрчлөх"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Гадагш дуудлага хийх үед залгасан дугаарыг харах, дуудлагыг өөр дугаар руу шилжүүлэх, таслах боломжтой болгоно."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"утасны дуудлагад хариулах"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ирж буй утасны дуудлагад хариулах зөвшөөрлийг апп-д олгодог."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"текст мессеж(SMS) хүлээж авах"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Апп нь SMS мессежийг хүлээн авах болон гүйцэтгэх боломжтой. Ингэснээр апп нь таны төхөөрөмжрүү илгээсэн мессежийг танд үзүүлэхгүйгээр хянах болон устгаж чадна."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"текст мессеж(МMS) хүлээж авах"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Хэл болон бүдүүвчийг сонгохын тулд дарна уу"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> бусад аппын дээр гарч ирсэн"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> апп дээр харагдаж байна."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Энэ аппын зарим хэсэг нь тогтмол харагдана. Энэ онцлог буруу ажиллаж байвал унтраана уу."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"УНТРААХ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ыг бэлдэж байна"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Алдааг шалгаж байна"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Зураг, медиа шилжүүлэхэд зориулсан"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> гэмтсэн"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> эвдэрсэн байна. Засахын тулд товшино уу."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Дэмжээгүй <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Энэ төхөөрөмж нь <xliff:g id="NAME">%s</xliff:g>-г дэмждэггүй. Дэмжигдсэн хэлбэршүүлэлтэд тохируулахын тулд товшино уу."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ыг гэнэт гаргасан байна"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Өгөгдөл алдагдахаас сэргийлж <xliff:g id="NAME">%s</xliff:g>-ыг гаргахаас өмнө салга"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g>-ыг гаргасан"</string>
@@ -1666,7 +1659,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS хүсэлтийг USSD хүсэлт болгон өөрчилсөн байна."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS хүсэлтийг шинэ SS хүсэлт болгон өөрчилсөн байна."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ажлын профайл"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Дэлгэх товчлуур"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Дэлгэх"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Буулгах"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"унтраах/асаах өргөтгөл"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Андройд USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 1d1864a..3d94f14 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"लपविलेली सामग्री"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"धोरणाद्वारे सामग्री लपविली"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"व्हर्च्युअल कीबोर्ड"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"वास्तविक कीबोर्ड"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"सुरक्षितता"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"कार मोड"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"खाते स्थिती"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"विकसक संदेश"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"अद्यतने"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"नेटवर्क स्थिती"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"नेटवर्क सूचना"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN स्थिती"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"डिव्हाइस प्रशासन"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"सूचना"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"किरकोळ डेमो"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB कनेक्शन"</string>
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string>
<string name="user_owner_label" msgid="1119010402169916617">"वैयक्तिकवर स्विच करा"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"अनुप्रयोगाला वापरकर्ता हस्तक्षेपाशिवाय मुख्यस्क्रीन शॉर्टकट काढण्याची अनुमती देते."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"केले जाणारे कॉल पुन्हा मार्गस्थ करा"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"कॉल केला जात असताना कॉलला भिन्न नंबरवर पुनर्निर्देशित करण्याच्या किंवा संपूर्ण कॉल रद्द करण्याच्या पर्यायासह डायल केला जाणारा नंबर पाहण्याची अॅपला अनुमती देते"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"फोन कॉलचे उत्तर द्या"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"येणार्या फोन कॉलचे उत्तर देण्यास अॅपला अनुमती देते."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"मजकूर संदेश प्राप्त करा (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS संदेश प्राप्त करण्याची आणि त्यावर प्रक्रिया करण्याची अॅप ला अनुमती देते. म्हणजेच अॅप आपल्या डिव्हाइसवर पाठविलेले संदेश आपल्याला न दर्शवता त्यांचे परीक्षण करू किंवा ते हटवू शकतो."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"मजकूर संदेश प्राप्त करा (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा आणि लेआउट निवडण्यासाठी टॅप करा"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर काढा"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> अॅप शीर्षस्थानी प्रदर्शित होत आहे"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"या अॅपचे भाग सर्व वेळी दृश्यमान असू शकतात. हे वैशिष्ट्य बरोबर काम करत नसल्यास, ते बंद करा."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"बंद करा"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> तयार करीत आहे"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटींसाठी तपासत आहे"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"फोटो आणि मीडिया स्थानांतरित करण्यासाठी"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> दूषित झालेले"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> दूषित आहे. निराकरण करण्यासाठी टॅप करा."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> असमर्थित"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"हे डिव्हाइस <xliff:g id="NAME">%s</xliff:g> ला समर्थन देत नाही. समर्थित स्वरूपनामध्ये सेट करण्यासाठी टॅप करा."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अनपेक्षितरित्या काढले"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा गमावणे टाळण्यासाठी काढण्यापूर्वी <xliff:g id="NAME">%s</xliff:g> अनमाउंट करा"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> काढले"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS विनंती USSD विनंतीवर सुधारित केली आहे."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS विनंती नवीन SS विनंतीवर सुधारित केली आहे."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाईल"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"विस्तृत करा बटण"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत करा"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संकुचित करा"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"टॉगल विस्तार"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB परिधीय पोर्ट"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 531df6b..252c268 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Kandungan tersembunyi"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Kandungan disembunyikan oleh dasar"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Papan kekunci maya"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Papan kekunci fizikal"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Keselamatan"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mod kereta"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status akaun"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mesej pembangun"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Kemas kini"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status rangkaian"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Makluman rangkaian"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Pentadbiran peranti"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Makluman"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Tunjuk cara runcit"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Sambungan USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Beralih kepada Peribadi"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Membenarkan aplikasi mengalih keluar pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"tukar laluan panggilan keluar"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Membenarkan apl melihat nombor yang didail semasa panggilan keluar dengan pilihan untuk mengubah hala panggilan ke nombor lain atau membatalkan terus panggilan."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"jawab panggilan telefon"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Membenarkan apl menjawab panggilan telefon masuk."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"terima mesej teks (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Membenarkan apl menerima dan memproses mesej SMS. Ini bermakna apl boleh memantau atau memadam mesej yang dihantar ke peranti anda tanpa menunjukkannya kepada anda."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"terima mesej teks (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketik untuk memilih bahasa dan susun atur"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> melukis di atas apl lain"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl <xliff:g id="NAME">%s</xliff:g> dipaparkan di bahagian atas."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Sebahagian daripada apl ini mungkin kekal kelihatan pada sepanjang masa. Jika ciri ini tidak berfungsi dengan betul, matikan ciri ini."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"MATIKAN"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyediakan <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Menyemak untuk mengesan ralat"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk memindahkan foto dan media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> rosak"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> rosak. Ketik untuk membetulkannya."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak disokong"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Peranti ini tidak menyokong <xliff:g id="NAME">%s</xliff:g> ini. Ketik untuk menyediakannya dalam format yang disokong."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan tanpa dijangka"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Nyahlekap <xliff:g id="NAME">%s</xliff:g> sebelum menanggalkannya untuk mengelakkan kehilangan data"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> dialih keluar"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Permintaan SS diubah kepada permintaan USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Permintaan SS diubah kepada permintaan SS baharu."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil kerja"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Butang kembangkan"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Kembangkan"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Runtuhkan"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"togol pengembangan"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port Persisian USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f50e650..f37dd86 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"၉၉၉+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"အကြောင်းအရာများ ဝှက်ထား"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"မူဝါဒမှ အကြောင်းအရာများကို ဝှက်ထားသည်"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ကီးဘုတ်အတု"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ကီးဘုတ် ခလုတ်ခုံ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"လုံခြုံရေး"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"ကားမုဒ်"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"အကောင့် အခြေအနေ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ဆော့ဖ်ဝဲအင်ဂျင်နီယာ မက်ဆေ့ဂျ်များ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"အပ်ဒိတ်များ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ကွန်ရက် အခြေအနေ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ကွန်ရက် သတိပေးချက်များ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN အခြေအနေ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"စက်ပစ္စည်း စီမံခန့်ခွဲမှု"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"သတိပေးချက်များ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"လက်လီအရောင်းဆိုင် သရုပ်ပြမှု"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB ချိတ်ဆက်မှု"</string>
<string name="safeMode" msgid="2788228061547930246">"အန္တရာယ်ကင်းမှု စနစ်(Safe mode)"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android စနစ်"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ကိုယ်ပိုင်သီးသန့်အဖြစ် ပြောင်းပါ"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"အပလီကေးရှင်းအား အသုံးပြုသူ လုပ်ဆောင်ခြင်း မပါပဲ ပင်မ မြင်ကွင်းအား ဖယ်ရှားခွင့် ပေးခြင်း"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"အထွက် ခေါ်ဆိုမှုများအား လမ်းလွှဲပြောင်းခြင်း"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"အက်ပ်အား အပြင်သို့ ဖုန်းခေါ်ဆိုမှု အတွင်းမှာ ဆက်ခဲ့သည့် နံပါတ်ကို ကြည့်နိုင်ကာ ခေါ်ဆိုမှုကို အခြား နံပါတ် တစ်ခုသို့ ပြောင်းလဲပစ်ခြင်း သို့မဟုတ် ခေါ်ဆိုမှုကို လုံးဝ ဖျက်သိမ်းခွင့် ပြုသည်။"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ဖုန်းခေါ်ဆိုမှုများကို ဖြေကြားရန်"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"အဝင်ဖုန်းခေါ်ဆိုမှုကို ဖြေကြားရန် အက်ပ်ကို ခွင့်ပြုပါသည်။"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (စာတိုစနစ်)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"အပလီကေးရှင်းအား စာတိုများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (ရုပ်သံစာ)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပေါ်ပါမည်"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> အက်ပ်ကို အပေါ်ဆုံးတွင် ပြမည်။"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ဤအက်ပ်၏ တစ်စိတ်တစ်ဒေသကို အမြဲမြင်တွေ့နိုင်ပါမည်။ အကယ်၍ ဤဝန်ဆောင်မှုသည် မှန်မှန်ကန်ကန် အလုပ်မလုပ်လျှင် ၎င်းကို ပိတ်လိုက်ပါ။"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ပိတ်ပါ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ပြင်ဆင်နေသည်"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"အမှားအယွင်းများ စစ်ဆေးနေသည်"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ဓာတ်ပုံနှင့် မီဒီယာများ လွှဲပြောင်းရန်အတွက်"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ပျက်စီးနေသော <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ပျက်နေပါသည်။ ပြင်ရန် တို့ပါ။"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ပံ့ပိုးထားခြင်း မရှိသော <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ဤစက်ပစ္စည်းတွင် <xliff:g id="NAME">%s</xliff:g> ကိုအသုံးပြု၍မရပါ။ အသုံးပြု၍ရသော စနစ်ပုံစံသို့သတ်မှတ်ရန် တို့ပါ။"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> မမျှော်လင့်ဘဲ ဖယ်ရှားခဲ့သည်"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ဒေတာဆုံးရှုံးခြင်းမှ ကာကွယ်ရန် မဖယ်ရှားမှီ <xliff:g id="NAME">%s</xliff:g> ကိုဖြုတ်ပါ။"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ဖယ်ရှားလိုက်ပြီ"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"USSD တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS တောင်းဆိုချက်အရ SS တောင်းဆိုချက်အား ပြင်ဆင်ထား၏။"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"အလုပ်ကိုယ်ရေးအချက်အလက်"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"တိုးချဲ့ရန်ခလုတ်"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ချဲ့ရန်"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ခေါက်သိမ်းရန်"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ချဲ့ခြင်းခလုတ်"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ဘေးဘက်အပေါက်"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"အန်းဒရွိုက်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 8ee44c8..6efe544 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innholdet er skjult"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Innholdet er skjult i henhold til retningslinjene"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fysisk tastatur"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Sikkerhet"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Bilmodus"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Kontostatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Utviklermeldinger"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Oppdateringer"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Nettverksstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Nettverksvarsler"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhetsadministrasjon"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varsler"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Butikkdemo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-tilkobling"</string>
<string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Bytt til den personlige profilen"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Lar appen fjerne snarveier på startsiden uten å involvere brukeren."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"omdirigere utgående anrop"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Lar appen se nummeret det ringes til under en utgående samtale, med mulighet for å omdirigere anropet til et annet nummer eller avbryte samtalen fullstendig."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"besvar telefonanrop"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Lar appen besvare et innkommende telefonanrop."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"motta tekstmeldinger (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Lar appen motta og behandle tekstmeldinger. Dette betyr at appen kan overvåke eller slette meldinger som er sendt til enheten din uten at du har sett dem."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"motta tekstmeldinger (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trykk for å velge språk og layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ligger over andre apper"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-appen vises øverst."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Deler av denne appen kan være synlige til enhver tid. Slå denne funksjonen av hvis den ikke fungerer som den skal."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ AV"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sjekker for feil"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For overføring av bilder og medier"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Skadet <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> er skadet. Trykk for å løse problemet."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> som ikke støttes"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enheten støtter ikke <xliff:g id="NAME">%s</xliff:g>. Trykk for å konfigurere i et støttet format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ble uventet fjernet"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Løs ut <xliff:g id="NAME">%s</xliff:g> før du fjerner den for å unngå tap av data"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ble fjernet."</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-forespørselen er endret til en USSD-forespørsel."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-forespørselen er endret til en ny SS-forespørsel."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Arbeidsprofil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Knapp for å vise mer"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Vis"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skjul"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"slå utvidelse av/på"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port for USB-tilleggsutstyr for Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 4895ab6..f1cd4ee 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"लुकेका सामाग्रीहरू"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"नीतिद्वारा लुकाइएका सामग्री"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"भर्चुअल किबोर्ड"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"भौतिक किबोर्ड"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"सुरक्षा"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"कार मोड"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"खाताको स्थिति"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"विकासकर्ताका सन्देशहरू"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"अद्यावधिकहरू"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"नेटवर्कको स्थिति"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"नेटवर्कका अलर्टहरू"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN को स्थिति"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"यन्त्रको प्रशासन"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"अलर्टहरू"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"खुद्रा बिक्री सम्बन्धी डेमो"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB जडान"</string>
<string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string>
<string name="android_system_label" msgid="6577375335728551336">"एन्ड्रोइड प्रणाली"</string>
<string name="user_owner_label" msgid="1119010402169916617">"व्यक्तिगत प्रोफाइलमा स्विच गर्नुहोस्"</string>
@@ -279,11 +267,11 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईँको पात्रोमाथि पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"भण्डारण"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईँको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईंको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"अडियो रेकर्ड गर्नुहोस्"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"क्यामेरा"</string>
@@ -291,7 +279,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईँको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा अनुप्रयोगलाई सर्टकटमा हटाउनको लागि अनुमति दिन्छ।"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"बहिर्गमन कलहरूलाई अर्को मार्ग दिनुहोस्"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"अनुप्रयोगलाई अन्य नम्बरमा कल पुर्ननिर्देश वा समग्र कल परित्याग विकल्प सहित बहिर्गमन कल समयमा डायल गर्दाको नम्बर हेर्न अनुमति दिन्छ।"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"फोन कलहरूको जवाफ दिनुहोस्"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"अनुप्रयोगलाई आगमन फोन कलको जवाफ दिन अनुमति दिन्छ।"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"पाठ सन्देशहरू (SMS) प्राप्त गर्नुहोस्"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"अनुप्रयोगलाई SMS सन्देशहरू प्राप्त गर्न र प्रक्रिया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"पाठ सन्देश (MMS) प्राप्त गर्नुहोस्"</string>
@@ -1203,9 +1189,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा र लेआउट चयन गर्न ट्याप गर्नुहोस्"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> लाई अन्य अनुप्रयोगहरूमा देखिन दिनुहोस्"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> अनुप्रयोग शीर्षमा देखाउँदै।"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"यो अनुप्रयोगका केही अंशहरू सधैँ देखिरहन सक्छन्। यो सुविधाले सही ढंगले काम गरिरहेको छैन भने, यसलाई बन्द गर्नुहोस्।"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"निष्क्रिय पार्नुहोस्"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"तयारी गर्दै <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string>
@@ -1213,8 +1202,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"तस्बिरहरू र मिडिया स्थानान्तरणका लागि"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"बिग्रेको <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> त्रुटिपूर्ण छ। समाधान गर्न ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"असमर्थित <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"यस यन्त्रले यस <xliff:g id="NAME">%s</xliff:g> लाई समर्थन गर्दैन। एक समर्थित ढाँचामा सेट अप गर्न ट्याप गर्नुहोस्।"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> अप्रत्याशित रूपमा निकालियो"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"डेटा हराउनबाट जोगाउन निकाल्नु अघि <xliff:g id="NAME">%s</xliff:g> अनमाउन्ट गर्नुहोस्"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"निकालियो <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1674,7 +1667,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS अनुरोध USSD अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS अनुरोध नयाँ SS अनुरोधमा परिमार्जन गरिएको छ।"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"कार्य प्रोफाइल"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"विस्तृत गर्ने बटन"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"विस्तृत गर्नुहोस्"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"संक्षिप्त गर्नुहोस्"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"विस्तारलाई टगल गर्नुहोस्"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB पेरिफेरल पोर्ट"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 255ea72..cb960319 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Content verborgen"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Content verborgen op basis van beleid"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtueel toetsenbord"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fysiek toetsenbord"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Beveiliging"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Automodus"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Accountstatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Ontwikkelaarsberichten"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Updates"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Netwerkstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Netwerkmeldingen"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Apparaatbeheer"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Meldingen"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo voor de detailhandel"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-verbinding"</string>
<string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Overschakelen naar persoonlijk profiel"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"De app toestaan snelkoppelingen van het startscherm te verwijderen zonder tussenkomst van de gebruiker."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"uitgaande oproepen doorschakelen"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"De app toestaan het nummer te bekijken dat wordt gekozen voor een uitgaande oproep, met de mogelijkheid de oproep om te leiden naar een ander nummer of de oproep helemaal af te breken."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"telefoonoproepen beantwoorden"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Hiermee kan de app een inkomende telefoonoproep beantwoorden."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"tekstberichten (SMS) ontvangen"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Hiermee kan de app sms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"tekstberichten (MMS) ontvangen"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om een taal en indeling te selecteren"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>-app bovenop weergeven."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delen van deze app blijven altijd zichtbaar. Als deze functie niet correct werkt, schakel je deze uit."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"UITSCHAKELEN"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> voorbereiden"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Controleren op fouten"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Voor overzetten van foto\'s en media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> beschadigd"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> is beschadigd. Tik om te verhelpen."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> niet ondersteund"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dit apparaat biedt geen ondersteuning voor deze <xliff:g id="NAME">%s</xliff:g>. Tik om te configureren in een ondersteunde indeling."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwacht verwijderd"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ontkoppel <xliff:g id="NAME">%s</xliff:g> voordat u deze verwijdert om gegevensverlies te voorkomen"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> verwijderd"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-verzoek is gewijzigd in USSD-verzoek."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-verzoek is gewijzigd in nieuw SS-verzoek."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Werkprofiel"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Knop voor uitvouwen"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Uitvouwen"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Samenvouwen"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"uitvouwen in-/uitschakelen"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Poort voor Android-USB-randapparatuur"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index d97a436..1136f1d 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ਸਮੱਗਰੀਆਂ ਲੁਕਾਈਆਂ ਗਈਆਂ"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ਨੀਤੀ ਦੁਆਰਾ ਸਮੱਗਰੀ ਲੁਕਾਈ ਗਈ"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ਸੁਰੱਖਿਆ"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"ਕਾਰ ਮੋਡ"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ਖਾਤੇ ਦੀ ਅਵਸਥਾ"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ਵਿਕਾਸਕਾਰ ਸੁਨੇਹੇ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"ਅੱਪਡੇਟ"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ਨੈੱਟਵਰਕ ਅਵਸਥਾ"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ਨੈੱਟਵਰਕ ਸੁਚੇਤਨਾਵਾਂ"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN ਅਵਸਥਾ"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਨ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ਸੁਚੇਤਨਾਵਾਂ"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"ਪ੍ਰਚੂਨ ਸਟੋਰਾਂ ਲਈ ਡੈਮੋ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB ਕਨੈਕਸ਼ਨ"</string>
<string name="safeMode" msgid="2788228061547930246">"ਸੁਰੱਖਿਅਤ ਮੋਡ"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ਨਿੱਜੀ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਰੀਰੂਟ ਕਰੋ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ਐਪ ਨੂੰ ਇੱਕ ਵੱਖ ਨੰਬਰ ਨਾਲ ਕਾਲ ਰੀਡਾਇਰੈਕਟ ਕਰਨ ਜਾਂ ਕਾਲ ਨੂੰ ਪੂਰਾ ਰੋਕਣ ਦੀ ਚੋਣ ਨਾਲ ਇੱਕ ਆਊਟਗੋਇੰਗ ਕਾਲ ਦੇ ਦੌਰਾਨ ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨੰਬਰ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ਫ਼ੋਨ ਕਾਲਾਂ ਦਾ ਜਵਾਬ ਦਿਓ"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ਐਪ ਨੂੰ ਆਉਣ ਵਾਲੀ ਫ਼ੋਨ ਕਾਲ ਦਾ ਜਵਾਬ ਦੇਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ਟੈਕਸਟ ਸੁਨੇਹੇ (SMS) ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ਐਪ ਨੂੰ SMS ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਐਪ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਮਿਟਾ ਸਕਦਾ ਹੈ।"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ਟੈਕਸਟ ਸੁਨੇਹੇ (MMS) ਪੜ੍ਹੋ"</string>
@@ -786,7 +772,7 @@
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ਅਨਲੌਕ ਖੇਤਰ ਨਸ਼ਟ ਕੀਤਾ।"</string>
<string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ਵਿਜੇਟ।"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ਉਪਭੋਗਤਾ ਚੋਣਕਾਰ"</string>
- <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ਸਥਿਤੀ"</string>
+ <string name="keyguard_accessibility_status" msgid="8008264603935930611">"ਅਵਸਥਾ"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ਕੈਮਰਾ"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ਮੀਡੀਆ ਨਿਯੰਤਰਣ"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ਵਿਜੇਟ ਨੂੰ ਪੁਨਰ ਤਰਤੀਬ ਦੇਣਾ ਸ਼ੁਰੂ ਹੋਇਆ।"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> ਹੋਰਾਂ ਐਪਾਂ ਉੱਤੇ ਪਸਰ ਸਕਦੀ ਹੈ"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਪਸਰੀ ਦਿਸ ਰਹੀ ਹੈ।"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਐਪ ਦੇ ਕੁਝ ਹਿੱਸੇ ਹਰ ਸਮੇਂ ਵਿਖਾਈ ਦੇਣ। ਜੇਕਰ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ਬੰਦ ਕਰੋ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਲਈ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"ਕਰਪਟਿਡ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ਗ਼ਲਤ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ਅਸਮਰਥਿਤ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ਇਹ ਡੀਵਾਈਸ ਇਸ <xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ। ਕਿਸੇ ਸਮਰਥਿਤ ਫੌਰਮੈਟ ਵਿੱਚ ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਅਚਨਚੇਤ ਹਟਾਇਆ ਗਿਆ"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ਡੇਟਾ ਦੇ ਨੁਕਸਾਨ ਤੋਂ ਬੱਚਣ ਲਈ ਹਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ <xliff:g id="NAME">%s</xliff:g> ਅਨਮਾਊਂਟ ਕਰੋ"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"ਹਟਾਇਆ <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ਬੇਨਤੀ USSD ਬੇਨਤੀ ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ਬੇਨਤੀ ਨਵੀਂ SS ਵਿੱਚ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀ ਗਈ ਹੈ।"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"ਕੰਮ ਪ੍ਰੋਫਾਈਲ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"ਵਿਸਤਾਰ ਬਟਨ"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ਵਿਸਤਾਰ ਕਰੋ"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ਸੁੰਗੇੜੋ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ਟੌਗਲ ਵਿਸਤਾਰ"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ਪੈਰੀਫੈਰਲ ਪੋਰਟ"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index f59c8c4..bcd15f7 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Treści ukryte"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Treść ukryta z powodu zasad"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Klawiatura wirtualna"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Klawiatura fizyczna"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Bezpieczeństwo"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Tryb samochodowy"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Stan konta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Komunikaty dla programistów"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Aktualizacje"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Stan sieci"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alerty dotyczące sieci"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stan sieci VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administracja urządzeniem"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerty"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Tryb demo dla sklepów"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Połączenie USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string>
<string name="android_system_label" msgid="6577375335728551336">"System Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Włącz profil osobisty"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Pozwala aplikacji usuwać skróty z ekranu głównego bez interwencji użytkownika."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"przekierowywanie połączeń wychodzących"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Pozwala aplikacji na sprawdzenie numeru wybieranego w trakcie połączenia wychodzącego, a także umożliwia przerwanie połączenia lub przekierowanie go pod inny numer."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odbieranie połączeń telefonicznych"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Pozwala aplikacji na odbieranie przychodzących połączeń telefonicznych."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"odbieranie wiadomości tekstowych (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Pozwala aplikacji na odbieranie i przetwarzanie SMS-ów. To oznacza, że aplikacja będzie mogła bez Twojej wiedzy monitorować i usuwać wiadomości wysyłane do Twojego urządzenia."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"odbieranie wiadomości tekstowych (MMS)"</string>
@@ -1040,8 +1026,8 @@
<string name="no" msgid="5141531044935541497">"Anuluj"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Uwaga"</string>
<string name="loading" msgid="7933681260296021180">"Wczytuję…"</string>
- <string name="capital_on" msgid="1544682755514494298">"Wł"</string>
- <string name="capital_off" msgid="6815870386972805832">"Wył"</string>
+ <string name="capital_on" msgid="1544682755514494298">"Wł."</string>
+ <string name="capital_off" msgid="6815870386972805832">"Wył."</string>
<string name="whichApplication" msgid="4533185947064773386">"Wykonaj czynność przez..."</string>
<string name="whichApplicationNamed" msgid="8260158865936942783">"Wykonaj czynność w aplikacji %1$s"</string>
<string name="whichApplicationLabel" msgid="7425855495383818784">"Wykonaj działanie"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Kliknij, by wybrać język i układ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacja <xliff:g id="NAME">%s</xliff:g> wyświetla się nad innymi"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Fragmenty tej aplikacji mogą być widoczne przez cały czas. Jeśli ta funkcja nie działa prawidłowo, wyłącz ją."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"WYŁĄCZ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Przygotowuję: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sprawdzanie w poszukiwaniu błędów"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Do przenoszenia zdjęć i multimediów"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Nośnik <xliff:g id="NAME">%s</xliff:g> uszkodzony"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: uszkodzenie. Kliknij, by naprawić."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nośnik <xliff:g id="NAME">%s</xliff:g> nieobsługiwany"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"To urządzenie nie obsługuje <xliff:g id="NAME">%s</xliff:g>. Kliknij, by użyć obsługiwanego formatu."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: nieoczekiwane wyjęcie"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Odłącz nośnik <xliff:g id="NAME">%s</xliff:g> przed jego wyjęciem, by uniknąć utraty danych"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Wyjęto: <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Żądanie SS zostało zmienione na żądanie USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Żądanie SS zostało zmienione na nowe żądanie SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil do pracy"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Przycisk rozwijania"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozwiń"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Zwiń"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"przełącz rozwijanie"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port peryferyjny USB na urządzeniu z Androidem"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index f05bab0..2d9ea4b 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Conteúdo ocultado pela política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Segurança"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo carro"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status da conta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensagens do desenvolvedor"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Atualizações"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status de rede"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de rede"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status de VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administração do dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração na loja"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Conexão USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Alternar para \"Pessoal\""</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que o app remova atalhos da tela inicial sem a intervenção do usuário."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirecionar as chamadas efetuadas"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que o app veja o número discado ao realizar uma chamada, com a opção de redirecionar a chamada para outro número ou abortá-la."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"atender chamadas telefônicas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que o app atenda uma chamada recebida."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receber mensagens de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que o app receba e processe mensagens SMS. Isso significa que o app pode monitorar ou excluir mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receber mensagens de texto (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobreposição do <xliff:g id="NAME">%s</xliff:g> a outros apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> exibido na parte superior da tela."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desse app podem ficar sempre visíveis. Se esse recurso não estiver funcionando corretamente, desative-o."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e mídia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> corrompido"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para corrigir."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não compatível"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com esse <xliff:g id="NAME">%s</xliff:g>. Toque para configurar em um formato compatível."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecte <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mídia <xliff:g id="NAME">%s</xliff:g> removida."</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botão \"Expandir\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"alternar expansão"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta USB periférica Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1737b15..f9e0653 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Conteúdo ocultado pela política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Segurança"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo automóvel"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Estado da conta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensagens do programador"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Atualizações"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Estado da rede"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas da rede"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estado da VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administração do dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração para retalho"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Ligação USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Mudar para pessoal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que a aplicação remova atalhos do Ecrã principal sem a intervenção do utilizador."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirecionar as chamadas efetuadas"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que a aplicação veja o número que é marcado durante uma chamada efetuada, com a opção de redirecionar a chamada para um número diferente ou terminar a chamada."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"atender chamadas telefónicas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que a aplicação atenda chamadas recebidas."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receber mensagens de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que a aplicação receba e processe mensagens SMS. Isto significa que a aplicação poderá monitorizar ou eliminar mensagens enviadas para o seu dispositivo sem as apresentar."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receber mensagens de texto (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o esquema"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobrepor a aplicação <xliff:g id="NAME">%s</xliff:g> a outras aplicações"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplic. <xliff:g id="NAME">%s</xliff:g> apresentada por cima."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"É possível que partes desta aplicação permaneçam sempre visíveis. Se esta funcionalidade não estiver a funcionar corretamente, desative-a."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"A preparar o <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"A verificar a presença de erros"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Transf. fotos, conteúdos multimédia."</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> danificado"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"O <xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para o corrigir."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não suportado"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com este <xliff:g id="NAME">%s</xliff:g>. Toque para o configurar num formato compatível."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desmontar o <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"O pedido SS foi modificado para um pedido USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"O pedido SS foi modificado para um novo pedido SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botão Expandir"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Reduzir"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ativar/desativar expansão"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta periférica USB para Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f05bab0..2d9ea4b 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Conteúdo ocultado pela política"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Teclado físico"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Segurança"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modo carro"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status da conta"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mensagens do desenvolvedor"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Atualizações"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status de rede"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de rede"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status de VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administração do dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstração na loja"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Conexão USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Alternar para \"Pessoal\""</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que o app remova atalhos da tela inicial sem a intervenção do usuário."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirecionar as chamadas efetuadas"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que o app veja o número discado ao realizar uma chamada, com a opção de redirecionar a chamada para outro número ou abortá-la."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"atender chamadas telefônicas"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite que o app atenda uma chamada recebida."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receber mensagens de texto (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que o app receba e processe mensagens SMS. Isso significa que o app pode monitorar ou excluir mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receber mensagens de texto (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Sobreposição do <xliff:g id="NAME">%s</xliff:g> a outros apps"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> exibido na parte superior da tela."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Partes desse app podem ficar sempre visíveis. Se esse recurso não estiver funcionando corretamente, desative-o."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos e mídia"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> corrompido"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> está corrompido. Toque para corrigir."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> não compatível"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Este dispositivo não é compatível com esse <xliff:g id="NAME">%s</xliff:g>. Toque para configurar em um formato compatível."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Desconecte <xliff:g id="NAME">%s</xliff:g> antes da remoção para evitar a perda de dados"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Mídia <xliff:g id="NAME">%s</xliff:g> removida."</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"A solicitação SS foi modificada para a solicitação USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"A solicitação SS foi modificada para a nova solicitação SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Perfil de trabalho"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Botão \"Expandir\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Expandir"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Recolher"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"alternar expansão"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta USB periférica Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 11ca5fc..042062b 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conținutul este ascuns"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Conținutul este ascuns conform politicii"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastatură virtuală"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Tastatură fizică"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Securitate"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Mod Mașină"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Starea contului"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mesaje pentru dezvoltatori"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Actualizări"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Starea rețelei"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alerte privind rețeaua"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stare VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administrarea dispozitivului"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alerte"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrație comercială"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Conexiune USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mod sigur"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistemul Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Comutați la Personal"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite aplicației să elimine comenzi rapide de pe ecranul de pornire, fără intervenția utilizatorului."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirecționează apelurile efectuate"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite aplicației să vadă numărul format în timpul unui apel de ieșire, cu opțiunea de a redirecționa apelul către un alt număr sau de a întrerupe apelul."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"să răspundă la apeluri telefonice"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Permite aplicației să răspundă la un apel telefonic."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"primește mesaje text (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite aplicației să primească și să proceseze mesaje SMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"primește mesaje text (MMS)"</string>
@@ -1217,9 +1203,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Atingeți pentru a selecta limba și aspectul"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> afișează deasupra altor aplicații"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> se afișează deasupra."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Este posibil ca unele părți ale acestei aplicații să rămână vizibile permanent. Dacă această caracteristică nu funcționează corect, dezactivați-o."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEZACTIVAȚI"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Se pregătește <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Se verifică dacă există erori"</string>
@@ -1227,8 +1216,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pentru a transfera fotografii și fișiere media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> este deteriorat"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> este deteriorat. Atingeți pentru a remedia."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> necompatibil"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Atingeți pentru configurare într-un format compatibil."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> scos pe neașteptate"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Demontați <xliff:g id="NAME">%s</xliff:g> înainte de a-l scoate pentru a nu pierde datele"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> scos"</string>
@@ -1698,7 +1691,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Solicitarea SS este modificată într-o solicitare USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Solicitarea SS este modificată într-o nouă solicitare SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil de serviciu"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Butonul de extindere"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Extindeți"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Restrângeți"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"extindeți/restrângeți"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB Android periferic"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index a2e3795..cf03b5a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Содержимое скрыто"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Содержимое скрыто в соответствии с заданными правилами"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуальная клавиатура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Физическая клавиатура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Безопасность"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Режим \"В авто\""</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Статус аккаунта"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Сообщения от разработчиков"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Обновления"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Статус сети"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Оповещения сети"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Статус VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Управление устройством"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Уведомления"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Деморежим для магазина"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-подключение"</string>
<string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Перейти в личный профиль"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Приложение сможет удалять ярлыки с главного экрана без вмешательства пользователя."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"Перенаправление исходящих вызовов"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Приложение сможет видеть набранный номер во время исходящего вызова и при необходимости перенаправлять вызов или завершать его."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"Ответ на входящие вызовы"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Приложению разрешено отвечать на входящие вызовы."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"Прием SMS-сообщений"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Приложение сможет получать и обрабатывать SMS. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"Прием MMS-сообщений"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Нажмите, чтобы выбрать язык и раскладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Интерфейс этих приложений показывается поверх других окон: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>: показ поверх других окон"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Некоторые элементы интерфейса этого приложения могут всегда находиться поверх других окон. Если функция работает некорректно, отключите ее."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ОТКЛЮЧИТЬ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Подготовка карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Поиск ошибок"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для переноса фотографий и других файлов"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> не работает"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: носитель поврежден. Нажмите, чтобы устранить неполадки."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не поддерживается"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Устройство не поддерживает этот носитель (<xliff:g id="NAME">%s</xliff:g>). Нажмите, чтобы настроить."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена неправильно"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перед тем как извлечь карту \"<xliff:g id="NAME">%s</xliff:g>\", отключите ее, чтобы избежать потери данных."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Карта \"<xliff:g id="NAME">%s</xliff:g>\" извлечена"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-запрос преобразован в USSD-запрос."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-запрос преобразован в новый SS-запрос."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Рабочий профиль"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Кнопка \"Развернуть\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Развернуть"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Скрыть"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Свернуть или развернуть"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Внешний USB-порт Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 40fbd2b..8c2185b 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"සැඟවුණු සම්බන්ධතා"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"ප්රතිපත්තිය විසින් අන්තර්ගතය සඟවන ලදී"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"අතථ්ය යතුරු පුවරුව"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"භෞතික යතුරු පුවරුව"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ආරක්ෂාව"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"මෝටර් රථ ආකාරය"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ගිණුම් තත්ත්වය"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"සංවර්ධක පණිවුඩ"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"යාවත්කාලීන කිරීම්"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"ජාල තත්ත්වය"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"ජාල ඇඟවීම්"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN තත්ත්වය"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"උපාංග පරිපාලනය"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ඇඟවීම්"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"සිල්ලර ආදර්ශනය"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB සම්බන්ධතාවය"</string>
<string name="safeMode" msgid="2788228061547930246">"ආරක්ෂිත ආකාරය"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android පද්ධතිය"</string>
<string name="user_owner_label" msgid="1119010402169916617">"පුද්ගලික වෙත මාරු වන්න"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"පරිශීලක මැදිහත්වීමෙන් තොරව මුල්තිර කෙටිමං එක් කිරීමට යෙදුමකට අවසර දෙයි."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"පිටවන ඇමතුම් වල මග වෙනස් කිරීම"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ඇමතුම වෙනත් අංකයකට හරවා යැවීම හෝ ඇමතුම මුළුමනින්ම නැවත්වීම වැනි විකල්ප සමඟ පිටතට යන ඇමතුමකදී අංකනය කළ අංකය බැලීමට යෙදුමට ඉඩ දෙයි."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"දුරකථන ඇමතුම් පිළිතුරු දීම"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"එන ඇමතුමකට පිළිතුරු දීමට අවසර ලබා දේ"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"කෙටි පණිවිඩ ලබාගැනීම (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS පණිවිඩ ලැබීමට සහ ක්රියාත්මක කිරීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබගේ උපාංගයට ලැබෙන පණිවිඩ අධීක්ෂණය කිරීමට හැකිවීම වන අතර, ඒවා ඔබට නොපෙන්වා මකා දැමීමටද හැකි වීමයි."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"පෙළ පණිවුඩ ලබාගන්න (MMS)"</string>
@@ -1199,9 +1185,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"භාෂාව හා පිරිසැලසුම තේරීමට තට්ටු කරන්න"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> අදින්න"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> යෙදුම ඉහළින්ම සංදර්ශනය වේ."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"මෙම යෙදුමෙහි කොටස් සැම විටම දෘශ්යමානව පවතිනු ඇත. මෙම විශේෂාංගය නිවැරදිව ක්රියා නොකරන්නේ නම්, එය ක්රියාවිරහිත කරන්න."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ක්රියා විරහිත කරන්න"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> සූදානම් කරමින්"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"වැරදි සඳහා පරීක්ෂා කරමින්"</string>
@@ -1209,8 +1198,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ඡායාරූප සහ මාධ්ය හුවමාරු කිරීම සඳහා"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"දූෂිත <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> දූෂිතය. විසඳීමට තට්ටු කරන්න."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"සහාය නොදක්වන <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"මෙම උපාංගය මෙම <xliff:g id="NAME">%s</xliff:g> සඳහා සහාය නොදක්වයි. සහාය දක්වන ආකෘතියකින් පිහිටුවීමට තට්ටු කරන්න."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> අනපේක්ෂිතව ඉවත් කරන ලදි"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"දත්ත නැතිවීම වැළක්වීමට <xliff:g id="NAME">%s</xliff:g> ආචයනය ඉවත්කිරීමට පෙර ගලවන්න."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන ලදි"</string>
@@ -1670,7 +1663,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS ඉල්ලීම USSD ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS ඉල්ලීම නව DIAL ඉල්ලීම වෙත විකරණය කරන ලදී."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"කාර්යාල පැතිකඩ"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"දිගහැරීමේ බොත්තම"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"දිග හරින්න"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"හකුළන්න"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"පුළුල් කිරීම ටොගල කරන්න"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB පර්යන්ත තොට"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 6c84da1..002f19c 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Skrytý obsah"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Obsah je na základe pravidiel skrytý"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuálna klávesnica"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fyzická klávesnica"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Zabezpečenie"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Režim v aute"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Stav účtu"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Správy pre vývojárov"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Aktualizácie"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Stav siete"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Upozornenia týkajúce sa siete"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stav pripojenia VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Správa zariadenia"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornenia"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Predajná ukážka"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Pripojenie USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Prepnúť na osobný"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Povoľuje aplikácii odstrániť odkazy na ploche bez zásahu používateľa."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"presmerovať odchádzajúce hovory"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Umožňuje aplikácii počas odchádzajúceho hovoru rozpoznať vytáčané číslo a poskytuje možnosť presmerovať daný hovor na odlišné číslo alebo ho úplne zrušiť."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"odpovedanie na telefonické hovory"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Umožňuje aplikácii odpovedať na prichádzajúce telefonáty."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"prijímať textové správy (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Umožňuje aplikácii prijímať a spracovávať správy SMS. Znamená to, že aplikácia môže sledovať správy odoslané na vaše zariadenie alebo ich odstrániť bez toho, aby sa vám zobrazili."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"prijímať textové správy (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozloženie"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikácia <xliff:g id="NAME">%s</xliff:g> sa vykreslí nad ostatnými aplikáciami"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> sa zobrazuje navrchu."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Časti tejto aplikácie môžu zostať neustále viditeľné. Ak táto funkcia nepracuje správne, vypnite ju."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNÚŤ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravuje sa úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Prebieha kontrola chýb"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Na prenos fotiek a médií"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Poškodené úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Úložisko <xliff:g id="NAME">%s</xliff:g> je poškodené. Opravte ho klepnutím."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodporované úložisko <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Toto zariadenie nepodporuje úložisko <xliff:g id="NAME">%s</xliff:g>. Klepnutím ho nastavíte v podporovanom formáte."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Úl. <xliff:g id="NAME">%s</xliff:g> bolo neočakávane odobraté"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ak chcete zabrániť strate údajov, úložisko <xliff:g id="NAME">%s</xliff:g> pred odobratím odpojte"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Úložisko <xliff:g id="NAME">%s</xliff:g> bolo odobraté"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Žiadosť SS bola upravená na žiadosť USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Žiadosť SS bola upravená na novú žiadosť SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Pracovný profil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Tlačidlo rozbalenia"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozbaliť"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Zbaliť"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"prepnúť rozbalenie"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB pre periférne zariadenia s Androidom"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 97911f0..3cc8662 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Vsebina je skrita"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Pravilnik je skril vsebino"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Navidezna tipkovnica"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fizična tipkovnica"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Varnost"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Način za avtomobil"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Stanje računa"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Sporočila razvijalcev"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Posodobitve"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Stanje omrežja"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Opozorila omrežja"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Stanje omrežja VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Skrbništvo naprave"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Opozorila"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Predstavitev za maloprodajo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Povezava USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Varni način"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Preklop na osebni profil"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Aplikaciji omogoča odstranjevanje bližnjic z začetnega zaslona brez posredovanja uporabnika."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"preusmeritev odhodnih klicev"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Aplikaciji dovoli ogled klicane številke pri odhodnem klicu in ji omogoča preusmeritev klica na drugo številko ali prekinitev klica."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"javljanje na telefonske klice"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Aplikaciji dovoljuje, da se javi na dohodni telefonski klic."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"prejemanje sporočil (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Aplikaciji omogoča prejemanje in obdelavo SMS-ov. S tem lahko aplikacija nadzoruje ali izbriše sporočila, poslana v napravo, ne da bi vam jih pokazala."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"prejemanje sporočil (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dotaknite se, če želite izbrati jezik in postavitev."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Aplikacija <xliff:g id="NAME">%s</xliff:g> riše čez druge aplikacije"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Apl. <xliff:g id="NAME">%s</xliff:g> se prikazuje čez druge."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Deli te aplikacije lahko ostanejo vseskozi vidni. Če ta funkcija ne deluje pravilno, jo izklopite."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZKLOP"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravljanje shrambe <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Iskanje napak"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Za prenos fotografij in predstavnosti"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Naprava za sh. <xliff:g id="NAME">%s</xliff:g> je poškodovana"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Nosilec <xliff:g id="NAME">%s</xliff:g> je poškodovan. Dotaknite se, če želite odpraviti napako."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nepodprta naprava za shran. <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ta naprava ne podpira tega nosilca <xliff:g id="NAME">%s</xliff:g>. Dotaknite se, če želite nastaviti v podprti obliki."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Shramba <xliff:g id="NAME">%s</xliff:g> nepričak. odstranjena"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Izpnite shrambo <xliff:g id="NAME">%s</xliff:g>, preden jo odstranite, da se izognete izgubi podatkov."</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Shramba <xliff:g id="NAME">%s</xliff:g> je bila odstranjena"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Zahteva SS je spremenjena v zahtevo USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Zahteva SS je spremenjena v novo zahtevo SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Delovni profil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Gumb za razširitev"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Razširi"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Strni"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"preklop razširitve"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Vrata USB za dodatno opremo za Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index bdea7bf..39cf12d 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Përmbajtjet janë të fshehura"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Përmbajtja është e fshehur për shkak të politikës"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Tastiera fizike"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Siguria"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Modaliteti \"në makinë\""</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Statusi i llogarisë"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mesazhet e zhvilluesit"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Përditësimet"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Statusi i rrjetit"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Sinjalizimet e rrjetit"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Statusi i VPN-së"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administrimi i pajisjes"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Sinjalizimet"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demonstrimi i shitjes me pakicë"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Lidhja USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Modaliteti i sigurisë"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistemi \"android\""</string>
<string name="user_owner_label" msgid="1119010402169916617">"Ndryshoje te \"Personale\""</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Lejon aplikacionin të heqë shkurtore në ekranin bazë, pa ndërhyrjen e përdoruesit."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ridrejto telefonatat dalëse"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Lejon aplikacionin të shohë numrin që telefonohet gjatë një telefonate dalëse me opsionin për ta ri-orientuar telefonatën drejt një numri tjetër ose për ta ndërprerë plotësisht telefonatën."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"përgjigjju telefonatave"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Lejon që aplikacioni t\'i përgjigjet një telefonate hyrëse."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"merr mesazhe me tekst (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Lejon aplikacionin të marrë dhe përpunojë mesazhe SMS. Kjo do të thotë se aplikacioni mund të monitorojë ose fshijë mesazhe të dërguara në pajisjen tënde, pa t\'i treguar ato."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"prano mesazhe në tekst (MMS)"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trokit për të zgjedhur gjuhën dhe strukturën"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> mbivendoset mbi aplikacionet e tjera"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Aplikacioni <xliff:g id="NAME">%s</xliff:g> shfaqet në krye."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Disa pjesë të këtij aplikacioni mund të mbeten të dukshme gjatë të gjithë kohës. Nëse ky funksion nuk po funksionon si duhet, çaktivizoje atë."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ÇAKTIVIZO"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Po përgatit <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Po kontrollon për gabime"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Për transferimin e fotografive dhe skedarëve të tjerë"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> e dëmtuar"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> është dëmtuar. Trokit për ta rregulluar."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nuk mbështetet"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Kjo pajisje nuk e mbështet këtë <xliff:g id="NAME">%s</xliff:g>. Trokit për ta konfiguruar në një format të mbështetur."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> u hoq papritur"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Shkëput <xliff:g id="NAME">%s</xliff:g> para se ta heqësh për të shmangur humbjen e të dhënave"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Është hequr <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Kërkesa SS është modifikuar në kërkesën USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Kërkesa SS është e modifikuar në kërkesën e re SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profili i punës"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Butoni i zgjerimit"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Zgjero"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Palos"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"aktivizo zgjerimin"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Porta periferike USB e Androidit"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 4623b48..b14be2c 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -247,32 +247,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Садржај је сакривен"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Садржај је сакривен смерницама"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Физичка тастатура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Безбедност"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Режим рада у аутомобилу"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Статус налога"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Поруке за програмере"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Ажурирања"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Статус мреже"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Обавештења у вези са мрежом"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Статус VPN-а"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Администрирање уређаја"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Обавештења"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Режим демонстрације за малопродајне објекте"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB веза"</string>
<string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android систем"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Пређи на Лични профил"</string>
@@ -321,10 +309,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Омогућава апликацији да уклања пречице са почетног екрана без интервенције корисника."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"преусмеравање одлазних позива"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Дозвољава апликацији да види који број се бира при одлазном позиву уз опцију да преусмери позив на други број или га потпуно прекине."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"одговарај на телефонске позиве"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Дозвољава апликацији да одговори на долазни телефонски позив."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"пријем текстуалних порука (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Дозвољава апликацији да прима и обрађује SMS поруке. То значи да апликација може да надгледа или брише поруке које се шаљу уређају, а да вам их не прикаже."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"пријем текстуалних порука (MMS)"</string>
@@ -1217,9 +1203,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Додирните да бисте изабрали језик и распоред"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Делови ове апликације могу да остану видљиви у сваком тренутку. Ако ова функција не ради исправно, искључите је."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЉУЧИ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> се припрема"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверава се да ли постоје грешке"</string>
@@ -1227,8 +1216,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"За пренос слика и медија"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Уређај <xliff:g id="NAME">%s</xliff:g> је оштећен. Додирните да бисте га поправили."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Уређај <xliff:g id="NAME">%s</xliff:g> није подржан"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Овај уређај не подржава овај уређај <xliff:g id="NAME">%s</xliff:g>. Додирните да бисте подесили подржани формат."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Уређај <xliff:g id="NAME">%s</xliff:g> је неочекивано уклоњен"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Искључите уређај <xliff:g id="NAME">%s</xliff:g> пре уклањања да не бисте изгубили податке"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен"</string>
@@ -1698,7 +1691,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS захтев је промењен у USSD захтев."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS захтев је промењен у нови SS захтев."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Профил за Work"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Дугме Прошири"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Прошири"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Скупи"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"укључите/искључите проширење"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB порт за периферијске уређаје"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index fa381fd..325f762 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innehåll har dolts"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Innehåll har dolts p.g.a. en policy"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuellt tangentbord"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fysiskt tangentbord"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Säkerhet"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Billäge"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Kontostatus"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Meddelanden till utvecklare"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Uppdateringar"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Nätverksstatus"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Nätverksvarningar"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhetsadministration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varningar"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo för återförsäljare"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB-anslutning"</string>
<string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Byt till din personliga profil"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Tillåter att appen tar bort genvägar på startskärmen utan åtgärd från användaren."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"omdirigera utgående samtal"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Tillåter att appen ser numret du slår under ett utgående samtal och har möjlighet att koppla samtalet till ett annat nummer eller avbryta samtalet helt."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"svara på telefonsamtal"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ger tillåtelse att svara på inkommande telefonsamtal via appen."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ta emot textmeddelanden (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Tillåter att appen tar emot och hanterar SMS. Detta innebär att appen kan övervaka eller ta bort meddelanden som skickats till enheten utan att visa dem för dig."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"ta emot textmeddelanden (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> gör överlagringar på andra appar"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Appen <xliff:g id="NAME">%s</xliff:g> visas ovanpå."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Delar av den här appen kanske alltid är synliga. Inaktivera funktionen om den inte fungerar som den ska."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"INAKTIVERA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Förbereder ditt <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Söker efter fel"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"För överföring av foton och media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> har skadats"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> har skadats. Åtgärda genom att trycka."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> stöds inte"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Enheten har inte stöd för <xliff:g id="NAME">%s</xliff:g>. Tryck här om du vill konfigurera i ett format som stöds."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> togs bort oväntat"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Montera bort <xliff:g id="NAME">%s</xliff:g> före borttagningen för att undvika dataförlust"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ditt <xliff:g id="NAME">%s</xliff:g> har tagits bort"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS-begäran har ändrats till en USSD-begäran."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS-begäran har ändrats till en ny SS-begäran."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Jobbprofil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Knappen Utöka"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Utöka"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Komprimera"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"Utöka/komprimera"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"USB-port för Android-kringutrustning"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 0e44f01..6d42d5f 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -242,32 +242,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Maudhui yamefichwa"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Maudhui yamefichwa kulingana na sera"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Kibodi pepe"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Kibodi halisi"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Usalama"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Hali ya gari"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Hali ya akaunti"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Ujumbe wa wasanidi programu"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Taarifa"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Hali ya mtandao"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Arifa za mtandao"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Hali ya VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Udhibiti wa kifaa"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Arifa"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Onyesho la duka la rejareja"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Muunganisho wa USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string>
<string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Badili uweke wasifu wa Binafsi"</string>
@@ -316,10 +304,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Huruhusu programu kuondoa njia za mkato za Skrini ya kwanza bila mtumiaji kuingilia."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"panga upya simu zinazotoka"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Huruhusu programu kuona nambari inayopigwa wakati simu inapigwa ikiwa na chaguo la kuelekeza simu kwenye nambari tofauti au kukata simu kabisa."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"kujibu simu"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Inaruhusu programu kujibu simu inayopigwa."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"pokea ujumbe wa maandishi wa SMS"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Inaruhusu programu kupokea na kuchakata ujumbe wa SMS. Hii inamaanisha programu hii inaweza kuchunguza na kufuta ujumbe uliotumwa katika kifaa chako bila ya kukuonyesha."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"pokea ujumbe wa maandishi wa MMS"</string>
@@ -1195,9 +1181,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> huchomoza kwenye programu zingine"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Programu ya <xliff:g id="NAME">%s</xliff:g> inaonekana juu ya zingine."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Huenda sehemu za programu hii zikaendelea kuonekana kila wakati. Zima kipengele hiki kama hakifanyi kazi vizuri."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ZIMA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inaandaa <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Inakagua hitilafu"</string>
@@ -1205,8 +1194,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kwa ajili ya kuhamisha picha na maudhui"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> iliyoharibika"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> ina hitilafu. Gonga ili uirekebishe."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> isiyotumika"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Kifaa hiki hakitumii <xliff:g id="NAME">%s</xliff:g>. Gonga ili uweke mipangilio ya muundo unaoweza kutumika."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> imeondolewa bila kutarajiwa"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ondoa <xliff:g id="NAME">%s</xliff:g> kabla ya kuchomoa ili kuepuka kupoteza data"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> imeondolewa"</string>
@@ -1666,7 +1659,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ombi la SS limerekebishwa na kuwa ombi la USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ombi la SS limerekebishwa na kuwa ombi jipya la SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Wasifu wa kazini"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Kitufe cha kupanua"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Panua"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Kunja"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"geuza upanuzi"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Mlango wa USB wa Pembeni wa Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml
index 7f57ded..6edb88e 100644
--- a/core/res/res/values-sw600dp/config.xml
+++ b/core/res/res/values-sw600dp/config.xml
@@ -28,7 +28,7 @@
<!-- see comment in values/config.xml -->
<dimen name="config_prefDialogWidth">580dp</dimen>
-
+
<!-- If true, the screen can be rotated via the accelerometer in all 4
rotations as the default behavior. -->
<bool name="config_allowAllRotations">true</bool>
@@ -41,5 +41,15 @@
<dimen name="config_minScalingSpan">32mm</dimen>
<integer name="config_dockedStackDividerSnapMode">1</integer>
+
+ <!-- The snap mode to use for picture-in-picture. These values correspond to constants defined
+ in PipSnapAlgorithm and should not be changed independently.
+ 0 - Snap to the four corners
+ 1 - Snap to the four corners and the mid-points on the long edge in each orientation
+ 2 - Snap anywhere along the edge of the screen
+ 3 - Snap anywhere along the edge of the screen and magnet to corners
+ 4 - Snap to the long edges in each orientation and magnet to corners
+ -->
+ <integer name="config_pictureInPictureSnapMode">3</integer>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 96eea4a..186d49f 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"மறைந்துள்ள உள்ளடக்கம்"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"கொள்கையின்படி உள்ளடக்கம் மறைக்கப்பட்டது"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"விர்ச்சுவல் விசைப்பலகை"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"கைமுறை விசைப்பலகை"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"பாதுகாப்பு"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"கார் பயன்முறை"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"கணக்கின் நிலை"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"டெவெலப்பர் செய்திகள்"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"புதுப்பிப்புகள்"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"நெட்வொர்க்கின் நிலை"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"நெட்வொர்க் விழிப்பூட்டல்கள்"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN நிலை"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"சாதன நிர்வாகம்"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"விழிப்பூட்டல்கள்"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"விற்பனையாளர் டெமோ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB இணைப்பு"</string>
<string name="safeMode" msgid="2788228061547930246">"பாதுகாப்பு பயன்முறை"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android அமைப்பு"</string>
<string name="user_owner_label" msgid="1119010402169916617">"தனிப்பட்ட சுயவிவரத்திற்கு மாறு"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"பயனரின் அனுமதி இல்லாமல் முகப்புத்திரையின் குறுக்குவழிகளை அகற்ற பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"வெளிச்செல்லும் அழைப்புகளுக்கு மீண்டும் வழிகாட்டுதல்"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"மற்றொரு எண்ணிற்கு அழைப்பைத் திருப்பிவிடு அல்லது அழைப்பை முழுமையாக ரத்துசெய் என்னும் விருப்பத்துடன், வெளிச்செல்லும் அழைப்பை மேற்கொள்ளும்போது டயல் செய்யப்படுகின்ற எண்ணைப் பார்க்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ஃபோன் அழைப்புகளுக்குப் பதிலளி"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"உள்வரும் ஃபோன் அழைப்பிற்குப் பதிலளிக்க, பயன்பாட்டை அனுமதிக்கும்."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"உரைச் செய்திகளை (SMS) பெறுதல்"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிப்பதற்கு அல்லது நீக்குவதற்குப் பயன்பாட்டால் முடியும் என்பதாகும்."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"உரைச் செய்திகளை (MMS) பெறுதல்"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"பிற பயன்பாடுகளின் மேல் <xliff:g id="NAME">%s</xliff:g> செயல்படும்"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"பிற பயன்பாடுகளின் மேலே <xliff:g id="NAME">%s</xliff:g> பயன்பாடு காட்டப்படுகிறது."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"இந்தப் பயன்பாட்டின் பகுதிகள், எல்லா நேரமும் காட்டப்படக்கூடும். இந்த அம்சம் சரியாகச் செயல்படவில்லை எனில், அதை முடக்கவும்."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"முடக்கு"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> தயாராகிறது"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"பிழைகள் உள்ளதா எனப் பார்க்கிறது"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"படங்களையும் மீடியாவையும் மாற்றலாம்"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> சிதைந்துள்ளது. சரிசெய்ய, தட்டவும்."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ஆதரிக்கப்படாத <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"சாதனம் இந்த <xliff:g id="NAME">%s</xliff:g>ஐ ஆதரிக்கவில்லை. ஆதரிக்கப்படும் வடிவமைப்பில் அமைக்க, தட்டவும்."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"தரவு இழப்பைத் தவிர்க்க, <xliff:g id="NAME">%s</xliff:g>ஐ அகற்றுவதற்கு முன் இணைப்பு நீக்கவும்"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> அகற்றப்பட்டது"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS கோரிக்கையானது USSD கோரிக்கைக்கு மாற்றப்பட்டது."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS கோரிக்கையானது புதிய SS கோரிக்கைக்கு மாற்றப்பட்டது."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"பணி சுயவிவரம்"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"விரி பொத்தான்"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"விரிவாக்கும்"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"சுருக்கும்"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"விரிவாக்கத்தை நிலைமாற்றும்"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB பெரிபெரல் போர்ட்"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index e3adbc5..67c0a2c 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"కంటెంట్లు దాచబడ్డాయి"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"విధానం ద్వారా కంటెంట్లు దాచబడ్డాయి"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"వర్చువల్ కీబోర్డ్"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"భౌతిక కీబోర్డ్"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"భద్రత"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"కారు మోడ్"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"ఖాతా స్థితి"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"డెవలపర్ సందేశాలు"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"నవీకరణలు"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"నెట్వర్క్ స్థితి"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"నెట్వర్క్ హెచ్చరికలు"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN స్థితి"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"పరికర నిర్వాహణ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"హెచ్చరికలు"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"రిటైల్ డెమో"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB కనెక్షన్"</string>
<string name="safeMode" msgid="2788228061547930246">"సురక్షిత మోడ్"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android సిస్టమ్"</string>
<string name="user_owner_label" msgid="1119010402169916617">"వ్యక్తిగతానికి మార్చు"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"వినియోగదారు ప్రమేయం లేకుండానే హోమ్స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"అవుట్గోయింగ్ కాల్లను దారి మళ్లించడం"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"కాల్ను వేరే నంబర్కు దారి మళ్లించే లేదా మొత్తంగా కాల్ను ఆపివేసే ఎంపిక సహాయంతో అవుట్గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్ను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"ఫోన్ కాల్లకు సమాధానమివ్వు"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"ఇన్కమింగ్ ఫోన్ కాల్లకు సమాధానమివ్వడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"వచన సందేశాలను (SMS) స్వీకరించడం"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. అనువర్తనం మీ పరికరానికి పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"వచన సందేశాలను (MMS) స్వీకరించడం"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"భాష మరియు లేఅవుట్ను ఎంచుకోవడానికి నొక్కండి"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>ని ఇతర అనువర్తనాలపై గీయండి"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"ఎగువన <xliff:g id="NAME">%s</xliff:g> అనువర్తనం కనిపిస్తోంది."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ఈ అనువర్తనంలోని భాగాలు అన్ని సమయాల్లో కనిపిస్తూ ఉండవచ్చు. ఈ లక్షణం సరిగ్గా పని చేయకపోతే, దీన్ని ఆఫ్ చేయండి."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ఆఫ్ చేయి"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ని సిద్ధం చేస్తోంది"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"లోపాల కోసం తనిఖీ చేస్తోంది"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ఫోటోలు మరియు మీడియాను బదిలీ చేయడానికి"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> పాడైంది"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> పాడైంది. సరిచేయడానికి నొక్కండి."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>కి మద్దతు లేదు"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి నొక్కండి."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"డేటా కోల్పోకుండా ఉండటానికి <xliff:g id="NAME">%s</xliff:g>ని తీసివేయడానికి ముందు అన్మౌంట్ చేయండి"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> తీసివేయబడింది"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS అభ్యర్థన USSD అభ్యర్థనగా సవరించబడింది."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS అభ్యర్థన కొత్త SS అభ్యర్థనగా సవరించబడింది."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"కార్యాలయ ప్రొఫైల్"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"విస్తరింపజేయి బటన్"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"విస్తరింపజేయి"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"కుదించు"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"విస్తరణను టోగుల్ చేయండి"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB పెరిఫెరల్ పోర్ట్"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 95b5501..f926412 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"เนื้อหาถูกซ่อนไว้"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"มีการซ่อนเนื้อหาโดยนโยบาย"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"แป้นพิมพ์เสมือน"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"แป้นพิมพ์บนเครื่อง"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"ความปลอดภัย"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"โหมดรถยนต์"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"สถานะบัญชี"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ข้อความสำหรับนักพัฒนาซอฟต์แวร์"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"การอัปเดต"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"สถานะเครือข่าย"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"การแจ้งเตือนเครือข่าย"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"สถานะ VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"การดูแลระบบอุปกรณ์"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"การแจ้งเตือน"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"การสาธิตสำหรับผู้ค้าปลีก"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"การเชื่อมต่อ USB"</string>
<string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string>
<string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"เปลี่ยนไปใช้โปรไฟล์ส่วนตัว"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"อนุญาตให้แอปพลิเคชันลบทางลัดหน้าจอหลักโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"จัดเส้นทางการโทรออกใหม่"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"อนุญาตให้แอปดูหมายเลขที่โทรในระหว่างการโทรออกโดยสามารถเลือกเปลี่ยนเส้นทางการโทรไปยังหมายเลขอื่นหรือยกเลิกการโทรไปเลยได้"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"รับสายโทรศัพท์"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"อนุญาตให้แอปรับสายโทรศัพท์"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"รับข้อความ (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ SMS ซึ่งหมายความว่าแอปพลิเคชันจะสามารถตรวจสอบหรือลบข้อความที่ส่งมายังอุปกรณ์ของคุณได้โดยไม่ต้องแสดงให้คุณเห็น"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"รับข้อความ (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"แตะเพื่อเลือกภาษาและรูปแบบ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่น"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"แอป <xliff:g id="NAME">%s</xliff:g> แสดงอยู่ด้านบนสุด"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ส่วนต่างๆ ของแอปนี้อาจปรากฏอยู่ตลอดเวลา หากคุณลักษณะนี้ไม่ทำงานอย่างถูกต้อง ให้ปิดแอป"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ปิด"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"สำหรับการโอนรูปภาพและสื่อ"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> เสียหาย"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> เสียหาย แตะเพื่อแก้ไข"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"อุปกรณ์นี้ไม่สนับสนุน <xliff:g id="NAME">%s</xliff:g> นี้ แตะเพื่อตั้งค่าในรูปแบบที่สนับสนุน"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ถูกนำออกไปโดยไม่คาดคิด"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ยกเลิกการต่อเชื่อม <xliff:g id="NAME">%s</xliff:g> ก่อนนำออกเพื่อหลีกเลี่ยงข้อมูลสูญหาย"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"นำ <xliff:g id="NAME">%s</xliff:g> ออกแล้ว"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ USSD"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"คำขอ SS ได้รับการแก้ไขให้เป็นคำขอ SS ใหม่"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"โปรไฟล์งาน"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"ปุ่มขยาย"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"ขยาย"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"ยุบ"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"สลับการขยาย"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"อุปกรณ์สำหรับต่อพอร์ต USB ของ Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 2b32267..7030f91 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Nakatago ang mga content"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Itinago ang mga content alinsunod sa patakaran"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual na keyboard"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Pisikal na keyboard"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Seguridad"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Car mode"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Status ng account"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Mga mensahe ng developer"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Mga Update"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Status ng network"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Mga alerto sa network"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Status ng VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Pamamahala ng device"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Mga Alerto"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Retail demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Koneksyon ng USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Lumipat sa Personal"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Pinapayagan ang application na alisin ang mga shortcut ng Homescreen nang walang panghihimasok ng user."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"baguhin ang ruta ng mga papalabas na tawag"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Pinapayagan ang app na makita ang numerong idina-dial sa isang papalabas na tawag na may opsyon na i-redirect ang tawag sa ibang numero o itigil ang tawag nang tuluyan."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"sagutin ang mga tawag sa telepono"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Pinapayagan ang app na sumagot ng papasok na tawag sa telepono."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"tumanggap ng mga text message (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Pinapayagan ang app na tumanggap at magproseso ng mga mensaheng SMS. Nangangahulugan ito na maaaring sumubaybay o magtanggal ang app ng mga mensaheng ipinapadala sa iyong device nang hindi ipinapakita ang mga ito sa iyo."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"tumanggap ng mga text message (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"I-tap upang pumili ng wika at layout"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"I-draw over ang <xliff:g id="NAME">%s</xliff:g> sa iba pang app"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Ipinapakita ang <xliff:g id="NAME">%s</xliff:g> app sa itaas."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Maaaring manatiling nakikita ang mga bahagi ng app na ito sa lahat ng oras. Kung hindi gumagana nang tama ang feature na ito, i-off ito."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"I-OFF"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inihahanda ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sinusuri para sa mga error"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para sa paglilipat ng mga larawan at media"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Sirang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Sira ang <xliff:g id="NAME">%s</xliff:g>. I-tap upang ayusin."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Hindi sinusuportahang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Hindi sinusuportahan ng device na ito ang <xliff:g id="NAME">%s</xliff:g> na ito. I-tap upang i-set up sa isang sinusuportahang format."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Hindi inaasahang naalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"I-unmount ang <xliff:g id="NAME">%s</xliff:g> bago alisin upang maiwasan ang pagkawala ng data"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Inalis ang <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Ginawang USSD request ang SS request."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Ginawang bagong SS request ang SS request."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profile sa trabaho"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Button na Palawakin"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Palawakin"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"I-collapse"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"i-toggle ang pagpapalawak"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Peripheral Port"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 6ca0c3e..49ac493 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"İçerik gizlendi"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"İçerikler politika nedeniyle gizlendi"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sanal klavye"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Fiziksel klavye"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Güvenlik"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Araç modu"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Hesap durumu"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Geliştirici mesajları"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Güncellemeler"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Ağ durumu"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Ağ uyarıları"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN durumu"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Cihaz yönetimi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Uyarılar"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Mağaza demo"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB bağlantısı"</string>
<string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Kişisel Profile Geç"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Uygulamaya, kullanıcının müdahalesi olmadan kısayolları Ana Ekrandan kaldırma izni verir."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"giden çağrıları yeniden yönlendirme"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Uygulamaya, giden bir çağrının numarası çevrilirken çağrıyı farklı bir numaraya yönlendirme ya da tamamen kapatma seçeneğiyle birlikte numarayı görme izni verir."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"telefon çağrılarını yanıtla"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Uygulamanın gelen bir telefon çağrısına yanıt vermesine olanak tanır."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"kısa mesajları al (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Uygulamaya SMS iletilerini alma ve işleme izni verir. Bu izin, uygulamanın cihazınıza gönderilen iletileri takip edip size göstermeden silebileceği anlamına gelir."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"kısa mesajları (MMS) al"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için hafifçe dokunun"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> diğer uygulamaların üzerinde görüntüleniyor"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> üstte gösteriliyor."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu uygulamanın bazı bölümleri her zaman görünür durumda kalabilir. Bu özellik düzgün çalışmıyorsa kapatın."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KAPAT"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanıyor"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hatalar denetleniyor"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotoğraf ve medya aktarmak için"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Bozuk <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> bozuk. Düzeltmek için dokunun."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Desteklenmeyen <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Bu cihaz, bu <xliff:g id="NAME">%s</xliff:g> ortamını desteklemiyor. Desteklenen bir biçimde kurmak için dokunun."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> beklenmedik şekilde çıkarıldı"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Veri kaybı olmaması için <xliff:g id="NAME">%s</xliff:g> birimini çıkarmadan önce bağlantısını kesin"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> çıkarıldı"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS isteği USSD isteği olarak değiştirildi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS isteği yeni SS isteği olarak değiştirildi."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"İş profili"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Genişlet düğmesi"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Genişlet"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Daralt"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"genişletmeyi aç/kapat"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Çevre Birimi Bağlantı Noktası"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 55f93d4..3a4bd51 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -250,32 +250,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Вміст сховано"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Вміст сховано згідно з правилом"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальна клавіатура"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Фізична клавіатура"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Безпека"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Режим автомобіля"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Статус облікового запису"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Повідомлення для розробників"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Оновлення"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Статус мережі"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Сповіщення мережі"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Статус мережі VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Адміністрування пристрою"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сповіщення"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Демо-режим для роздрібної торгівлі"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"З’єднання USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Безп. режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Перейти в особистий профіль"</string>
@@ -324,10 +312,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Дозволяє програмі самостійно вилучати ярлики з головного екрана."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"переадресовувати вихідні виклики"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Дозволяє додатку читати номер вихідного дзвінка, переспрямовувати дзвінок на інший номер або переривати його."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"відповідати на телефонні виклики"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Додаток може відповідати на телефонні виклики."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"отримувати текстові повідомлення (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Дозволяє програмі отримувати й обробляти SMS-повідомлення. Це означає, що програма може відстежувати чи видаляти повідомлення, надіслані на ваш пристрій, навіть не показуючи їх вам."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"отримувати текстові повідомлення (MMS)"</string>
@@ -1237,9 +1223,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Торкніться, щоб вибрати мову та розкладку"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> відображається поверх."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Частина цього додатка може постійно залишатися видимою. Якщо ця функція працює неправильно, вимкніть її."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ВИМКНУТИ"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Підготовка пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Виявлення помилок"</string>
@@ -1247,8 +1236,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Для перенесення фотографій і медіафайлів"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> не підключається"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"Носій (<xliff:g id="NAME">%s</xliff:g>) пошкоджено. Торкніться, щоб виправити."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> не підтримується"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> не підтримується цим пристроєм. Торкніться, щоб налаштувати підтримуваний формат."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> несподівано вийнято"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Перш ніж виймати пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>, відключіть його, щоб не втратити дані"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Ви вийняли пристрій пам’яті <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1728,7 +1721,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Запит SS перетворено на запит USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Запит SS перетворено на новий запит SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Робочий профіль"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Кнопка \"Розгорнути\""</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Розгорнути"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Згорнути"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"розгорнути або згорнути"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Периферійний USB-порт Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 5b9b483..1b06814 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"مواد مخفی ہیں"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"مواد پالیسی کے تحت مخفی ہے"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ورچوئل کی بورڈ"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"فزیکل کی بورڈ"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"سیکیورٹی"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"کار وضع"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"اکاؤنٹ اسٹیٹس"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"ڈیولپر کے پیغامات"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"اپ ڈیٹس"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"نیٹ ورک اسٹیٹس"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"نیٹ ورک الرٹس"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN اسٹیٹس"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"آلہ کا نظم و نسق"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"الرٹس"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"ریٹیل ڈیمو"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB کنکشن"</string>
<string name="safeMode" msgid="2788228061547930246">"حفاظتی وضع"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android سسٹم"</string>
<string name="user_owner_label" msgid="1119010402169916617">"ذاتی پر سوئچ کریں"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ایپلیکیشن کو صارف کی مداخلت کے بغیر ہوم اسکرین شارٹ کٹس ہٹانے کی اجازت دیتا ہے۔"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"باہر جانے والی کالوں کی سمت دوبارہ طے کریں"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ایپ کو ایک مختلف نمبر پر کال ری ڈائریکٹ کرنے یا مکمل طور پر کال ختم کر دینے کیلئے اختیار کے ساتھ ایک آؤٹ گوئنگ کال کے دوران ڈائل کیا جا رہا نمبر دیکھنے کی اجازت دیتا ہے۔"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"فون کالز کا جواب دیں"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"آنے والی فون کال کا جواب دینے کی اپپس کو اجازت دیتی ہے۔"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"متنی پیغامات (SMS) حاصل کریں"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"ایپ کو SMS پیغامات حاصل اور ان پر کارروائی کرنے کی اجازت دیتا ہے۔ اس کا مطلب ہے کہ ایپ آپ کے آلے پر مرسلہ پیغامات آپ کو دکھائے بغیر ان پر نگاہ رکھ یا انہیں حذف کرسکتی ہے۔"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"متنی پیغامات (MMS) حاصل کریں"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"زبان اور لے آؤٹ منتخب کرنے کیلئے تھپتھپائیں"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر ڈرا کریں"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> ایپ اوپر ڈسپلے ہورہی ہے۔"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"ممکن ہے اس ایپ کے حصے ہر وقت مرئی رہیں۔ اگر یہ خصوصیت ٹھیک سے کام نہیں کررہی ہے، تو اسے آف کردیں۔"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"آف کریں"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> تیار کیا جا رہا ہے"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"خرابیوں کیلئے چیک کیا جا رہا ہے"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"تصاویر اور میڈیا منتقل کرنے کیلئے"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"خراب شدہ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> خراب ہے۔ اسے ٹھیک کرنے کیلئے تھپتھپائیں۔"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"غیر تعاون یافتہ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"یہ آلہ <xliff:g id="NAME">%s</xliff:g> کو سپورٹ نہیں کرتا۔ ایک سپورٹ یافتہ فارمیٹ میں سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> غیر متوقع طور پر ہٹا دیا گیا"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"ڈیٹا ضائع ہونے سے بچانے کیلئے ہٹانے سے پہلے <xliff:g id="NAME">%s</xliff:g> کو اَن ماؤنٹ کریں"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"<xliff:g id="NAME">%s</xliff:g> کو ہٹا دیا گیا"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS درخواست میں ترمیم کر کے USSD درخواست بنا دی گئی ہے۔"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS درخواست میں ترمیم کر کے نئی SS درخواست بنا دی گئی ہے۔"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"دفتری پروفائل"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"پھیلائیں بٹن"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"پھیلائیں"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"سکیڑیں"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"پھیلاؤ کو ٹوگل کریں"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB پیرفرل پورٹ"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 796ce73..5078167 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Kontent yashirildi"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Qoidaga muvofiq kontent yashirilgan"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Tashqi klaviatura"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Xavfsizlik"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Avtomobil rejimi"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Hisob holati"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Dasturchi xabarlari"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Yangilanishlar"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Tarmoq holati"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Tarmoqqa oid bildirgilar"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN holati"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Qurilma boshqaruvi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ogohlantirishlar"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo rejim"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB orqali ulanish"</string>
<string name="safeMode" msgid="2788228061547930246">"Xavfsiz usul"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android tizimi"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Shaxsiy profilga o‘tish"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Dasturga foydalanuvchini aralashtirmasdan, uy ekranidagi yorliqlarni o‘chirishga ruxsat beradi."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"chiquvchi qo‘ng‘iroqlarni qayta yo‘naltirish"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Ilova chiquvchi qo‘ng‘iroq vaqtida terilgan raqamni ko‘rishi va zaruratga qarab uni qayta yo‘naltirishi yoki tugatishi mumkin."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"telefon chaqiruvlariga javob berish"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ilovaga kiruvchi telefon chaqiruvlariga javob berishiga ruxsat beradi."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"SMS xabarlarni olish"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Ilovaga SMS xabarlarini qabul qilish va va ularni qayta ishlash uchun ruxsat beradi. Bu sizga yuborilgan xabarlarni ilova sizga ko‘rsatmasdan kuzatishi va o‘chirishi mumkinligini bildiradi."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"MMS xabarlarni olish"</string>
@@ -1198,9 +1184,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Til va sxemani belgilash uchun bosing"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochiladi"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g> eng tepada ochilgan."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Bu ilovaning ba’zi qismlari har doim ko‘rinib qolishi mumkin. Agar bu funksiya to‘g‘ri ishlamasa, uni o‘chirib qo‘ying."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"O‘CHIRIB QO‘YISH"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> tayyorlanmoqda"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Xatolar qidirilmoqda"</string>
@@ -1208,8 +1197,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Rasm va boshqa fayllarni o‘tkazish"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"“<xliff:g id="NAME">%s</xliff:g>” buzilgan"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>: buzilgan. Uni tuzatish uchun bosing."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> qo‘llab-quvvatlanmaydi"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Bu xotira qurilmasi (<xliff:g id="NAME">%s</xliff:g>) qo‘llab-quvvatlanmaydi. Uni mos keladigan formatda sozlash uchun bu yerga bosing."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> kutilmaganda chiqarib olindi"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ma’lumotlar yo‘qolishining oldini olish uchun <xliff:g id="NAME">%s</xliff:g> kartasini chiqarishdan oldin u bilan ulanishni uzing"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"“<xliff:g id="NAME">%s</xliff:g>” kartasi chiqarib olingan"</string>
@@ -1669,7 +1662,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS so‘rovi USSD so‘roviga o‘zgartirildi."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS so‘rovi yangi SS so‘roviga o‘zgartirildi."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Ishchi profil"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Yoyish tugmasi"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Yoyish"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Yig‘ish"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"ochish yoki yopish"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android tashqi USB porti"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 33eafb1..0aad9ef 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Nội dung bị ẩn"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Nội dung bị ẩn theo chính sách"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bàn phím ảo"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Bàn phím thực"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Bảo mật"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Chế độ trên ô tô"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Trạng thái tài khoản"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Thông báo liên quan đến nhà phát triển"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Cập nhật"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Trạng thái mạng"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Cảnh báo mạng"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Trạng thái VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Quản lý thiết bị"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Cảnh báo"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Giới thiệu bán lẻ"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Kết nối USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string>
<string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Chuyển sang Cá nhân"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Cho phép ứng dụng xóa lối tắt trên Màn hình chính mà không cần sự can thiệp của người dùng."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"định tuyến lại cuộc gọi đi"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Cho phép ứng dụng xem số được gọi trong một cuộc gọi đi với tùy chọn chuyển hướng cuộc gọi đến một số khác hoặc hủy cuộc gọi đó hoàn toàn."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"trả lời cuộc gọi điện thoại"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Cho phép ứng dụng trả lời cuộc gọi điện thoại đến."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"nhận tin nhắn văn bản (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Cho phép ứng dụng nhận và xử lý tin nhắn SMS. Điều này có nghĩa là ứng dụng có thể theo dõi hoặc xóa tin nhắn được gửi đến thiết bị của bạn mà không hiển thị chúng cho bạn."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"nhận tin nhắn văn bản (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Nhấn để chọn ngôn ngữ và bố cục"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g> vẽ lên các ứng dụng khác"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Ứng dụng <xliff:g id="NAME">%s</xliff:g> hiển thị ở trên cùng."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Các phần của ứng dụng này có thể vẫn hiển thị mọi lúc. Nếu tính năng này không hoạt động bình thường, hãy tắt tính năng này."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TẮT"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Đang chuẩn bị <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Đang kiểm tra lỗi"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Để chuyển ảnh và phương tiện"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> bị lỗi"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> bị lỗi. Nhấn để khắc phục."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> không được hỗ trợ"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Thiết bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Nhấn để thiết lập ở định dạng được hỗ trợ."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Đã tháo đột ngột <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Ngắt kết nối <xliff:g id="NAME">%s</xliff:g> trước khi tháo nhằm tránh mất dữ liệu"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"Đã tháo <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Yêu cầu SS được sửa đổi thành yêu cầu USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Yêu cầu SS được sửa đổi thành yêu cầu SS mới."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Hồ sơ công việc"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Nút mở rộng"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Mở rộng"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Thu gọn"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"chuyển đổi mở rộng"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Cổng ngoại vi USB Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 4ef2af0..d8a4495 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"内容已隐藏"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"内容已隐藏(根据政策规定)"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虚拟键盘"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"实体键盘"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"安全性"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"车载模式"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"帐号状态"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"开发者消息"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"网络状态"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"网络提醒"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 状态"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"设备管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"提醒"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售演示模式"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB 连接"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系统"</string>
<string name="user_owner_label" msgid="1119010402169916617">"切换到“个人”"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"允许应用自行删除主屏幕快捷方式。"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"重新设置外拨电话的路径"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"允许应用在拨出电话时查看拨打的电话号码,并选择改为拨打其他号码或完全中止通话。"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"接听来电"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"允许该应用接听来电。"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"接收讯息(短信)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"允许该应用接收和处理短信。这就意味着,该应用可能会监视发送到您设备的短信,或删除发送到您设备的短信而不向您显示。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"接收讯息(彩信)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>会在其他应用的上层显示内容"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>应用目前显示在上层。"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"此应用的某些部分可能会一直保持可见状态。如果此功能未能正常运行,请将其关闭。"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"关闭"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在准备<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"检查是否有错误"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用于传输照片和媒体文件"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>已损坏"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已损坏,点按即可修复。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>不受支持"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"该设备不支持此<xliff:g id="NAME">%s</xliff:g>。点按即可使用支持的格式进行设置。"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>已意外移除"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"请先卸载<xliff:g id="NAME">%s</xliff:g>,再将其移除,以防数据丢失。"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 请求已修改为 USSD 请求。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 请求已修改为新的 SS 请求。"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作资料"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"展开按钮"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展开"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收起"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"切换展开模式"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 外设端口"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index f07f2c6..1c592e5 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"內容已隱藏"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"已根據政策隱藏內容"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"實體鍵盤"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"安全性"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"車用模式"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"帳戶狀態"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"開發人員訊息"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"網絡狀態"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"網絡通知"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 狀態"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"裝置管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售示範"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB 連線"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string>
<string name="user_owner_label" msgid="1119010402169916617">"切換至個人設定檔"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"允許應用程式繞過使用者授權直接移除主畫面捷徑。"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"重新設定撥出電話的路徑"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"允許應用程式在撥出電話時查看所撥打的電話號碼,並選擇將電話重新導向至另一個號碼或完全中斷通話。"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"接聽來電"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"允許應用程式接聽來電。"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"接收短訊 (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"允許應用程式接收和處理短訊。這表示應用程式可監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"接收短訊 (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕按即可選取語言和鍵盤配置"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"「<xliff:g id="NAME">%s</xliff:g>」會覆蓋其他應用程式"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"「<xliff:g id="NAME">%s</xliff:g>」應用程式目前在最上層顯示。"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"畫面上可能會一直保持顯示此應用程式的某些部分。如果此功能無法正常運作,請將其關閉。"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"用於轉移相片和媒體"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> 已受損"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已損壞,輕按即可修復。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"不支援的 <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"此裝置並不支援此 <xliff:g id="NAME">%s</xliff:g>。輕按即可在支援的格式設定。"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>被意外移除"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載<xliff:g id="NAME">%s</xliff:g>,然後才移除,以免遺失資料。"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已修改為 USSD 要求。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已修改為新的 SS 要求。"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作設定檔"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"展開按鈕"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"切換展開"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 外端連接埠"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 2fc1cbc..4d07601 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"內容已隱藏"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"內容已依據政策隱藏"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"實體鍵盤"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"安全性"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"車用模式"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"帳戶狀態"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"開發人員的訊息"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"網路狀態"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"網路警示"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 狀態"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"裝置管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"快訊"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"零售商示範模式"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"USB 連線"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string>
<string name="user_owner_label" msgid="1119010402169916617">"切換至個人設定檔"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"允許應用程式自動移除主螢幕捷徑。"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"重設撥號路徑"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"允許應用程式在撥打電話期間查看撥出的電話號碼,並可選擇改撥其他號碼或中斷通話。"</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"接聽電話"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"允許應用程式接聽來電。"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"接收簡訊 (SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"允許應用程式接收和處理簡訊。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"接收簡訊 (MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕觸即可選取語言和版面配置"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"<xliff:g id="NAME">%s</xliff:g>會在其他應用程式上層繪製內容"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"<xliff:g id="NAME">%s</xliff:g>應用程式目前顯示在最上層。"</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"這個應用程式的某些部分會一直保持顯示。如果這項功能未正常運作,請將它關閉。"</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"關閉"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"可用於傳輸相片和媒體"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"「<xliff:g id="NAME">%s</xliff:g>」毀損"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g>已損毀。輕觸即可修正。"</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"不支援的「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"此裝置不支援這個 <xliff:g id="NAME">%s</xliff:g>。輕觸即可使用支援的格式進行設定。"</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"意外移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"請先卸載「<xliff:g id="NAME">%s</xliff:g>」,再將其移除,以免資料遺失。"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"已移除「<xliff:g id="NAME">%s</xliff:g>」"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"SS 要求已改為 USSD 要求。"</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 要求已改為新的 SS 要求。"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Work 設定檔"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"展開按鈕"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"展開"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"收合"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"切換展開模式"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 週邊連接埠"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 692d4f3..fc31a79 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -244,32 +244,20 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Okuqukethwe kufihliwe"</string>
<string name="notification_hidden_by_policy_text" msgid="9004631276932584600">"Okuqukethwe kufihlwe inqubomgomo"</string>
- <!-- no translation found for notification_channel_virtual_keyboard (6969925135507955575) -->
- <skip />
- <!-- no translation found for notification_channel_physical_keyboard (7297661826966861459) -->
- <skip />
+ <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Ikhibhodi ebonakalayo"</string>
+ <string name="notification_channel_physical_keyboard" msgid="7297661826966861459">"Ikhibhodi ephathekayo"</string>
<string name="notification_channel_security" msgid="7345516133431326347">"Ukuphepha"</string>
- <!-- no translation found for notification_channel_car_mode (3553380307619874564) -->
- <skip />
- <!-- no translation found for notification_channel_account (7577959168463122027) -->
- <skip />
- <!-- no translation found for notification_channel_developer (7579606426860206060) -->
- <skip />
- <!-- no translation found for notification_channel_updates (4794517569035110397) -->
- <skip />
- <!-- no translation found for notification_channel_network_status (5025648583129035447) -->
- <skip />
- <!-- no translation found for notification_channel_network_alerts (2895141221414156525) -->
- <skip />
- <!-- no translation found for notification_channel_vpn (8330103431055860618) -->
- <skip />
- <!-- no translation found for notification_channel_device_admin (1568154104368069249) -->
- <skip />
+ <string name="notification_channel_car_mode" msgid="3553380307619874564">"Imodi yemoto"</string>
+ <string name="notification_channel_account" msgid="7577959168463122027">"Isimo se-akhawunti"</string>
+ <string name="notification_channel_developer" msgid="7579606426860206060">"Imilayezo yonjiniyela"</string>
+ <string name="notification_channel_updates" msgid="4794517569035110397">"Izibuyekezo"</string>
+ <string name="notification_channel_network_status" msgid="5025648583129035447">"Isimo senethiwekhi"</string>
+ <string name="notification_channel_network_alerts" msgid="2895141221414156525">"Izexwayiso zenethiwekhi"</string>
+ <string name="notification_channel_vpn" msgid="8330103431055860618">"Isimo se-VPN"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Ukulawula idivayisi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Izexwayiso"</string>
- <!-- no translation found for notification_channel_retail_mode (6088920674914038779) -->
- <skip />
- <!-- no translation found for notification_channel_usb (9006850475328924681) -->
- <skip />
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Idemo yokuthenga"</string>
+ <string name="notification_channel_usb" msgid="9006850475328924681">"Ukuxhumeka kwe-USB"</string>
<string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string>
<string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string>
<string name="user_owner_label" msgid="1119010402169916617">"Shintshela komuntu siqu"</string>
@@ -318,10 +306,8 @@
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Ivumela uhlelo lokusebenza ukususa izinqamuleli zesikrini sasekhaya ngaphandle kokungenela komsebenzisi."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"thumela amakholi aphumayo kabusha"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Ivumela uhlelo lokusebenza ukubona inombolo eshayelwayo ngesikhathi sekholi ephumayo ngenketho yokuqondisa kabusha ikholi kwinombolo ehlukile noma ukuyekisa ikholi yonke."</string>
- <!-- no translation found for permlab_answerPhoneCalls (4077162841226223337) -->
- <skip />
- <!-- no translation found for permdesc_answerPhoneCalls (2901889867993572266) -->
- <skip />
+ <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"phendula amakholi efoni"</string>
+ <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Ivumela uhlelo lokusebenza ukuthi luphendule ikholi yefoni engenayo."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"thola imiyalezo ebhaliwe (i-SMS)"</string>
<string name="permdesc_receiveSms" msgid="6424387754228766939">"Ivumela uhlelo lokusebenza ukuthola nokucubungula imilayezo ye-SMS. Loku kuchaza ukuthi uhlelo lokusebenza lungangamela noma lesuse imilayezo ethunyelwe kudivayisi yakho ngaphandle kokukubonisa yona."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"thola imiyalezo ebhaliwe (i-MMS)"</string>
@@ -1197,9 +1183,12 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Thepha ukuze ukhethe ulimi nesakhiwo"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_name" msgid="7443890103456396837">"I-<xliff:g id="NAME">%s</xliff:g> yokudweba ngaphezu kwezinye izinhlelo zokusebenza"</string>
- <string name="alert_windows_notification_title" msgid="5399998516035621282">"Uhlelo lokusebenza lwe-<xliff:g id="NAME">%s</xliff:g> liboniswa ngaphezulu."</string>
- <string name="alert_windows_notification_message" msgid="2456738662997073459">"Izingxenye zalolu hlelo lokusebenza zingahlala zibonakala ngazo zonke izikhathi. Uma lesi sici singasebenzi ngokufanelekile, sivale."</string>
+ <!-- no translation found for alert_windows_notification_channel_name (3116610965549449803) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_title (4532185840598192445) -->
+ <skip />
+ <!-- no translation found for alert_windows_notification_message (8917232109522912560) -->
+ <skip />
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VALA"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ilungiselela i-<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ihlolela amaphutha"</string>
@@ -1207,8 +1196,12 @@
<string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Ukuze kudluliselwe izithombe nemidiya"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"Yonakele <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unmountable_notification_message" msgid="2343202057122495773">"<xliff:g id="NAME">%s</xliff:g> yonakele. Thepha ukuze ulungise."</string>
+ <!-- no translation found for ext_media_unmountable_notification_message (3941179940297874950) -->
+ <skip />
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Akusekelwe <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Le divayisi ayisekeli le <xliff:g id="NAME">%s</xliff:g>. Thepha ukuze usethe ngefomethi esekelwayo."</string>
+ <!-- no translation found for ext_media_unsupported_notification_message (3725436899820390906) -->
+ <skip />
<string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"I-<xliff:g id="NAME">%s</xliff:g> isuswe ngokungalindelekile"</string>
<string name="ext_media_badremoval_notification_message" msgid="380176703346946313">"Yehlisa i-<xliff:g id="NAME">%s</xliff:g> ngaphambi kokususa ukuze ugweme ukulahleka kwedatha"</string>
<string name="ext_media_nomedia_notification_title" msgid="1704840188641749091">"I-<xliff:g id="NAME">%s</xliff:g> isusiwe"</string>
@@ -1668,7 +1661,8 @@
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Isicelo se-SS siguqulelwe kusicelo se-USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Isicelo se-SS siguqulelwe kusicelo esisha se-SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Iphrofayela yomsebenzi"</string>
- <string name="expand_button_content_description" msgid="5855955413376384681">"Inkinobho yokunweba"</string>
+ <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Nweba"</string>
+ <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Goqa"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"guqula ukunwebisa"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Imbobo ye-Android USB Peripheral"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"I-Android"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index b3cb2c7..248fd15 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2293,22 +2293,22 @@
<enum name="auto" value="0x00000010" />
</attr>
- <!-- Controls the auto-fill behavior for this view. -->
- <attr name="autoFillMode">
+ <!-- Controls the autofill behavior for this view. -->
+ <attr name="autofillMode">
<!-- Inherit the behavior from the parent. If there is no parent it is auto. This is the
default value for this attribute.-->
<enum name="inherit" value="0" />
- <!-- Allows this view to automatically trigger an auto-fill request when it get focus.
+ <!-- Allows this view to automatically trigger an autofill request when it get focus.
-->
<enum name="auto" value="1" />
- <!-- Do not trigger an auto-fill request when this view is focused. The user can still
- manually force an auto-fill request for this view. -->
+ <!-- Do not trigger an autofill request when this view is focused. The user can still
+ manually force an autofill request for this view. -->
<enum name="manual" value="2" />
</attr>
- <!-- Describes the content of a view so that a auto-fill service can fill in the appropriate
+ <!-- Describes the content of a view so that a autofill service can fill in the appropriate
data. Multiple flags can be combined to mean e.g. emailAddress or postalAddress. -->
- <attr name="autoFillHint">
+ <attr name="autofillHint">
<!-- No hint. -->
<flag name="none" value="0" />
<!-- The view contains an email address. -->
@@ -7213,7 +7213,7 @@
<!-- The key of another Preference that this Preference will depend on. If the other
Preference is not set or is off, this Preference will be disabled. -->
<attr name="dependency" format="string" />
- <!-- Whether the Preference stores its value to the shared preferences. -->
+ <!-- Whether the Preference stores its value to the storage. -->
<attr name="persistent" />
<!-- The default value for the preference, which will be set either if persistence
is off or persistence is on and the preference is not found in the persistent
@@ -7222,6 +7222,9 @@
<!-- Whether the view of this Preference should be disabled when
this Preference is disabled. -->
<attr name="shouldDisableView" format="boolean" />
+ <!-- Whether the preference has enabled to have its view recycled when used in the list
+ view. This is true by default. -->
+ <attr name="recycleEnabled" format="boolean" />
</declare-styleable>
<!-- Base attributes available to CheckBoxPreference. -->
@@ -7717,14 +7720,21 @@
</declare-styleable>
<!-- =============================== -->
- <!-- AutoFill attributes -->
+ <!-- Autofill attributes -->
<!-- =============================== -->
<eat-comment />
<!-- Use <code>autofill-service</code> as the root tag of the XML resource that describes a
- {@link android.service.autofill.AutoFillService}, which is referenced from its
+ {@link android.service.autofill.AutofillService}, which is referenced from its
{@link android.service.autofill#SERVICE_META_DATA} meta-data entry.
-->
+ <declare-styleable name="AutofillService">
+ <!-- Fully qualified class name of an activity that allows the user to modify
+ the settings for this service. -->
+ <attr name="settingsActivity" />
+ </declare-styleable>
+
+ <!-- TODO(b/35956626): temporary until clients change to AutofillService -->
<declare-styleable name="AutoFillService">
<!-- Fully qualified class name of an activity that allows the user to modify
the settings for this service. -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index a3a0c83..6e0d9dc 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -470,6 +470,8 @@
<integer translatable="false" name="config_wifi_framework_LAST_SELECTION_AWARD">480</integer>
<integer translatable="false" name="config_wifi_framework_PASSPOINT_SECURITY_AWARD">40</integer>
<integer translatable="false" name="config_wifi_framework_SECURITY_AWARD">80</integer>
+ <!-- Integer specifying the base interval in seconds for the exponential backoff scan for autojoin -->
+ <integer translatable="false" name="config_wifi_framework_exponential_backoff_scan_base_interval">20</integer>
<!-- Integer parameters of the wifi to cellular handover feature
wifi should not stick to bad networks -->
<integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-82</integer>
@@ -2569,6 +2571,16 @@
ratio larger than this is considered to wide and short to be usable. -->
<item name="config_pictureInPictureMaxAspectRatio" format="float" type="dimen">2.35</item>
+ <!-- The snap mode to use for picture-in-picture. These values correspond to constants defined
+ in PipSnapAlgorithm and should not be changed independently.
+ 0 - Snap to the four corners
+ 1 - Snap to the four corners and the mid-points on the long edge in each orientation
+ 2 - Snap anywhere along the edge of the screen
+ 3 - Snap anywhere along the edge of the screen and magnet to corners
+ 4 - Snap to the long edges in each orientation and magnet to corners
+ -->
+ <integer name="config_pictureInPictureSnapMode">4</integer>
+
<!-- Controls the snap mode for the docked stack divider
0 - 3 snap targets: left/top has 16:9 ratio, 1:1, and right/bottom has 16:9 ratio
1 - 3 snap targets: fixed ratio, 1:1, (1 - fixed ratio)
diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml
index 613616f..f8a071d 100644
--- a/core/res/res/values/ids.xml
+++ b/core/res/res/values/ids.xml
@@ -135,4 +135,7 @@
<!-- ItemTouchHelper uses this id to save a View's original elevation. -->
<item type="id" name="item_touch_helper_previous_elevation"/>
+
+ <!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_MOVE_WINDOW}. -->
+ <item type="id" name="accessibilityActionMoveWindow" />
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index b664448..bb3f1c3 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2797,14 +2797,15 @@
<public name="numericModifiers" />
<public name="fontProviderAuthority" />
<public name="fontProviderQuery" />
- <public name="autoFillMode" />
+ <public name="autofillMode" />
<public name="primaryContentAlpha" />
<public name="secondaryContentAlpha" />
<public name="requiredFeature" />
<public name="requiredNotFeature" />
- <public name="autoFillHint" />
+ <public name="autofillHint" />
<public name="fontProviderPackage" />
<public name="importantForAutofill" />
+ <public name="recycleEnabled"/>
</public-group>
<public-group type="style" first-id="0x010302e0">
@@ -2812,6 +2813,7 @@
<public-group type="id" first-id="0x01020041">
<public name="textAssist" />
+ <public name="accessibilityActionMoveWindow" />
</public-group>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index bd8d572..d1d406d 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3167,13 +3167,13 @@
<skip />
<!-- Name of notification channel the system post notification to inform the use about apps
that are drawing ui on-top of other apps (alert-windows) [CHAR LIMIT=NONE] -->
- <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> draw over other apps</string>
+ <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> displaying over other apps</string>
<!-- Notification title when an application is displaying ui on-top of other apps
[CHAR LIMIT=30] -->
- <string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> app displaying on top.</string>
+ <string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> is displaying over other apps.</string>
<!-- Notification body when an application is displaying ui on-top of other apps
[CHAR LIMIT=NONE] -->
- <string name="alert_windows_notification_message">Parts of this app may remain visible at all times. If this feature isn\'t working correctly, turn it off.</string>
+ <string name="alert_windows_notification_message">If you don’t want <xliff:g id="name" example="Google Maps">%s</xliff:g> to use this feature, tap to open settings and turn it off.</string>
<!-- Notification action to turn-off app displaying on-top of other apps. [CHAR LIMIT=20] -->
<string name="alert_windows_notification_turn_off_action">TURN OFF</string>
@@ -3195,11 +3195,15 @@
<string name="ext_media_unmountable_notification_title">Corrupted <xliff:g id="name" example="SD card">%s</xliff:g></string>
<!-- Notification body when external media is unmountable (corrupt) [CHAR LIMIT=NONE] -->
<string name="ext_media_unmountable_notification_message"><xliff:g id="name" example="SD card">%s</xliff:g> is corrupt. Tap to fix.</string>
+ <!-- TV-specifiv notification body when external media is unmountable (corrupt) [CHAR LIMIT=NONE] -->
+ <string name="ext_media_unmountable_notification_message" product="tv"><xliff:g id="name" example="SD card">%s</xliff:g> is corrupt. Select to fix.</string>
<!-- Notification title when external media is unsupported [CHAR LIMIT=30] -->
<string name="ext_media_unsupported_notification_title">Unsupported <xliff:g id="name" example="SD card">%s</xliff:g></string>
<!-- Notification body when external media is unsupported [CHAR LIMIT=NONE] -->
<string name="ext_media_unsupported_notification_message">This device doesn\u2019t support this <xliff:g id="name" example="SD card">%s</xliff:g>. Tap to set up in a supported format.</string>
+ <!-- TV-specific notification body when external media is unsupported [CHAR LIMIT=NONE] -->
+ <string name="ext_media_unsupported_notification_message" product="tv">This device doesn\u2019t support this <xliff:g id="name" example="SD card">%s</xliff:g>. Select to set up in a supported format.</string>
<!-- Notification title when external media is unsafely removed [CHAR LIMIT=30] -->
<string name="ext_media_badremoval_notification_title"><xliff:g id="name" example="SD card">%s</xliff:g> unexpectedly removed</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 32babab..0c318cf 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1556,6 +1556,7 @@
<java-symbol type="dimen" name="docked_stack_minimize_thickness" />
<java-symbol type="dimen" name="pip_minimized_visible_size" />
<java-symbol type="integer" name="config_dockedStackDividerSnapMode" />
+ <java-symbol type="integer" name="config_pictureInPictureSnapMode" />
<java-symbol type="fraction" name="docked_stack_divider_fixed_ratio" />
<java-symbol type="fraction" name="thumbnail_fullscreen_scale" />
<java-symbol type="integer" name="thumbnail_width_tv" />
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 1a16b3b..fba8e23 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -22,6 +22,7 @@
$(call all-java-files-under, EnabledTestApp/src)
LOCAL_DX_FLAGS := --core-library
+LOCAL_JACK_FLAGS := --multi-dex native
LOCAL_AAPT_FLAGS = -0 dat -0 gld -c fa
LOCAL_STATIC_JAVA_LIBRARIES := \
core-tests-support \
diff --git a/core/tests/coretests/src/android/metrics/LogMakerTest.java b/core/tests/coretests/src/android/metrics/LogMakerTest.java
index ece44be..bab9f63 100644
--- a/core/tests/coretests/src/android/metrics/LogMakerTest.java
+++ b/core/tests/coretests/src/android/metrics/LogMakerTest.java
@@ -171,6 +171,14 @@
assertEquals(null, builder.getPackageName());
}
+ public void testSetAndClearPid() {
+ LogMaker builder = new LogMaker(0);
+ builder.setProcessId(1);
+ assertEquals(1, builder.getProcessId());
+ builder.clearProcessId();
+ assertEquals(-1, builder.getProcessId());
+ }
+
public void testGiantLogOmitted() {
LogMaker badBuilder = new LogMaker(0);
StringBuilder b = new StringBuilder();
diff --git a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
index d1c68a9..09cbbff 100644
--- a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
@@ -52,7 +52,7 @@
mResolver = getMockContentResolver();
}
- public void testFindPath_docUri() throws Exception {
+ public void testFindDocumentPath_docUri() throws Exception {
final Path expected = new Path(ROOT_ID, Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID));
mProvider.nextPath = expected;
@@ -65,7 +65,7 @@
}
}
- public void testFindPath_treeUri() throws Exception {
+ public void testFindDocumentPath_treeUri() throws Exception {
mProvider.nextIsChildDocument = true;
final Path expected = new Path(null, Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID));
@@ -73,12 +73,13 @@
final Uri docUri = buildTreeDocumentUri(
TestDocumentsProvider.AUTHORITY, PARENT_DOCUMENT_ID, DOCUMENT_ID);
- final List<String> actual = DocumentsContract.findDocumentPath(mResolver, docUri);
+ final Path actual = DocumentsContract.findDocumentPath(mResolver, docUri);
- assertEquals(expected.getPath(), actual);
+ assertNull(actual.getRootId());
+ assertEquals(expected.getPath(), actual.getPath());
}
- public void testFindPath_treeUri_throwsOnNonChildDocument() throws Exception {
+ public void testFindDocumentPath_treeUri_throwsOnNonChildDocument() throws Exception {
mProvider.nextPath = new Path(null, Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID));
final Uri docUri = buildTreeDocumentUri(
@@ -86,18 +87,28 @@
assertNull(DocumentsContract.findDocumentPath(mResolver, docUri));
}
- public void testFindPath_treeUri_erasesNonNullRootId() throws Exception {
+ public void testFindDocumentPath_treeUri_erasesNonNullRootId() throws Exception {
mProvider.nextIsChildDocument = true;
mProvider.nextPath = new Path(ROOT_ID, Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID));
final Uri docUri = buildTreeDocumentUri(
TestDocumentsProvider.AUTHORITY, PARENT_DOCUMENT_ID, DOCUMENT_ID);
- try (ContentProviderClient client =
- mResolver.acquireUnstableContentProviderClient(docUri)) {
- Path path = DocumentsContract.findDocumentPath(client, docUri);
- assertNull(path.getRootId());
- }
+ Path path = DocumentsContract.findDocumentPath(mResolver, docUri);
+ assertNull(path.getRootId());
+ assertEquals(Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID), path.getPath());
+ }
+
+ public void testFindDocumentPath_treeUri_erasesDocsOutsideTree() throws Exception {
+ mProvider.nextIsChildDocument = true;
+
+ mProvider.nextPath = new Path(
+ null, Arrays.asList(ANCESTOR_DOCUMENT_ID, PARENT_DOCUMENT_ID, DOCUMENT_ID));
+
+ final Uri docUri = buildTreeDocumentUri(
+ TestDocumentsProvider.AUTHORITY, PARENT_DOCUMENT_ID, DOCUMENT_ID);
+ Path path = DocumentsContract.findDocumentPath(mResolver, docUri);
+ assertEquals(Arrays.asList(PARENT_DOCUMENT_ID, DOCUMENT_ID), path.getPath());
}
private static Uri buildTreeDocumentUri(String authority, String parentDocId, String docId) {
diff --git a/core/tests/coretests/src/android/provider/FontsContractTest.java b/core/tests/coretests/src/android/provider/FontsContractTest.java
index db623a4..d90fc2b 100644
--- a/core/tests/coretests/src/android/provider/FontsContractTest.java
+++ b/core/tests/coretests/src/android/provider/FontsContractTest.java
@@ -15,12 +15,12 @@
*/
package android.provider;
-import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
@@ -28,6 +28,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.content.pm.Signature;
+import android.database.MatrixCursor;
import android.graphics.Typeface;
import android.graphics.fonts.FontRequest;
import android.graphics.fonts.FontResult;
@@ -72,11 +73,12 @@
mResultReceiver = mock(ResultReceiver.class);
}
- public void testGetFontFromProvider() {
+ public void testGetFontFromProvider_resultOK() {
mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
- verify(mResultReceiver).send(eq(FontsContract.RESULT_CODE_OK), bundleCaptor.capture());
+ verify(mResultReceiver).send(
+ eq(FontsContract.Columns.RESULT_CODE_OK), bundleCaptor.capture());
Bundle bundle = bundleCaptor.getValue();
assertNotNull(bundle);
@@ -96,7 +98,8 @@
final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
- verify(mResultReceiver).send(eq(FontsContract.RESULT_CODE_OK), bundleCaptor.capture());
+ verify(mResultReceiver).send(
+ eq(FontsContract.Columns.RESULT_CODE_OK), bundleCaptor.capture());
Bundle bundle = bundleCaptor.getValue();
assertNotNull(bundle);
@@ -111,11 +114,79 @@
assertNotNull(fontResult.getFileDescriptor());
}
+ public void testGetFontFromProvider_resultFontNotFound() {
+ // Make the provider return unknown
+ mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND,null);
+ }
+
+ public void testGetFontFromProvider_resultFontUnavailable() {
+ // Make the provider return font unavailable
+ mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE,null);
+ }
+
+ public void testGetFontFromProvider_resultMalformedQuery() {
+ // Make the provider return font unavailable
+ mProvider.setResultCode(FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY,null);
+ }
+
+ public void testGetFontFromProvider_resultFontNotFoundSecondRow() {
+ MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+ FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+ FontsContract.Columns.STYLE, FontsContract.Columns.RESULT_CODE });
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_OK});
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND});
+ mProvider.setCustomCursor(cursor);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+ }
+
+ public void testGetFontFromProvider_resultFontNotFoundOtherRow() {
+ MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+ FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+ FontsContract.Columns.STYLE, FontsContract.Columns.RESULT_CODE });
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_OK});
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND});
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_OK});
+ mProvider.setCustomCursor(cursor);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+ }
+
+ public void testGetFontFromProvider_resultCodeIsNegativeNumber() {
+ MatrixCursor cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
+ FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
+ FontsContract.Columns.STYLE, FontsContract.Columns.RESULT_CODE });
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL,
+ FontsContract.Columns.RESULT_CODE_OK});
+ cursor.addRow(new Object[] { 1, 0, null, Typeface.NORMAL, -5});
+ mProvider.setCustomCursor(cursor);
+ mContract.getFontFromProvider(request, mResultReceiver, TestFontsProvider.AUTHORITY);
+
+ verify(mResultReceiver).send(FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND, null);
+ }
+
public void testGetProvider_providerNotFound() {
when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(null);
- ProviderInfo result = mContract.getProvider(request);
+ ProviderInfo result = mContract.getProvider(request, mResultReceiver);
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
assertNull(result);
}
@@ -124,8 +195,9 @@
info.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(info);
- ProviderInfo result = mContract.getProvider(request);
+ ProviderInfo result = mContract.getProvider(request, mResultReceiver);
+ verifyZeroInteractions(mResultReceiver);
assertEquals(info, result);
}
@@ -136,8 +208,10 @@
when(mPackageManager.resolveContentProvider(anyString(), anyInt())).thenReturn(info);
ProviderInfo result = mContract.getProvider(
- new FontRequest(TestFontsProvider.AUTHORITY, "com.wrong.package", "query"));
+ new FontRequest(TestFontsProvider.AUTHORITY, "com.wrong.package", "query"),
+ mResultReceiver);
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
assertNull(result);
}
@@ -146,8 +220,9 @@
setupPackageManager();
// The default request is missing the certificates info.
- ProviderInfo result = mContract.getProvider(request);
+ ProviderInfo result = mContract.getProvider(request, mResultReceiver);
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
assertNull(result);
}
@@ -159,8 +234,9 @@
List<byte[]> certList = Arrays.asList(wrongCert);
FontRequest requestWrongCerts = new FontRequest(
TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
- ProviderInfo result = mContract.getProvider(requestWrongCerts);
+ ProviderInfo result = mContract.getProvider(requestWrongCerts, mResultReceiver);
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
assertNull(result);
}
@@ -171,8 +247,9 @@
List<byte[]> certList = Arrays.asList(BYTE_ARRAY);
FontRequest requestRightCerts = new FontRequest(
TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
- ProviderInfo result = mContract.getProvider(requestRightCerts);
+ ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+ verifyZeroInteractions(mResultReceiver);
assertEquals(info, result);
}
@@ -184,9 +261,10 @@
List<byte[]> certList = Arrays.asList(wrongCert, BYTE_ARRAY);
FontRequest requestRightCerts = new FontRequest(
TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", Arrays.asList(certList));
- ProviderInfo result = mContract.getProvider(requestRightCerts);
+ ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
// There is one too many certs, should fail as the set doesn't match.
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_WRONG_CERTIFICATES, null);
assertNull(result);
}
@@ -200,8 +278,9 @@
certList.add(Arrays.asList(BYTE_ARRAY));
FontRequest requestRightCerts = new FontRequest(
TestFontsProvider.AUTHORITY, PACKAGE_NAME, "query", certList);
- ProviderInfo result = mContract.getProvider(requestRightCerts);
+ ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+ verifyZeroInteractions(mResultReceiver);
assertEquals(info, result);
}
@@ -213,8 +292,9 @@
certList.add(Arrays.asList(BYTE_ARRAY));
FontRequest requestRightCerts = new FontRequest(
TestFontsProvider.AUTHORITY, "com.wrong.package.name", "query", certList);
- ProviderInfo result = mContract.getProvider(requestRightCerts);
+ ProviderInfo result = mContract.getProvider(requestRightCerts, mResultReceiver);
+ verify(mResultReceiver).send(FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND, null);
assertNull(result);
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 696d498..0cfdaf5 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -198,7 +198,7 @@
Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
Settings.Global.HDMI_CONTROL_ENABLED,
- Settings.Global.HDMI_SYSTEM_AUDIO_ENABLED,
+ Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
Settings.Global.HTTP_PROXY,
Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
@@ -385,7 +385,7 @@
Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
Settings.Secure.ASSIST_STRUCTURE_ENABLED,
- Settings.Secure.AUTO_FILL_SERVICE,
+ Settings.Secure.AUTOFILL_SERVICE,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_LAST_RUN,
diff --git a/core/tests/coretests/src/android/provider/TestDocumentsProvider.java b/core/tests/coretests/src/android/provider/TestDocumentsProvider.java
index d61049d..1bd8ff6 100644
--- a/core/tests/coretests/src/android/provider/TestDocumentsProvider.java
+++ b/core/tests/coretests/src/android/provider/TestDocumentsProvider.java
@@ -85,7 +85,7 @@
}
@Override
- public Path findDocumentPath(String documentId, @Nullable String parentDocumentId) {
+ public Path findDocumentPath(@Nullable String parentDocumentId, String documentId) {
lastDocumentId = documentId;
lastParentDocumentId = parentDocumentId;
diff --git a/core/tests/coretests/src/android/provider/TestFontsProvider.java b/core/tests/coretests/src/android/provider/TestFontsProvider.java
index 6d40f37..13f5318 100644
--- a/core/tests/coretests/src/android/provider/TestFontsProvider.java
+++ b/core/tests/coretests/src/android/provider/TestFontsProvider.java
@@ -41,6 +41,15 @@
private ParcelFileDescriptor mPfd;
private boolean mReturnAllFields = true;
+ private int mResultCode = FontsContract.Columns.RESULT_CODE_OK;
+ private MatrixCursor mCustomCursor = null;
+
+ /**
+ * Used by tests to modify the result code that should be returned.
+ */
+ void setResultCode(int resultCode) {
+ mResultCode = resultCode;
+ }
/**
* Used by tests to switch whether all fields should be returned or not.
@@ -49,6 +58,13 @@
mReturnAllFields = returnAllFields;
}
+ /**
+ * Used by tests to control what values are returned.
+ */
+ void setCustomCursor(MatrixCursor cursor) {
+ mCustomCursor = cursor;
+ }
+
@Override
public boolean onCreate() {
mPfd = createFontFile();
@@ -58,12 +74,15 @@
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
+ if (mCustomCursor != null) {
+ return mCustomCursor;
+ }
MatrixCursor cursor;
if (mReturnAllFields) {
cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID,
FontsContract.Columns.TTC_INDEX, FontsContract.Columns.VARIATION_SETTINGS,
- FontsContract.Columns.STYLE });
- cursor.addRow(new Object[] { 1, TTC_INDEX, VARIATION_SETTINGS, STYLE });
+ FontsContract.Columns.STYLE, FontsContract.Columns.RESULT_CODE });
+ cursor.addRow(new Object[] { 1, TTC_INDEX, VARIATION_SETTINGS, STYLE, mResultCode });
} else {
cursor = new MatrixCursor(new String[] { FontsContract.Columns._ID });
cursor.addRow(new Object[] { 1 });
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
index e152163..4ec78ff 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java
@@ -65,4 +65,49 @@
assertEquals(1, sensorBgCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
}
+
+ @SmallTest
+ public void testNestedSensorReset() throws Exception {
+ final MockClocks clocks = new MockClocks();
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+ bi.mForceOnBattery = true;
+ clocks.realtime = 100;
+ clocks.uptime = 100;
+ bi.getOnBatteryTimeBase().setRunning(true, 100, 100);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_RECEIVER);
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ bi.noteStartSensorLocked(UID, SENSOR_ID);
+
+ clocks.realtime += 100;
+ clocks.uptime += 100;
+
+ // The sensor is started and the background counter has been created.
+ final BatteryStats.Uid uid = bi.getUidStats().get(UID);
+ assertNotNull(uid);
+
+ BatteryStats.Uid.Sensor sensor = uid.getSensorStats().get(SENSOR_ID);
+ assertNotNull(sensor);
+ assertNotNull(sensor.getSensorTime());
+ assertNotNull(sensor.getSensorBgCount());
+
+ // Reset the stats. Since the sensor is still running, we should still see the sensor
+ // timer. Background counter should be gone though.
+ bi.getUidStatsLocked(UID).reset();
+
+ sensor = uid.getSensorStats().get(SENSOR_ID);
+ assertNotNull(sensor);
+ assertNotNull(sensor.getSensorTime());
+ assertNull(sensor.getSensorBgCount());
+
+ bi.noteStopSensorLocked(UID, SENSOR_ID);
+
+ // Now the sensor timer has stopped so this reset should also take out the sensor.
+ bi.getUidStatsLocked(UID).reset();
+
+ sensor = uid.getSensorStats().get(SENSOR_ID);
+ assertNull(sensor);
+ }
}
diff --git a/data/sounds/AudioTv.mk b/data/sounds/AudioTv.mk
new file mode 100644
index 0000000..ee37cb9
--- /dev/null
+++ b/data/sounds/AudioTv.mk
@@ -0,0 +1,125 @@
+# Copyright 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := frameworks/base/data/sounds
+
+PRODUCT_COPY_FILES += \
+ $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_02.ogg:system/media/audio/alarms/Alarm_Beep_02.ogg \
+ $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \
+ $(LOCAL_PATH)/Alarm_Buzzer.ogg:system/media/audio/alarms/Alarm_Buzzer.ogg \
+ $(LOCAL_PATH)/Alarm_Classic.ogg:system/media/audio/alarms/Alarm_Classic.ogg \
+ $(LOCAL_PATH)/Alarm_Rooster_02.ogg:system/media/audio/alarms/Alarm_Rooster_02.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Barium.ogg:system/media/audio/alarms/Barium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \
+ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick_48k.ogg:system/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoStop_48k.ogg:system/media/audio/ui/VideoStop.ogg \
+ $(LOCAL_PATH)/effects/ogg/WirelessChargingStarted.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
+ $(LOCAL_PATH)/F1_MissedCall.ogg:system/media/audio/notifications/F1_MissedCall.ogg \
+ $(LOCAL_PATH)/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_MMS.ogg \
+ $(LOCAL_PATH)/F1_New_SMS.ogg:system/media/audio/notifications/F1_New_SMS.ogg \
+ $(LOCAL_PATH)/notifications/Aldebaran.ogg:system/media/audio/notifications/Aldebaran.ogg \
+ $(LOCAL_PATH)/notifications/Altair.ogg:system/media/audio/notifications/Altair.ogg \
+ $(LOCAL_PATH)/notifications/Antares.ogg:system/media/audio/notifications/Antares.ogg \
+ $(LOCAL_PATH)/notifications/arcturus.ogg:system/media/audio/notifications/arcturus.ogg \
+ $(LOCAL_PATH)/notifications/Beat_Box_Android.ogg:system/media/audio/notifications/Beat_Box_Android.ogg \
+ $(LOCAL_PATH)/notifications/Betelgeuse.ogg:system/media/audio/notifications/Betelgeuse.ogg \
+ $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \
+ $(LOCAL_PATH)/notifications/Castor.ogg:system/media/audio/notifications/Castor.ogg \
+ $(LOCAL_PATH)/notifications/Cricket.ogg:system/media/audio/notifications/Cricket.ogg \
+ $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \
+ $(LOCAL_PATH)/notifications/Doink.ogg:system/media/audio/notifications/Doink.ogg \
+ $(LOCAL_PATH)/notifications/Drip.ogg:system/media/audio/notifications/Drip.ogg \
+ $(LOCAL_PATH)/notifications/Electra.ogg:system/media/audio/notifications/Electra.ogg \
+ $(LOCAL_PATH)/notifications/Fomalhaut.ogg:system/media/audio/notifications/Fomalhaut.ogg \
+ $(LOCAL_PATH)/notifications/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \
+ $(LOCAL_PATH)/notifications/Merope.ogg:system/media/audio/notifications/Merope.ogg \
+ $(LOCAL_PATH)/notifications/moonbeam.ogg:system/media/audio/notifications/moonbeam.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Antimony.ogg:system/media/audio/notifications/Antimony.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Beryllium.ogg:system/media/audio/notifications/Beryllium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Cobalt.ogg:system/media/audio/notifications/Cobalt.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Fluorine.ogg:system/media/audio/notifications/Fluorine.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Gallium.ogg:system/media/audio/notifications/Gallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Helium.ogg:system/media/audio/notifications/Helium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Krypton.ogg:system/media/audio/notifications/Krypton.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Palladium.ogg:system/media/audio/notifications/Palladium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Radon.ogg:system/media/audio/notifications/Radon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Rubidium.ogg:system/media/audio/notifications/Rubidium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Selenium.ogg:system/media/audio/notifications/Selenium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Strontium.ogg:system/media/audio/notifications/Strontium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Syrma.ogg:system/media/audio/notifications/Syrma.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Thallium.ogg:system/media/audio/notifications/Thallium.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Xenon.ogg:system/media/audio/notifications/Xenon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Zirconium.ogg:system/media/audio/notifications/Zirconium.ogg \
+ $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \
+ $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \
+ $(LOCAL_PATH)/notifications/Plastic_Pipe.ogg:system/media/audio/notifications/Plastic_Pipe.ogg \
+ $(LOCAL_PATH)/notifications/regulus.ogg:system/media/audio/notifications/regulus.ogg \
+ $(LOCAL_PATH)/notifications/sirius.ogg:system/media/audio/notifications/sirius.ogg \
+ $(LOCAL_PATH)/notifications/Sirrah.ogg:system/media/audio/notifications/Sirrah.ogg \
+ $(LOCAL_PATH)/notifications/SpaceSeed.ogg:system/media/audio/notifications/SpaceSeed.ogg \
+ $(LOCAL_PATH)/notifications/TaDa.ogg:system/media/audio/notifications/TaDa.ogg \
+ $(LOCAL_PATH)/notifications/Tinkerbell.ogg:system/media/audio/notifications/Tinkerbell.ogg \
+ $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg \
+ $(LOCAL_PATH)/notifications/vega.ogg:system/media/audio/notifications/vega.ogg
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index 9211225..7e6756e 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -28,23 +28,56 @@
* @hide
*/
@SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
- public final Bitmap mBitmap;
+ public Bitmap mBitmap;
- private TileMode mTileX;
- private TileMode mTileY;
+ private int mTileX;
+ private int mTileY;
/**
* Call this to create a new shader that will draw with a bitmap.
*
- * @param bitmap The bitmap to use inside the shader
- * @param tileX The tiling mode for x to draw the bitmap in.
- * @param tileY The tiling mode for y to draw the bitmap in.
+ * @param bitmap The bitmap to use inside the shader
+ * @param tileX The tiling mode for x to draw the bitmap in.
+ * @param tileY The tiling mode for y to draw the bitmap in.
*/
- public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY) {
+ public BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY) {
+ set(bitmap, tileX, tileY);
+ }
+
+ private BitmapShader(Bitmap bitmap, int tileX, int tileY) {
+ setInternal(bitmap, tileX, tileY);
+ }
+
+ /**
+ * Reinitialize the BitmapShader's Bitmap and tile modes.
+ *
+ * @param bitmap The bitmap to use inside the shader
+ * @param tileX The tiling mode for x to draw the bitmap in.
+ * @param tileY The tiling mode for y to draw the bitmap in.
+ */
+ public void set(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY) {
+ if (tileX == null || tileY == null) {
+ throw new IllegalArgumentException();
+ }
+ setInternal(bitmap, tileX.nativeInt, tileY.nativeInt);
+ }
+
+ private void setInternal(Bitmap bitmap, int tileX, int tileY) {
+ if (bitmap == null) {
+ throw new IllegalArgumentException("Bitmap must be non-null");
+ }
+ if (bitmap == mBitmap && tileX == mTileX && tileY == mTileY) {
+ return;
+ }
+ discardNativeInstance();
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
- init(nativeCreate(bitmap, tileX.nativeInt, tileY.nativeInt));
+ }
+
+ @Override
+ long createNativeInstance(long nativeMatrix) {
+ return nativeCreate(nativeMatrix, mBitmap, mTileX, mTileY);
}
/**
@@ -57,6 +90,6 @@
return copy;
}
- private static native long nativeCreate(Bitmap bitmap, int shaderTileModeX,
- int shaderTileModeY);
+ private static native long nativeCreate(long nativeMatrix, Bitmap bitmap,
+ int shaderTileModeX, int shaderTileModeY);
}
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 7289429..2a2e14b 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -157,10 +157,12 @@
/**
* Specify a bitmap for the canvas to draw into. All canvas state such as
- * layers, filters, and the save/restore stack are reset with the exception
- * of the current matrix and clip stack. Additionally, as a side-effect
+ * layers, filters, and the save/restore stack are reset. Additionally,
* the canvas' target density is updated to match that of the bitmap.
*
+ * Prior to API level {@value Build.VERSION_CODES#O} the current matrix and
+ * clip stack were preserved.
+ *
* @param bitmap Specifies a mutable bitmap for the canvas to draw into.
* @see #setDensity(int)
* @see #getDensity()
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index 36fc596..8438bf2 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -16,44 +16,107 @@
package android.graphics;
+
+import android.annotation.NonNull;
+
/** A subclass of shader that returns the composition of two other shaders, combined by
an {@link android.graphics.Xfermode} subclass.
*/
public class ComposeShader extends Shader {
+ Shader mShaderA;
+ private long mNativeInstanceShaderA;
+ Shader mShaderB;
+ private long mNativeInstanceShaderB;
private int mPorterDuffMode;
- final Shader mShaderA;
- final Shader mShaderB;
- /** Create a new compose shader, given shaders A, B, and a combining mode.
- When the mode is applied, it will be given the result from shader A as its
- "dst", and the result from shader B as its "src".
- @param shaderA The colors from this shader are seen as the "dst" by the mode
- @param shaderB The colors from this shader are seen as the "src" by the mode
- @param mode The mode that combines the colors from the two shaders. If mode
- is null, then SRC_OVER is assumed.
+ /**
+ * Create a new compose shader, given shaders A, B, and a combining mode.
+ * When the mode is applied, it will be given the result from shader A as its
+ * "dst", and the result from shader B as its "src".
+ *
+ * @param shaderA The colors from this shader are seen as the "dst" by the mode
+ * @param shaderB The colors from this shader are seen as the "src" by the mode
+ * @param mode The mode that combines the colors from the two shaders. If mode
+ * is null, then SRC_OVER is assumed.
*/
- public ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode) {
+ public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) {
this(shaderA, shaderB, mode.porterDuffMode);
}
- /** Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
- When the mode is applied, it will be given the result from shader A as its
- "dst", and the result from shader B as its "src".
- @param shaderA The colors from this shader are seen as the "dst" by the mode
- @param shaderB The colors from this shader are seen as the "src" by the mode
- @param mode The PorterDuff mode that combines the colors from the two shaders.
+ /**
+ * Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
+ * When the mode is applied, it will be given the result from shader A as its
+ * "dst", and the result from shader B as its "src".
+ *
+ * @param shaderA The colors from this shader are seen as the "dst" by the mode
+ * @param shaderB The colors from this shader are seen as the "src" by the mode
+ * @param mode The PorterDuff mode that combines the colors from the two shaders.
*/
- public ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode) {
+ public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
+ @NonNull PorterDuff.Mode mode) {
this(shaderA, shaderB, mode.nativeInt);
}
private ComposeShader(Shader shaderA, Shader shaderB, int nativeMode) {
+ setInternal(shaderA, shaderB, nativeMode);
+ }
+
+ /**
+ * Reinitialize the ComposeShader's component Shaders and blend mode.
+ *
+ * @param shaderA The colors from this shader are seen as the "dst" by the mode
+ * @param shaderB The colors from this shader are seen as the "src" by the mode
+ * @param mode The PorterDuff mode that combines the colors from the two shaders.
+ */
+ public void set(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) {
+ setInternal(shaderA, shaderB, mode.porterDuffMode);
+ }
+
+ /**
+ * Reinitialize the ComposeShader's component Shaders and blend mode.
+ *
+ * @param shaderA The colors from this shader are seen as the "dst" by the mode
+ * @param shaderB The colors from this shader are seen as the "src" by the mode
+ * @param mode The PorterDuff mode that combines the colors from the two shaders.
+ */
+ public void set(@NonNull Shader shaderA, @NonNull Shader shaderB,
+ @NonNull PorterDuff.Mode mode) {
+ setInternal(shaderA, shaderB, mode.nativeInt);
+ }
+
+ private void setInternal(Shader shaderA, Shader shaderB, int nativeMode) {
+ if (shaderA == null || shaderB == null) {
+ throw new IllegalArgumentException("Shader parameters must not be null");
+ }
+
+ if (shaderA == mShaderA && shaderB == mShaderB && mPorterDuffMode == nativeMode) {
+ // no work to do...
+ return;
+ }
+
+ discardNativeInstance();
mShaderA = shaderA;
mShaderB = shaderB;
mPorterDuffMode = nativeMode;
- init(nativeCreate(shaderA.getNativeInstance(), shaderB.getNativeInstance(),
- nativeMode));
+ }
+
+ @Override
+ long createNativeInstance(long nativeMatrix) {
+ mNativeInstanceShaderA = mShaderA.getNativeInstance();
+ mNativeInstanceShaderB = mShaderB.getNativeInstance();
+ return nativeCreate(nativeMatrix,
+ mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
+ }
+
+ @Override
+ void verifyNativeInstance() {
+ if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
+ || mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
+ // Child shader native instance has been updated,
+ // so our cached native instance is no longer valid - discard it
+ discardNativeInstance();
+ }
}
/**
@@ -67,6 +130,6 @@
return copy;
}
- private static native long nativeCreate(long native_shaderA, long native_shaderB,
- int porterDuffMode);
+ private static native long nativeCreate(long nativeMatrix,
+ long nativeShaderA, long nativeShaderB, int porterDuffMode);
}
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 7b1145c..0e4cd0a 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -16,6 +16,10 @@
package android.graphics;
+import android.annotation.ColorInt;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
public class LinearGradient extends Shader {
private static final int TYPE_COLORS_AND_POSITIONS = 1;
@@ -38,47 +42,88 @@
private TileMode mTileMode;
- /** Create a shader that draws a linear gradient along a line.
- @param x0 The x-coordinate for the start of the gradient line
- @param y0 The y-coordinate for the start of the gradient line
- @param x1 The x-coordinate for the end of the gradient line
- @param y1 The y-coordinate for the end of the gradient line
- @param colors The colors to be distributed along the gradient line
- @param positions May be null. The relative positions [0..1] of
- each corresponding color in the colors array. If this is null,
- the the colors are distributed evenly along the gradient line.
- @param tile The Shader tiling mode
+ /**
+ * Create a shader that draws a linear gradient along a line.
+ *
+ * @param x0 The x-coordinate for the start of the gradient line
+ * @param y0 The y-coordinate for the start of the gradient line
+ * @param x1 The x-coordinate for the end of the gradient line
+ * @param y1 The y-coordinate for the end of the gradient line
+ * @param colors The colors to be distributed along the gradient line
+ * @param positions May be null. The relative positions [0..1] of
+ * each corresponding color in the colors array. If this is null,
+ * the the colors are distributed evenly along the gradient line.
+ * @param tile The Shader tiling mode
*/
- public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[],
- TileMode tile) {
+ public LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],
+ @Nullable float positions[], @NonNull TileMode tile) {
+ set(x0, y0, x1, y1, colors, positions, tile);
+ }
+
+ /**
+ * Create a shader that draws a linear gradient along a line.
+ *
+ * @param x0 The x-coordinate for the start of the gradient line
+ * @param y0 The y-coordinate for the start of the gradient line
+ * @param x1 The x-coordinate for the end of the gradient line
+ * @param y1 The y-coordinate for the end of the gradient line
+ * @param color0 The color at the start of the gradient line.
+ * @param color1 The color at the end of the gradient line.
+ * @param tile The Shader tiling mode
+ */
+ public LinearGradient(float x0, float y0, float x1, float y1,
+ @ColorInt int color0, @ColorInt int color1,
+ @NonNull TileMode tile) {
+ set(x0, y0, x1, y1, color0, color1, tile);
+ }
+
+ /**
+ * Reinitialize the shader.
+ *
+ * @param x0 The x-coordinate for the start of the gradient line
+ * @param y0 The y-coordinate for the start of the gradient line
+ * @param x1 The x-coordinate for the end of the gradient line
+ * @param y1 The y-coordinate for the end of the gradient line
+ * @param colors The colors to be distributed along the gradient line
+ * @param positions May be null. The relative positions [0..1] of
+ * each corresponding color in the colors array. If this is null,
+ * the the colors are distributed evenly along the gradient line.
+ * @param tile The Shader tiling mode
+ */
+ public void set(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[],
+ @Nullable float positions[], @NonNull TileMode tile) {
if (colors.length < 2) {
throw new IllegalArgumentException("needs >= 2 number of colors");
}
if (positions != null && colors.length != positions.length) {
throw new IllegalArgumentException("color and position arrays must be of equal length");
}
+ discardNativeInstance();
mType = TYPE_COLORS_AND_POSITIONS;
mX0 = x0;
mY0 = y0;
mX1 = x1;
mY1 = y1;
- mColors = colors;
- mPositions = positions;
+ mColors = colors.clone();
+ mPositions = positions != null ? positions.clone() : null;
mTileMode = tile;
- init(nativeCreate1(x0, y0, x1, y1, colors, positions, tile.nativeInt));
}
- /** Create a shader that draws a linear gradient along a line.
- @param x0 The x-coordinate for the start of the gradient line
- @param y0 The y-coordinate for the start of the gradient line
- @param x1 The x-coordinate for the end of the gradient line
- @param y1 The y-coordinate for the end of the gradient line
- @param color0 The color at the start of the gradient line.
- @param color1 The color at the end of the gradient line.
- @param tile The Shader tiling mode
+ /**
+ * Reinitialize the shader.
+ *
+ * @param x0 The x-coordinate for the start of the gradient line
+ * @param y0 The y-coordinate for the start of the gradient line
+ * @param x1 The x-coordinate for the end of the gradient line
+ * @param y1 The y-coordinate for the end of the gradient line
+ * @param color0 The color at the start of the gradient line.
+ * @param color1 The color at the end of the gradient line.
+ * @param tile The Shader tiling mode
*/
- public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,
- TileMode tile) {
+ public void set(float x0, float y0, float x1, float y1,
+ @ColorInt int color0, @ColorInt int color1,
+ @NonNull TileMode tile) {
+ discardNativeInstance();
mType = TYPE_COLOR_START_AND_COLOR_END;
mX0 = x0;
mY0 = y0;
@@ -86,8 +131,20 @@
mY1 = y1;
mColor0 = color0;
mColor1 = color1;
+ mColors = null;
+ mPositions = null;
mTileMode = tile;
- init(nativeCreate2(x0, y0, x1, y1, color0, color1, tile.nativeInt));
+ }
+
+ @Override
+ long createNativeInstance(long nativeMatrix) {
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ return nativeCreate1(nativeMatrix, mX0, mY0, mX1, mY1,
+ mColors, mPositions, mTileMode.nativeInt);
+ } else { // TYPE_COLOR_START_AND_COLOR_END
+ return nativeCreate2(nativeMatrix, mX0, mY0, mX1, mY1,
+ mColor0, mColor1, mTileMode.nativeInt);
+ }
}
/**
@@ -96,24 +153,18 @@
@Override
protected Shader copy() {
final LinearGradient copy;
- switch (mType) {
- case TYPE_COLORS_AND_POSITIONS:
- copy = new LinearGradient(mX0, mY0, mX1, mY1, mColors.clone(),
- mPositions != null ? mPositions.clone() : null, mTileMode);
- break;
- case TYPE_COLOR_START_AND_COLOR_END:
- copy = new LinearGradient(mX0, mY0, mX1, mY1, mColor0, mColor1, mTileMode);
- break;
- default:
- throw new IllegalArgumentException("LinearGradient should be created with either " +
- "colors and positions or start color and end color");
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ copy = new LinearGradient(mX0, mY0, mX1, mY1, mColors.clone(),
+ mPositions != null ? mPositions.clone() : null, mTileMode);
+ } else { // TYPE_COLOR_START_AND_COLOR_END
+ copy = new LinearGradient(mX0, mY0, mX1, mY1, mColor0, mColor1, mTileMode);
}
copyLocalMatrix(copy);
return copy;
}
- private native long nativeCreate1(float x0, float y0, float x1, float y1,
+ private native long nativeCreate1(long matrix, float x0, float y0, float x1, float y1,
int colors[], float positions[], int tileMode);
- private native long nativeCreate2(float x0, float y0, float x1, float y1,
+ private native long nativeCreate2(long matrix, float x0, float y0, float x1, float y1,
int color0, int color1, int tileMode);
}
diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java
index ade14c64..ae8f7da 100644
--- a/graphics/java/android/graphics/RadialGradient.java
+++ b/graphics/java/android/graphics/RadialGradient.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.ColorInt;
public class RadialGradient extends Shader {
@@ -40,19 +41,55 @@
private TileMode mTileMode;
- /** Create a shader that draws a radial gradient given the center and radius.
- @param centerX The x-coordinate of the center of the radius
- @param centerY The y-coordinate of the center of the radius
- @param radius Must be positive. The radius of the circle for this gradient.
- @param colors The colors to be distributed between the center and edge of the circle
- @param stops May be <code>null</code>. Valid values are between <code>0.0f</code> and
- <code>1.0f</code>. The relative position of each corresponding color in
- the colors array. If <code>null</code>, colors are distributed evenly
- between the center and edge of the circle.
- @param tileMode The Shader tiling mode
- */
+ /**
+ * Create a shader that draws a radial gradient given the center and radius.
+ *
+ * @param centerX The x-coordinate of the center of the radius
+ * @param centerY The y-coordinate of the center of the radius
+ * @param radius Must be positive. The radius of the circle for this gradient.
+ * @param colors The colors to be distributed between the center and edge of the circle
+ * @param stops May be <code>null</code>. Valid values are between <code>0.0f</code> and
+ * <code>1.0f</code>. The relative position of each corresponding color in
+ * the colors array. If <code>null</code>, colors are distributed evenly
+ * between the center and edge of the circle.
+ * @param tileMode The Shader tiling mode
+ */
public RadialGradient(float centerX, float centerY, float radius,
- @NonNull int colors[], @Nullable float stops[], @NonNull TileMode tileMode) {
+ @NonNull @ColorInt int colors[], @Nullable float stops[],
+ @NonNull TileMode tileMode) {
+ set(centerX, centerY, radius, colors, stops, tileMode);
+ }
+
+ /**
+ * Create a shader that draws a radial gradient given the center and radius.
+ *
+ * @param centerX The x-coordinate of the center of the radius
+ * @param centerY The y-coordinate of the center of the radius
+ * @param radius Must be positive. The radius of the circle for this gradient
+ * @param centerColor The color at the center of the circle.
+ * @param edgeColor The color at the edge of the circle.
+ * @param tileMode The Shader tiling mode
+ */
+ public RadialGradient(float centerX, float centerY, float radius,
+ @ColorInt int centerColor, @ColorInt int edgeColor, @NonNull TileMode tileMode) {
+ set(centerX, centerY, radius, centerColor, edgeColor, tileMode);
+ }
+
+ /**
+ * Reinitialize the shader.
+ *
+ * @param centerX The x-coordinate of the center of the radius
+ * @param centerY The y-coordinate of the center of the radius
+ * @param radius Must be positive. The radius of the circle for this gradient.
+ * @param colors The colors to be distributed between the center and edge of the circle
+ * @param stops May be <code>null</code>. Valid values are between <code>0.0f</code> and
+ * <code>1.0f</code>. The relative position of each corresponding color in
+ * the colors array. If <code>null</code>, colors are distributed evenly
+ * between the center and edge of the circle.
+ * @param tileMode The Shader tiling mode
+ */
+ public void set(float centerX, float centerY, float radius,
+ @NonNull @ColorInt int colors[], @Nullable float stops[], @NonNull TileMode tileMode) {
if (radius <= 0) {
throw new IllegalArgumentException("radius must be > 0");
}
@@ -62,29 +99,32 @@
if (stops != null && colors.length != stops.length) {
throw new IllegalArgumentException("color and position arrays must be of equal length");
}
+ discardNativeInstance();
mType = TYPE_COLORS_AND_POSITIONS;
mX = centerX;
mY = centerY;
mRadius = radius;
- mColors = colors;
- mPositions = stops;
+ mColors = colors.clone();
+ mPositions = stops != null ? stops.clone() : null;
mTileMode = tileMode;
- init(nativeCreate1(centerX, centerY, radius, colors, stops, tileMode.nativeInt));
}
- /** Create a shader that draws a radial gradient given the center and radius.
- @param centerX The x-coordinate of the center of the radius
- @param centerY The y-coordinate of the center of the radius
- @param radius Must be positive. The radius of the circle for this gradient
- @param centerColor The color at the center of the circle.
- @param edgeColor The color at the edge of the circle.
- @param tileMode The Shader tiling mode
- */
- public RadialGradient(float centerX, float centerY, float radius,
- int centerColor, int edgeColor, @NonNull TileMode tileMode) {
+ /**
+ * Reinitialize the shader.
+ *
+ * @param centerX The x-coordinate of the center of the radius
+ * @param centerY The y-coordinate of the center of the radius
+ * @param radius Must be positive. The radius of the circle for this gradient
+ * @param centerColor The color at the center of the circle.
+ * @param edgeColor The color at the edge of the circle.
+ * @param tileMode The Shader tiling mode
+ */
+ public void set(float centerX, float centerY, float radius,
+ @ColorInt int centerColor, @ColorInt int edgeColor, @NonNull TileMode tileMode) {
if (radius <= 0) {
throw new IllegalArgumentException("radius must be > 0");
}
+ discardNativeInstance();
mType = TYPE_COLOR_CENTER_AND_COLOR_EDGE;
mX = centerX;
mY = centerY;
@@ -92,7 +132,17 @@
mCenterColor = centerColor;
mEdgeColor = edgeColor;
mTileMode = tileMode;
- init(nativeCreate2(centerX, centerY, radius, centerColor, edgeColor, tileMode.nativeInt));
+ }
+
+ @Override
+ long createNativeInstance(long nativeMatrix) {
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ return nativeCreate1(nativeMatrix, mX, mY, mRadius,
+ mColors, mPositions, mTileMode.nativeInt);
+ } else { // TYPE_COLOR_CENTER_AND_COLOR_EDGE
+ return nativeCreate2(nativeMatrix, mX, mY, mRadius,
+ mCenterColor, mEdgeColor, mTileMode.nativeInt);
+ }
}
/**
@@ -101,25 +151,19 @@
@Override
protected Shader copy() {
final RadialGradient copy;
- switch (mType) {
- case TYPE_COLORS_AND_POSITIONS:
- copy = new RadialGradient(mX, mY, mRadius, mColors.clone(),
- mPositions != null ? mPositions.clone() : null, mTileMode);
- break;
- case TYPE_COLOR_CENTER_AND_COLOR_EDGE:
- copy = new RadialGradient(mX, mY, mRadius, mCenterColor, mEdgeColor, mTileMode);
- break;
- default:
- throw new IllegalArgumentException("RadialGradient should be created with either " +
- "colors and positions or center color and edge color");
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ copy = new RadialGradient(mX, mY, mRadius, mColors.clone(),
+ mPositions != null ? mPositions.clone() : null, mTileMode);
+ } else { // TYPE_COLOR_CENTER_AND_COLOR_EDGE
+ copy = new RadialGradient(mX, mY, mRadius, mCenterColor, mEdgeColor, mTileMode);
}
copyLocalMatrix(copy);
return copy;
}
- private static native long nativeCreate1(float x, float y, float radius,
+ private static native long nativeCreate1(long matrix, float x, float y, float radius,
int colors[], float positions[], int tileMode);
- private static native long nativeCreate2(float x, float y, float radius,
+ private static native long nativeCreate2(long matrix, float x, float y, float radius,
int color0, int color1, int tileMode);
}
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 94983b3..b584e0d 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -16,6 +16,9 @@
package android.graphics;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
/**
* Shader is the based class for objects that return horizontal spans of colors
* during drawing. A subclass of Shader is installed in a Paint calling
@@ -24,19 +27,20 @@
*/
public class Shader {
/**
- * This is set by subclasses, but don't make it public.
+ * @deprecated Use subclass constructors directly instead.
*/
- private long native_instance;
+ @Deprecated
+ public Shader() {}
/**
- * Initialization step that should be called by subclasses in their
- * constructors. Calling again may result in memory leaks.
- * @hide
+ * Current native shader instance. Created and updated lazily when {@link #getNativeInstance()}
+ * is called - otherwise may be out of date with java setters/properties.
*/
- protected void init(long ni) {
- native_instance = ni;
- }
+ private long mNativeInstance;
+ /**
+ * Current matrix - always set to null if local matrix is identity.
+ */
private Matrix mLocalMatrix;
public enum TileMode {
@@ -63,13 +67,13 @@
/**
* Return true if the shader has a non-identity local matrix.
- * @param localM If not null, it is set to the shader's local matrix.
+ * @param localM Set to the local matrix of the shader, if the shader's matrix is non-null.
* @return true if the shader has a non-identity local matrix
*/
- public boolean getLocalMatrix(Matrix localM) {
+ public boolean getLocalMatrix(@NonNull Matrix localM) {
if (mLocalMatrix != null) {
localM.set(mLocalMatrix);
- return !mLocalMatrix.isIdentity();
+ return true; // presence of mLocalMatrix means it's not identity
}
return false;
}
@@ -80,18 +84,46 @@
*
* @param localM The shader's new local matrix, or null to specify identity
*/
- public void setLocalMatrix(Matrix localM) {
- mLocalMatrix = localM;
- native_instance = nativeSetLocalMatrix(native_instance,
- localM == null ? 0 : localM.native_instance);
+ public void setLocalMatrix(@Nullable Matrix localM) {
+ if (localM == null || localM.isIdentity()) {
+ if (mLocalMatrix != null) {
+ mLocalMatrix = null;
+ discardNativeInstance();
+ }
+ } else {
+ if (mLocalMatrix == null) {
+ mLocalMatrix = new Matrix(localM);
+ discardNativeInstance();
+ } else if (!mLocalMatrix.equals(localM)) {
+ mLocalMatrix.set(localM);
+ discardNativeInstance();
+ }
+ }
}
+ long createNativeInstance(long nativeMatrix) {
+ return 0;
+ }
+
+ void discardNativeInstance() {
+ nativeSafeUnref(mNativeInstance);
+ mNativeInstance = 0;
+ }
+
+ /**
+ * Callback for subclasses to call {@link #discardNativeInstance()} if the most recently
+ * constructed native instance is no longer valid.
+ */
+ void verifyNativeInstance() {
+ }
+
+ @Override
protected void finalize() throws Throwable {
try {
- super.finalize();
+ nativeSafeUnref(mNativeInstance);
+ mNativeInstance = -1;
} finally {
- nativeDestructor(native_instance);
- native_instance = 0; // Other finalizers can still call us.
+ super.finalize();
}
}
@@ -108,22 +140,26 @@
* @hide
*/
protected void copyLocalMatrix(Shader dest) {
- if (mLocalMatrix != null) {
- final Matrix lm = new Matrix();
- getLocalMatrix(lm);
- dest.setLocalMatrix(lm);
- } else {
- dest.setLocalMatrix(null);
- }
+ dest.mLocalMatrix.set(mLocalMatrix);
}
/**
* @hide
*/
public long getNativeInstance() {
- return native_instance;
+ if (mNativeInstance == -1) {
+ throw new IllegalStateException("attempting to use a finalized Shader");
+ }
+
+ // verify mNativeInstance is valid
+ verifyNativeInstance();
+
+ if (mNativeInstance == 0) {
+ mNativeInstance = createNativeInstance(mLocalMatrix == null
+ ? 0 : mLocalMatrix.native_instance);
+ }
+ return mNativeInstance;
}
- private static native void nativeDestructor(long native_shader);
- private static native long nativeSetLocalMatrix(long native_shader, long matrix_instance);
+ private static native void nativeSafeUnref(long nativeInstance);
}
diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java
index 008891d..0a1aef6 100644
--- a/graphics/java/android/graphics/SweepGradient.java
+++ b/graphics/java/android/graphics/SweepGradient.java
@@ -16,6 +16,10 @@
package android.graphics;
+import android.annotation.ColorInt;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+
public class SweepGradient extends Shader {
private static final int TYPE_COLORS_AND_POSITIONS = 1;
@@ -35,7 +39,7 @@
private int mColor1;
/**
- * A subclass of Shader that draws a sweep gradient around a center point.
+ * A Shader that draws a sweep gradient around a center point.
*
* @param cx The x-coordinate of the center
* @param cy The y-coordinate of the center
@@ -49,37 +53,79 @@
* spaced evenly.
*/
public SweepGradient(float cx, float cy,
- int colors[], float positions[]) {
- if (colors.length < 2) {
- throw new IllegalArgumentException("needs >= 2 number of colors");
- }
- if (positions != null && colors.length != positions.length) {
- throw new IllegalArgumentException(
- "color and position arrays must be of equal length");
- }
- mType = TYPE_COLORS_AND_POSITIONS;
- mCx = cx;
- mCy = cy;
- mColors = colors;
- mPositions = positions;
- init(nativeCreate1(cx, cy, colors, positions));
+ @NonNull @ColorInt int colors[], @Nullable float positions[]) {
+ set(cx, cy, colors, positions);
}
/**
- * A subclass of Shader that draws a sweep gradient around a center point.
+ * A Shader that draws a sweep gradient around a center point.
*
* @param cx The x-coordinate of the center
* @param cy The y-coordinate of the center
* @param color0 The color to use at the start of the sweep
* @param color1 The color to use at the end of the sweep
*/
- public SweepGradient(float cx, float cy, int color0, int color1) {
+ public SweepGradient(float cx, float cy, @ColorInt int color0, @ColorInt int color1) {
+ set(cx, cy, color0, color1);
+ }
+
+ /**
+ * Reinitialize the shader.
+ *
+ * @param cx The x-coordinate of the center
+ * @param cy The y-coordinate of the center
+ * @param colors The colors to be distributed between around the center.
+ * There must be at least 2 colors in the array.
+ * @param positions May be NULL. The relative position of
+ * each corresponding color in the colors array, beginning
+ * with 0 and ending with 1.0. If the values are not
+ * monotonic, the drawing may produce unexpected results.
+ * If positions is NULL, then the colors are automatically
+ * spaced evenly.
+ */
+ public void set(float cx, float cy,
+ @NonNull @ColorInt int colors[], @Nullable float positions[]) {
+ if (colors.length < 2) {
+ throw new IllegalArgumentException("needs >= 2 number of colors");
+ }
+ if (positions != null && colors.length != positions.length) {
+ throw new IllegalArgumentException(
+ "color and position arrays must be of equal length");
+ }
+ discardNativeInstance();
+ mType = TYPE_COLORS_AND_POSITIONS;
+ mCx = cx;
+ mCy = cy;
+ mColors = colors.clone();
+ mPositions = positions != null ? positions.clone() : null;
+ }
+
+ /**
+ * Reinitialize the shader.
+ *
+ * @param cx The x-coordinate of the center
+ * @param cy The y-coordinate of the center
+ * @param color0 The color to use at the start of the sweep
+ * @param color1 The color to use at the end of the sweep
+ */
+ public void set(float cx, float cy, @ColorInt int color0, @ColorInt int color1) {
+ discardNativeInstance();
mType = TYPE_COLOR_START_AND_COLOR_END;
mCx = cx;
mCy = cy;
mColor0 = color0;
mColor1 = color1;
- init(nativeCreate2(cx, cy, color0, color1));
+ mColors = null;
+ mPositions = null;
+ }
+
+ @Override
+ long createNativeInstance(long nativeMatrix) {
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ return nativeCreate1(nativeMatrix, mCx, mCy, mColors, mPositions);
+ } else { // TYPE_COLOR_START_AND_COLOR_END
+ return nativeCreate2(nativeMatrix, mCx, mCy, mColor0, mColor1);
+ }
}
/**
@@ -88,23 +134,19 @@
@Override
protected Shader copy() {
final SweepGradient copy;
- switch (mType) {
- case TYPE_COLORS_AND_POSITIONS:
- copy = new SweepGradient(mCx, mCy, mColors.clone(),
- mPositions != null ? mPositions.clone() : null);
- break;
- case TYPE_COLOR_START_AND_COLOR_END:
- copy = new SweepGradient(mCx, mCy, mColor0, mColor1);
- break;
- default:
- throw new IllegalArgumentException("SweepGradient should be created with either " +
- "colors and positions or start color and end color");
+ if (mType == TYPE_COLORS_AND_POSITIONS) {
+ copy = new SweepGradient(mCx, mCy, mColors.clone(),
+ mPositions != null ? mPositions.clone() : null);
+ } else { // TYPE_COLOR_START_AND_COLOR_END
+ copy = new SweepGradient(mCx, mCy, mColor0, mColor1);
}
copyLocalMatrix(copy);
return copy;
}
- private static native long nativeCreate1(float x, float y, int colors[], float positions[]);
- private static native long nativeCreate2(float x, float y, int color0, int color1);
+ private static native long nativeCreate1(long matrix, float x, float y,
+ int colors[], float positions[]);
+ private static native long nativeCreate2(long matrix, float x, float y,
+ int color0, int color1);
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 8b30903..6de19cb 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -32,7 +32,6 @@
import android.util.LongSparseArray;
import android.util.LruCache;
import android.util.SparseArray;
-import android.graphics.FontListParser;
import com.android.internal.annotations.GuardedBy;
@@ -287,13 +286,11 @@
callback.onTypefaceRetrieved(cachedTypeface);
return;
}
- if (resultCode == FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND) {
- callback.onTypefaceRequestFailed(
- FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND);
+ if (resultCode != FontsContract.Columns.RESULT_CODE_OK) {
+ callback.onTypefaceRequestFailed(resultCode);
return;
}
- if (resultCode == FontsContract.RESULT_CODE_FONT_NOT_FOUND
- || resultData == null) {
+ if (resultData == null) {
callback.onTypefaceRequestFailed(
FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
return;
@@ -356,21 +353,37 @@
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
* provider was not found on the device.
*/
- int FAIL_REASON_PROVIDER_NOT_FOUND = 0;
+ int FAIL_REASON_PROVIDER_NOT_FOUND = FontsContract.RESULT_CODE_PROVIDER_NOT_FOUND;
+ /**
+ * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+ * provider must be authenticated and the given certificates do not match its signature.
+ */
+ int FAIL_REASON_WRONG_CERTIFICATES = FontsContract.RESULT_CODE_WRONG_CERTIFICATES;
/**
* Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
* returned by the provider was not loaded properly.
*/
- int FAIL_REASON_FONT_LOAD_ERROR = 1;
+ int FAIL_REASON_FONT_LOAD_ERROR = -3;
/**
- * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+ * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
* provider did not return any results for the given query.
*/
- int FAIL_REASON_FONT_NOT_FOUND = 2;
+ int FAIL_REASON_FONT_NOT_FOUND = FontsContract.Columns.RESULT_CODE_FONT_NOT_FOUND;
+ /**
+ * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the font
+ * provider found the queried font, but it is currently unavailable.
+ */
+ int FAIL_REASON_FONT_UNAVAILABLE = FontsContract.Columns.RESULT_CODE_FONT_UNAVAILABLE;
+ /**
+ * Constant returned by {@link #onTypefaceRequestFailed(int)} signaling that the given
+ * query was not supported by the provider.
+ */
+ int FAIL_REASON_MALFORMED_QUERY = FontsContract.Columns.RESULT_CODE_MALFORMED_QUERY;
/** @hide */
- @IntDef({FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
- FAIL_REASON_FONT_NOT_FOUND})
+ @IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
+ FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
+ FAIL_REASON_MALFORMED_QUERY })
@Retention(RetentionPolicy.SOURCE)
@interface FontRequestFailReason {}
@@ -386,8 +399,10 @@
* Called when a Typeface request done via {@link Typeface#create(FontRequest,
* FontRequestCallback)} fails.
* @param reason One of {@link #FAIL_REASON_PROVIDER_NOT_FOUND},
- * {@link #FAIL_REASON_FONT_NOT_FOUND} or
- * {@link #FAIL_REASON_FONT_LOAD_ERROR}.
+ * {@link #FAIL_REASON_FONT_NOT_FOUND},
+ * {@link #FAIL_REASON_FONT_LOAD_ERROR},
+ * {@link #FAIL_REASON_FONT_UNAVAILABLE} or
+ * {@link #FAIL_REASON_MALFORMED_QUERY}.
*/
void onTypefaceRequestFailed(@FontRequestFailReason int reason);
}
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index a24b970..6758607 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -545,7 +545,7 @@
mChangingConfigurations = orig.mChangingConfigurations;
mPaint = new Paint(orig.mPaint);
mThemeAttrs = orig.mThemeAttrs;
- if (mShape != null) {
+ if (orig.mShape != null) {
try {
mShape = orig.mShape.clone();
} catch (CloneNotSupportedException e) {
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 51a7d00..363aa83 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -73,39 +73,9 @@
// Canvas state operations: Replace Bitmap
// ----------------------------------------------------------------------------
-class ClipCopier : public SkCanvas::ClipVisitor {
-public:
- explicit ClipCopier(SkCanvas* dstCanvas) : m_dstCanvas(dstCanvas) {}
-
- virtual void clipRect(const SkRect& rect, SkClipOp op, bool antialias) {
- m_dstCanvas->clipRect(rect, op, antialias);
- }
- virtual void clipRRect(const SkRRect& rrect, SkClipOp op, bool antialias) {
- m_dstCanvas->clipRRect(rrect, op, antialias);
- }
- virtual void clipPath(const SkPath& path, SkClipOp op, bool antialias) {
- m_dstCanvas->clipPath(path, op, antialias);
- }
-
-private:
- SkCanvas* m_dstCanvas;
-};
-
void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
- SkCanvas* newCanvas = new SkCanvas(bitmap);
-
- if (!bitmap.isNull()) {
- // Copy the canvas matrix & clip state.
- newCanvas->setMatrix(mCanvas->getTotalMatrix());
-
- ClipCopier copier(newCanvas);
- mCanvas->replayClips(&copier);
- }
-
- // deletes the previously owned canvas (if any)
- mCanvasOwned = std::unique_ptr<SkCanvas>(newCanvas);
- mCanvas = newCanvas;
-
+ mCanvasOwned.reset(new SkCanvas(bitmap));
+ mCanvas = mCanvasOwned.get();
// clean up the old save stack
mSaveStack.reset(nullptr);
}
@@ -512,15 +482,7 @@
void SkiaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
if (CC_UNLIKELY(paint.nothingToDraw())) return;
- SkRect rect;
- SkRRect roundRect;
- if (path.isOval(&rect)) {
- mCanvas->drawOval(rect, paint);
- } else if (path.isRRect(&roundRect)) {
- mCanvas->drawRRect(roundRect, paint);
- } else {
- mCanvas->drawPath(path, paint);
- }
+ mCanvas->drawPath(path, paint);
}
void SkiaCanvas::drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount,
diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h
index c6fbe2bd5..e39614b 100644
--- a/libs/hwui/TreeInfo.h
+++ b/libs/hwui/TreeInfo.h
@@ -91,8 +91,6 @@
LayerUpdateQueue* layerUpdateQueue = nullptr;
ErrorHandler* errorHandler = nullptr;
- int32_t windowInsetLeft = 0;
- int32_t windowInsetTop = 0;
bool updateWindowPositions = false;
struct Out {
diff --git a/libs/hwui/tests/common/scenes/HwLayerSizeAnimation.cpp b/libs/hwui/tests/common/scenes/HwLayerSizeAnimation.cpp
new file mode 100644
index 0000000..d841132
--- /dev/null
+++ b/libs/hwui/tests/common/scenes/HwLayerSizeAnimation.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "TestSceneBase.h"
+
+class HwLayerSizeAnimation;
+
+static TestScene::Registrar _HwLayerSize(TestScene::Info{
+ "hwlayersize",
+ "A nested pair of nodes with LayerType::RenderLayer(hardware) set on the child and "
+ "LayerType::None on the parent. "
+ "Tests animating the size of a hardware layer.",
+ TestScene::simpleCreateScene<HwLayerSizeAnimation>
+});
+
+class HwLayerSizeAnimation : public TestScene {
+public:
+ sp<RenderNode> card;
+ void createContent(int width, int height, Canvas& canvas) override {
+ card = TestUtils::createNode(0, 0, 200, 200,
+ [](RenderProperties& props, Canvas& canvas) {
+ props.mutateLayerProperties().setType(LayerType::RenderLayer);
+ canvas.drawColor(0xFF0000FF, SkBlendMode::kSrcOver);
+ });
+ canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); // background
+ canvas.drawRenderNode(card.get());
+ }
+ void doFrame(int frameNr) override {
+ int curFrame = frameNr % 150;
+ //we animate left and top coordinates, which in turn animates width and
+ //height (bottom/right coordinates are fixed)
+ card->mutateStagingProperties().setLeftTop(curFrame, curFrame);
+ card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+ }
+};
diff --git a/libs/hwui/tests/unit/CanvasStateTests.cpp b/libs/hwui/tests/unit/CanvasStateTests.cpp
index 43974f6..c41313a 100644
--- a/libs/hwui/tests/unit/CanvasStateTests.cpp
+++ b/libs/hwui/tests/unit/CanvasStateTests.cpp
@@ -74,7 +74,7 @@
state.clipRect(10, 10, 200, 200, SkClipOp::kIntersect);
ASSERT_EQ(state.getRenderTargetClipBounds(), Rect(10, 10, 100, 100));
- state.clipRect(50, 50, 150, 150, SkClipOp::kReplace);
+ state.clipRect(50, 50, 150, 150, SkClipOp::kReplace_deprecated);
ASSERT_EQ(state.getRenderTargetClipBounds(), Rect(50, 50, 150, 150));
}
diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp
index a329980..bd798e8 100644
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp
@@ -506,19 +506,19 @@
sk_sp<Bitmap> bitmap(TestUtils::createBitmap(20, 20));
// left side clipped (to inset left half)
- canvas.clipRect(10, 0, 50, 100, SkClipOp::kReplace);
+ canvas.clipRect(10, 0, 50, 100, SkClipOp::kReplace_deprecated);
canvas.drawBitmap(*bitmap, 0, 40, nullptr);
// top side clipped (to inset top half)
- canvas.clipRect(0, 10, 100, 50, SkClipOp::kReplace);
+ canvas.clipRect(0, 10, 100, 50, SkClipOp::kReplace_deprecated);
canvas.drawBitmap(*bitmap, 40, 0, nullptr);
// right side clipped (to inset right half)
- canvas.clipRect(50, 0, 90, 100, SkClipOp::kReplace);
+ canvas.clipRect(50, 0, 90, 100, SkClipOp::kReplace_deprecated);
canvas.drawBitmap(*bitmap, 80, 40, nullptr);
// bottom not clipped, just abutting (inset bottom half)
- canvas.clipRect(0, 50, 100, 90, SkClipOp::kReplace);
+ canvas.clipRect(0, 50, 100, 90, SkClipOp::kReplace_deprecated);
canvas.drawBitmap(*bitmap, 40, 70, nullptr);
});
@@ -2308,7 +2308,7 @@
};
auto node = TestUtils::createNode<RecordingCanvas>(20, 20, 30, 30,
[](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace);
+ canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace_deprecated);
canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
});
diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
index b2ea9ac..d36bca0 100644
--- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp
+++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
@@ -476,7 +476,7 @@
OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_viewportCrop) {
auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
// shouldn't matter, since saveLayer will clip to its bounds
- canvas.clipRect(-1000, -1000, 1000, 1000, SkClipOp::kReplace);
+ canvas.clipRect(-1000, -1000, 1000, 1000, SkClipOp::kReplace_deprecated);
canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer);
canvas.drawRect(0, 0, 400, 400, SkPaint());
@@ -654,7 +654,7 @@
OPENGL_PIPELINE_TEST(RecordingCanvas, replaceClipIntersectWithRoot) {
auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(-10, -10, 110, 110, SkClipOp::kReplace);
+ canvas.clipRect(-10, -10, 110, 110, SkClipOp::kReplace_deprecated);
canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
canvas.restore();
});
diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
index 5bb0b6d..79429ec 100644
--- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp
+++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
@@ -331,7 +331,7 @@
std::vector<sp<RenderNode>> nodes;
nodes.push_back(TestUtils::createSkiaNode(20, 20, 30, 30,
[](RenderProperties& props, SkiaRecordingCanvas& canvas) {
- canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace);
+ canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace_deprecated);
canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
}));
diff --git a/libs/hwui/utils/TestWindowContext.cpp b/libs/hwui/utils/TestWindowContext.cpp
index ecad7be..492ca7fe 100644
--- a/libs/hwui/utils/TestWindowContext.cpp
+++ b/libs/hwui/utils/TestWindowContext.cpp
@@ -93,7 +93,7 @@
SkCanvas* prepareToDraw() {
//mCanvas->reset(mSize.width(), mSize.height());
- mCanvas->clipRect(0, 0, mSize.width(), mSize.height(), SkClipOp::kReplace);
+ mCanvas->clipRect(0, 0, mSize.width(), mSize.height(), SkClipOp::kReplace_deprecated);
return mCanvas->asSkCanvas();
}
diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java
index 1b75a78..73f912b 100644
--- a/media/java/android/media/AudioFocusRequest.java
+++ b/media/java/android/media/AudioFocusRequest.java
@@ -303,12 +303,12 @@
* by this {@code Builder}'s configuration methods.
* @return the {@code AudioFocusRequest} instance qualified by all the properties set
* on this {@code Builder}.
- * @throws IllegalArgumentException thrown when focus request is set to accept delayed
- * focus, or to pause on duck, but no focus change listener was set.
+ * @throws IllegalStateException thrown when attempting to build a focus request that is set
+ * to accept delayed focus, or to pause on duck, but no focus change listener was set.
*/
public AudioFocusRequest build() {
if ((mDelayedFocus || mPausesOnDuck) && (mFocusListener == null)) {
- throw new IllegalArgumentException(
+ throw new IllegalStateException(
"Can't use delayed focus or pause on duck without a listener");
}
final int flags = 0
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index dc69a69..f13ccc1 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2234,8 +2234,11 @@
* Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such
* as the playback of a song or a video.
* @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
+ * @deprecated use {@link #requestAudioFocus(AudioFocusRequest)}
*/
public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) {
+ PlayerBase.deprecateStreamTypeForPlayback(streamType,
+ "AudioManager", "requestAudioFocus()");
int status = AUDIOFOCUS_REQUEST_FAILED;
try {
@@ -2502,6 +2505,7 @@
* Abandon audio focus. Causes the previous focus owner, if any, to receive focus.
* @param l the listener with which focus was requested.
* @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
+ * @deprecated use {@link #abandonAudioFocusRequest(AudioFocusRequest)}
*/
public int abandonAudioFocus(OnAudioFocusChangeListener l) {
return abandonAudioFocus(l, null /*AudioAttributes, legacy behavior*/);
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 71f7790..0a61148 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -1938,6 +1938,9 @@
* not exist or thumbnail image is uncompressed.
*/
public boolean isThumbnailCompressed() {
+ if (!mHasThumbnail) {
+ return false;
+ }
if (mThumbnailCompression == DATA_JPEG || mThumbnailCompression == DATA_JPEG_COMPRESSED) {
return true;
}
@@ -2974,7 +2977,6 @@
}
} else {
// Thumbnail data may not contain Compression tag value
- mThumbnailCompression = DATA_JPEG;
handleThumbnailFromJfif(in, thumbnailData);
}
}
@@ -3009,6 +3011,8 @@
mHasThumbnail = true;
mThumbnailOffset = thumbnailOffset;
mThumbnailLength = thumbnailLength;
+ mThumbnailCompression = DATA_JPEG;
+
if (mFilename == null && mAssetInputStream == null
&& mSeekableFileDescriptor == null) {
// Save the thumbnail in memory if the input doesn't support reading again.
diff --git a/media/java/android/media/VolumeShaper.java b/media/java/android/media/VolumeShaper.java
index 796d6f3..af11e07 100644
--- a/media/java/android/media/VolumeShaper.java
+++ b/media/java/android/media/VolumeShaper.java
@@ -431,8 +431,8 @@
dest.writeDouble(mDurationMs);
// this needs to match the native Interpolator parceling
dest.writeInt(mInterpolatorType);
- dest.writeFloat(0.f); // first slope
- dest.writeFloat(0.f); // last slope
+ dest.writeFloat(0.f); // first slope (specifying for native side)
+ dest.writeFloat(0.f); // last slope (specifying for native side)
// mTimes and mVolumes should have the same length.
dest.writeInt(mTimes.length);
for (int i = 0; i < mTimes.length; ++i) {
@@ -456,8 +456,8 @@
final double durationMs = p.readDouble();
// this needs to match the native Interpolator parceling
final int interpolatorType = p.readInt();
- final float firstSlope = p.readFloat(); // ignored
- final float lastSlope = p.readFloat(); // ignored
+ final float firstSlope = p.readFloat(); // ignored on the Java side
+ final float lastSlope = p.readFloat(); // ignored on the Java side
final int length = p.readInt();
final float[] times = new float[length];
final float[] volumes = new float[length];
@@ -593,6 +593,10 @@
* {@code times[]} and {@code volumes[]} are two arrays representing points
* for the volume curve.
*
+ * Note that {@code times[]} and {@code volumes[]} are explicitly checked against
+ * null here to provide the proper error string - those are legitimate
+ * arguments to this method.
+ *
* @param times the x coordinates for the points,
* must be between 0.f and 1.f and be monotonic.
* @param volumes the y coordinates for the points,
@@ -644,10 +648,14 @@
}
private static void checkCurveForErrorsAndThrowException(
- @Nullable float[] times, @Nullable float[] volumes, boolean log) {
+ @Nullable float[] times, @Nullable float[] volumes, boolean log, boolean ise) {
final String error = checkCurveForErrors(times, volumes, log);
if (error != null) {
- throw new IllegalArgumentException(error);
+ if (ise) {
+ throw new IllegalStateException(error);
+ } else {
+ throw new IllegalArgumentException(error);
+ }
}
}
@@ -840,8 +848,8 @@
*/
public @NonNull Builder setCurve(@NonNull float[] times, @NonNull float[] volumes) {
- checkCurveForErrorsAndThrowException(
- times, volumes, (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0);
+ final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
+ checkCurveForErrorsAndThrowException(times, volumes, log, false /* ise */);
mTimes = times.clone();
mVolumes = volumes.clone();
return this;
@@ -853,11 +861,11 @@
* to the start.
*
* @return the same {@code Builder} instance.
- * @throws IllegalArgumentException if curve has not been set.
+ * @throws IllegalStateException if curve has not been set.
*/
public @NonNull Builder reflectTimes() {
- checkCurveForErrorsAndThrowException(
- mTimes, mVolumes, (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0);
+ final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
+ checkCurveForErrorsAndThrowException(mTimes, mVolumes, log, true /* ise */);
int i;
for (i = 0; i < mTimes.length / 2; ++i) {
float temp = mTimes[i];
@@ -878,11 +886,11 @@
* becomes the min volume and vice versa.
*
* @return the same {@code Builder} instance.
- * @throws IllegalArgumentException if curve has not been set.
+ * @throws IllegalStateException if curve has not been set.
*/
public @NonNull Builder invertVolumes() {
- checkCurveForErrorsAndThrowException(
- mTimes, mVolumes, (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0);
+ final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
+ checkCurveForErrorsAndThrowException(mTimes, mVolumes, log, true /* ise */);
float min = mVolumes[0];
float max = mVolumes[0];
for (int i = 1; i < mVolumes.length; ++i) {
@@ -908,12 +916,12 @@
*
* @param volume the target end volume to use.
* @return the same {@code Builder} instance.
- * @throws IllegalArgumentException if {@code volume}
- * is not valid or if curve has not been set.
+ * @throws IllegalArgumentException if {@code volume} is not valid.
+ * @throws IllegalStateException if curve has not been set.
*/
public @NonNull Builder scaleToEndVolume(float volume) {
final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
- checkCurveForErrorsAndThrowException(mTimes, mVolumes, log);
+ checkCurveForErrorsAndThrowException(mTimes, mVolumes, log, true /* ise */);
checkValidVolumeAndThrowException(volume, log);
final float startVolume = mVolumes[0];
final float endVolume = mVolumes[mVolumes.length - 1];
@@ -942,12 +950,12 @@
*
* @param volume the target start volume to use.
* @return the same {@code Builder} instance.
- * @throws IllegalArgumentException if {@code volume}
- * is not valid or if curve has not been set.
+ * @throws IllegalArgumentException if {@code volume} is not valid.
+ * @throws IllegalStateException if curve has not been set.
*/
public @NonNull Builder scaleToStartVolume(float volume) {
final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
- checkCurveForErrorsAndThrowException(mTimes, mVolumes, log);
+ checkCurveForErrorsAndThrowException(mTimes, mVolumes, log, true /* ise */);
checkValidVolumeAndThrowException(volume, log);
final float startVolume = mVolumes[0];
final float endVolume = mVolumes[mVolumes.length - 1];
@@ -971,11 +979,11 @@
* Builds a new {@link VolumeShaper} object.
*
* @return a new {@link VolumeShaper} object.
- * @throws IllegalArgumentException if curve is not properly set.
+ * @throws IllegalStateException if curve is not properly set.
*/
public @NonNull Configuration build() {
- checkCurveForErrorsAndThrowException(
- mTimes, mVolumes, (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0);
+ final boolean log = (mOptionFlags & OPTION_FLAG_VOLUME_IN_DBFS) != 0;
+ checkCurveForErrorsAndThrowException(mTimes, mVolumes, log, true /* ise */);
return new Configuration(mType, mId, mOptionFlags, mDurationMs,
mInterpolatorType, mTimes, mVolumes);
}
diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index 81db37e..7122eaf 100644
--- a/media/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
@@ -471,6 +471,7 @@
* @param extras The bundle of service-specific arguments to send to the media browser
* service. The contents of this bundle may affect the search result.
* @param callback The callback to receive the search result.
+ * @throws IllegalStateException if the browser is not connected to the media browser service.
*/
public void search(@NonNull final String query, final Bundle extras, SearchCallback callback) {
if (TextUtils.isEmpty(query)) {
@@ -480,14 +481,8 @@
throw new IllegalArgumentException("callback cannot be null.");
}
if (mState != CONNECT_STATE_CONNECTED) {
- Log.i(TAG, "Not connected, unable to search.");
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- callback.onError(query, extras);
- }
- });
- return;
+ throw new IllegalStateException("search() called while not connected (state="
+ + getStateLabel(mState) + ")");
}
ResultReceiver receiver = new ResultReceiver(mHandler) {
@Override
diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java
index 4b43260..f7dd0b3 100644
--- a/media/java/android/media/midi/MidiDevice.java
+++ b/media/java/android/media/midi/MidiDevice.java
@@ -30,6 +30,8 @@
import java.io.FileDescriptor;
import java.io.IOException;
+import java.util.HashSet;
+
/**
* This class is used for sending and receiving data to and from a MIDI device
* Instances of this class are created by {@link MidiManager#openDevice}.
@@ -47,7 +49,18 @@
private final IBinder mClientToken;
private final IBinder mDeviceToken;
private boolean mIsDeviceClosed;
- private boolean mIsMirroredToNative;
+
+ // Native API Helpers
+ /**
+ * Keep a static list of MidiDevice objects that are mirrorToNative()'d so they
+ * don't get inadvertantly garbage collected.
+ */
+ private static HashSet<MidiDevice> mMirroredDevices = new HashSet<MidiDevice>();
+
+ /**
+ * If this device is mirrorToNatived(), this is the native device handler.
+ */
+ private long mNativeHandle;
private final CloseGuard mGuard = CloseGuard.get();
@@ -218,34 +231,39 @@
* Makes Midi Device available to the Native API
* @hide
*/
- public void mirrorToNative() throws IOException {
- if (mIsDeviceClosed || mIsMirroredToNative) {
- return;
+ public long mirrorToNative() throws IOException {
+ if (mIsDeviceClosed || mNativeHandle != 0) {
+ return 0;
}
- int result = mirrorToNative(mDeviceServer.asBinder(), mDeviceInfo.getId());
- if (result != 0) {
- throw new IOException("Failed mirroring to native: " + result);
+ mNativeHandle = native_mirrorToNative(mDeviceServer.asBinder(), mDeviceInfo.getId());
+ if (mNativeHandle == 0) {
+ throw new IOException("Failed mirroring to native");
}
- mIsMirroredToNative = true;
+ synchronized (mMirroredDevices) {
+ mMirroredDevices.add(this);
+ }
+ return mNativeHandle;
}
/**
* Makes Midi Device no longer available to the Native API
* @hide
*/
- public void removeFromNative() throws IOException {
- if (!mIsMirroredToNative) {
+ public void removeFromNative() {
+ if (mNativeHandle == 0) {
return;
}
- int result = removeFromNative(mDeviceInfo.getId());
- if (result != 0) {
- throw new IOException("Failed removing from native: " + result);
+ synchronized (mGuard) {
+ native_removeFromNative(mNativeHandle);
+ mNativeHandle = 0;
}
- mIsMirroredToNative = false;
+ synchronized (mMirroredDevices) {
+ mMirroredDevices.remove(this);
+ }
}
@Override
@@ -279,6 +297,6 @@
return ("MidiDevice: " + mDeviceInfo.toString());
}
- private native int mirrorToNative(IBinder deviceServerBinder, int uid);
- private native int removeFromNative(int uid);
+ private native long native_mirrorToNative(IBinder deviceServerBinder, int id);
+ private native void native_removeFromNative(long deviceHandle);
}
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 6f44e6d..e51025f 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -994,7 +994,9 @@
*
* <p>The current position for time shifting is the same as the current position of
* playback. It should be equal to or greater than the start position reported by
- * {@link #onTimeShiftGetStartPosition()}.
+ * {@link #onTimeShiftGetStartPosition()}. When playback is completed, the current position
+ * should stay where the playback ends, in other words, the returned value of this mehtod
+ * should be equal to the start position plus the duration of the program.
*
* @see #onTimeShiftPlay(Uri)
* @see #onTimeShiftResume()
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index aee9d38e..e5af357 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -776,8 +776,8 @@
mSurface = null;
mSurfaceView = new SurfaceView(getContext(), mAttrs, mDefStyleAttr) {
@Override
- protected void updateWindow() {
- super.updateWindow();
+ protected void updateSurface() {
+ super.updateSurface();
relayoutSessionOverlayView();
}};
// The surface view's content should be treated as secure all the time.
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index b00f5a5..f5e19f9 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -722,6 +722,9 @@
LockedImage lockedImg = LockedImage();
Image_getLockedImage(env, thiz, &lockedImg);
+ if (env->ExceptionCheck()) {
+ return NULL;
+ }
// Create all SurfacePlanes
for (int i = 0; i < numPlanes; i++) {
Image_getLockedImageInfo(env, &lockedImg, i, halReaderFormat,
diff --git a/media/jni/midi/android_media_midi_MidiDevice.cpp b/media/jni/midi/android_media_midi_MidiDevice.cpp
index 1e54bac..3743e4a 100644
--- a/media/jni/midi/android_media_midi_MidiDevice.cpp
+++ b/media/jni/midi/android_media_midi_MidiDevice.cpp
@@ -18,32 +18,33 @@
#define LOG_TAG "Midi-JNI"
#include <android_util_Binder.h>
-#include <midi/MidiDeviceRegistry.h>
+#include <midi/midi_internal.h>
#include <nativehelper/jni.h>
#include <utils/Log.h>
using namespace android;
using namespace android::media::midi;
-extern "C" jint Java_android_media_midi_MidiDevice_mirrorToNative(
- JNIEnv *env, jobject thiz, jobject midiDeviceServer, jint id)
+extern "C" jlong Java_android_media_midi_MidiDevice_native_1mirrorToNative(
+ JNIEnv *env, jobject, jobject midiDeviceServer, jint id)
{
- (void)thiz;
+ // ALOGI("native_mirrorToNative(%p)...", midiDeviceServer);
sp<IBinder> serverBinder = ibinderForJavaObject(env, midiDeviceServer);
if (serverBinder.get() == NULL) {
ALOGE("Could not obtain IBinder from passed jobject");
return -EINVAL;
}
- // return MidiDeviceManager::getInstance().addDevice(serverBinder, uid);
- return MidiDeviceRegistry::getInstance().addDevice(
- new BpMidiDeviceServer(serverBinder), id);
+
+ AMIDI_Device* devicePtr = new AMIDI_Device;
+ devicePtr->server = new BpMidiDeviceServer(serverBinder);
+ devicePtr->deviceId = id;
+
+ return (jlong)devicePtr;
}
-extern "C" jint Java_android_media_midi_MidiDevice_removeFromNative(
- JNIEnv *env, jobject thiz, jint uid)
+extern "C" void Java_android_media_midi_MidiDevice_native_removeFromNative(
+ JNIEnv *, jobject , jlong nativeToken)
{
- (void)env;
- (void)thiz;
- // return MidiDeviceManager::getInstance().removeDevice(uid);
- return MidiDeviceRegistry::getInstance().removeDevice(uid);
+ AMIDI_Device* devicePtr = (AMIDI_Device*)nativeToken;
+ delete devicePtr;
}
diff --git a/media/native/midi/Android.mk b/media/native/midi/Android.mk
index b91c430..dbc5eed 100644
--- a/media/native/midi/Android.mk
+++ b/media/native/midi/Android.mk
@@ -4,9 +4,7 @@
LOCAL_SRC_FILES := \
../../java/android/media/midi/IMidiDeviceServer.aidl \
- midi.cpp \
- MidiDeviceRegistry.cpp \
- MidiPortRegistry.cpp
+ midi.cpp
LOCAL_AIDL_INCLUDES := \
$(FRAMEWORKS_BASE_JAVA_SRC_DIRS) \
diff --git a/media/native/midi/MidiDeviceRegistry.cpp b/media/native/midi/MidiDeviceRegistry.cpp
deleted file mode 100644
index 8854a08..0000000
--- a/media/native/midi/MidiDeviceRegistry.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MidiDeviceRegistry.h"
-
-namespace android {
-
-ANDROID_SINGLETON_STATIC_INSTANCE(media::midi::MidiDeviceRegistry);
-
-namespace media {
-namespace midi {
-
-MidiDeviceRegistry::MidiDeviceRegistry() : mNextDeviceToken(1) {
-}
-
-status_t MidiDeviceRegistry::addDevice(sp<BpMidiDeviceServer> server, int32_t deviceId) {
- if (server.get() == nullptr) {
- return -EINVAL;
- }
-
- std::lock_guard<std::mutex> guard(mMapsLock);
- mServers[deviceId] = server;
- return OK;
-}
-
-status_t MidiDeviceRegistry::removeDevice(int32_t deviceId) {
- std::lock_guard<std::mutex> guard(mMapsLock);
- mServers.erase(deviceId);
- const auto& iter = mUidToToken.find(deviceId);
- if (iter != mUidToToken.end()) {
- mTokenToUid.erase(iter->second);
- mUidToToken.erase(iter);
- }
- return OK;
-}
-
-//NOTE: This creates an entry if not found, or returns an existing one.
-status_t MidiDeviceRegistry::obtainDeviceToken(int32_t deviceId, AMIDI_Device *deviceTokenPtr) {
- std::lock_guard<std::mutex> guard(mMapsLock);
- const auto& serversIter = mServers.find(deviceId);
- if (serversIter == mServers.end()) {
- // Not found.
- return -EINVAL;
- }
-
- const auto& iter = mUidToToken.find(deviceId);
- if (iter != mUidToToken.end()) {
- *deviceTokenPtr = iter->second;
- } else {
- *deviceTokenPtr = mNextDeviceToken++;
- mTokenToUid[*deviceTokenPtr] = deviceId;
- mUidToToken[deviceId] = *deviceTokenPtr;
- }
- return OK;
-}
-
-status_t MidiDeviceRegistry::releaseDevice(AMIDI_Device deviceToken) {
- std::lock_guard<std::mutex> guard(mMapsLock);
- const auto& iter = mTokenToUid.find(deviceToken);
- if (iter == mTokenToUid.end()) {
- // Not found
- return -EINVAL;
- }
-
- mServers.erase(iter->second);
- mUidToToken.erase(iter->second);
- mTokenToUid.erase(iter);
- return OK;
-}
-
-status_t MidiDeviceRegistry::getDeviceByToken(
- AMIDI_Device deviceToken, sp<BpMidiDeviceServer> *devicePtr) {
- std::lock_guard<std::mutex> guard(mMapsLock);
- int32_t id = -1;
- {
- const auto& iter = mTokenToUid.find(deviceToken);
- if (iter == mTokenToUid.end()) {
- return -EINVAL;
- }
- id = iter->second;
- }
- const auto& iter = mServers.find(id);
- if (iter == mServers.end()) {
- return -EINVAL;
- }
-
- *devicePtr = iter->second;
- return OK;
-}
-
-} // namespace midi
-} // namespace media
-} // namespace android
diff --git a/media/native/midi/MidiDeviceRegistry.h b/media/native/midi/MidiDeviceRegistry.h
deleted file mode 100644
index 93be733..0000000
--- a/media/native/midi/MidiDeviceRegistry.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_MEDIA_MIDI_DEVICE_REGISTRY_H_
-#define ANDROID_MEDIA_MIDI_DEVICE_REGISTRY_H_
-
-#include <map>
-#include <mutex>
-
-#include <binder/IBinder.h>
-#include <utils/Errors.h>
-#include <utils/Singleton.h>
-
-#include "android/media/midi/BpMidiDeviceServer.h"
-#include "midi.h"
-
-namespace android {
-namespace media {
-namespace midi {
-
-/*
- * Maintains a thread-safe, (singleton) list of MIDI devices with associated Binder interfaces,
- * which are exposed to the Native API via (Java) MidiDevice.mirrorToNative() &
- * MidiDevice.removeFromNative().
- * (Called via MidiDeviceManager::addDevice() MidiManager::removeDevice()).
- */
-class MidiDeviceRegistry : public Singleton<MidiDeviceRegistry> {
- public:
- /* Add a MIDI Device to the registry.
- *
- * server The Binder interface to the MIDI device server.
- * deviceUId The unique ID of the device obtained from
- * the Java API via MidiDeviceInfo.getId().
- */
- status_t addDevice(sp<BpMidiDeviceServer> server, int32_t deviceId);
-
- /* Remove the device (and associated server) from the Device registry.
- *
- * deviceUid The ID of the device which was used in the call to addDevice().
- */
- status_t removeDevice(int32_t deviceId);
-
- /* Gets a device token associated with the device ID. This is used by the
- * native API to identify/access the device.
- * Multiple calls without releasing the token will return the same value.
- *
- * deviceUid The ID of the device.
- * deviceTokenPtr Receives the device (native) token associated with the device ID.
- * returns: OK on success, error code otherwise.
- */
- status_t obtainDeviceToken(int32_t deviceId, AMIDI_Device *deviceTokenPtr);
-
- /*
- * Releases the native API device token associated with a MIDI device.
- *
- * deviceToken The device (native) token associated with the device ID.
- */
- status_t releaseDevice(AMIDI_Device deviceToken);
-
- /*
- * Gets the Device server binder interface associated with the device token.
- *
- * deviceToken The device (native) token associated with the device ID.
- */
- status_t getDeviceByToken(AMIDI_Device deviceToken, sp<BpMidiDeviceServer> *devicePtr);
-
- private:
- friend class Singleton<MidiDeviceRegistry>;
- MidiDeviceRegistry();
-
- // Access Mutex
- std::mutex mMapsLock;
-
- // maps device IDs to servers
- std::map<int32_t, sp<BpMidiDeviceServer>> mServers;
-
- // maps device tokens to device ID
- std::map<AMIDI_Device, int32_t> mTokenToUid;
-
- // maps device IDs to device tokens
- std::map<int32_t, AMIDI_Device> mUidToToken;
-
- // Value of next device token to dole out.
- AMIDI_Device mNextDeviceToken;
-};
-
-} // namespace midi
-} // namespace media
-} // namespace android
-
-#endif // ANDROID_MEDIA_MIDI_DEVICE_REGISTRY_H_
diff --git a/media/native/midi/MidiPortRegistry.cpp b/media/native/midi/MidiPortRegistry.cpp
deleted file mode 100644
index fa70af8..0000000
--- a/media/native/midi/MidiPortRegistry.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MidiPortRegistry.h"
-
-namespace android {
-
-ANDROID_SINGLETON_STATIC_INSTANCE(media::midi::MidiPortRegistry);
-
-namespace media {
-namespace midi {
-
-//TODO Note that these 2 are identical
-struct MidiPortRegistry::OutputPort {
- AMIDI_Device device;
- sp<IBinder> binderToken;
- base::unique_fd ufd;
-};
-
-struct MidiPortRegistry::InputPort {
- AMIDI_Device device;
- sp<IBinder> binderToken;
- base::unique_fd ufd;
-};
-
-MidiPortRegistry::MidiPortRegistry() : mNextOutputPortToken(0), mNextInputPortToken(0) {
-}
-
-status_t MidiPortRegistry::addOutputPort(
- AMIDI_Device device,
- sp<IBinder> portToken,
- base::unique_fd &&ufd,
- AMIDI_OutputPort *portPtr) {
- *portPtr = mNextOutputPortToken++;
-
- OutputPortEntry* portEntry = new OutputPortEntry;
- portEntry->port = new OutputPort;
- portEntry->state = MIDI_OUTPUT_PORT_STATE_OPEN_IDLE;
- portEntry->port = new OutputPort;
- portEntry->port->device = device;
- portEntry->port->binderToken = portToken;
- portEntry->port->ufd = std::move(ufd);
-
- mOutputPortMap[*portPtr] = portEntry;
-
- return OK;
-}
-
-status_t MidiPortRegistry::removeOutputPort(
- AMIDI_OutputPort port,
- AMIDI_Device *devicePtr,
- sp<IBinder> *portTokenPtr) {
- OutputPortMap::iterator itr = mOutputPortMap.find(port);
- if (itr == mOutputPortMap.end()) {
- return -EINVAL;
- }
-
- OutputPortEntry *entry = mOutputPortMap[port];
- int portState = MIDI_OUTPUT_PORT_STATE_OPEN_IDLE;
- while (!entry->state.compare_exchange_weak(portState, MIDI_OUTPUT_PORT_STATE_CLOSED)) {
- if (portState == MIDI_OUTPUT_PORT_STATE_CLOSED) {
- return -EINVAL; // Already closed
- }
- }
- *devicePtr = entry->port->device;
- *portTokenPtr = entry->port->binderToken;
- delete entry->port;
- entry->port = nullptr;
-
- mOutputPortMap.erase(itr);
-
- return OK;
-}
-
-status_t MidiPortRegistry::getOutputPortFdAndLock(
- AMIDI_OutputPort port, base::unique_fd **ufdPtr) {
- if (mOutputPortMap.find(port) == mOutputPortMap.end()) {
- return -EINVAL;
- }
-
- OutputPortEntry *entry = mOutputPortMap[port];
- int portState = MIDI_OUTPUT_PORT_STATE_OPEN_IDLE;
- if (!entry->state.compare_exchange_strong(portState, MIDI_OUTPUT_PORT_STATE_OPEN_ACTIVE)) {
- // The port has been closed.
- return -EPIPE;
- }
- *ufdPtr = &entry->port->ufd;
-
- return OK;
-}
-
-status_t MidiPortRegistry::unlockOutputPort(AMIDI_OutputPort port) {
- if (mOutputPortMap.find(port) == mOutputPortMap.end()) {
- return -EINVAL;
- }
-
- OutputPortEntry *entry = mOutputPortMap[port];
- entry->state.store(MIDI_OUTPUT_PORT_STATE_OPEN_IDLE);
- return OK;
-}
-
-status_t MidiPortRegistry::addInputPort(
- AMIDI_Device device,
- sp<IBinder> portToken,
- base::unique_fd &&ufd,
- AMIDI_InputPort *portPtr) {
- *portPtr = mNextInputPortToken++;
-
- InputPortEntry *entry = new InputPortEntry;
-
- entry->state = MIDI_INPUT_PORT_STATE_OPEN_IDLE;
- entry->port = new InputPort;
- entry->port->device = device;
- entry->port->binderToken = portToken;
- entry->port->ufd = std::move(ufd);
-
- mInputPortMap[*portPtr] = entry;
-
- return OK;
-}
-
-status_t MidiPortRegistry::removeInputPort(
- AMIDI_InputPort port,
- AMIDI_Device *devicePtr,
- sp<IBinder> *portTokenPtr) {
- InputPortMap::iterator itr = mInputPortMap.find(port);
- if (itr == mInputPortMap.end()) {
- return -EINVAL;
- }
-
- InputPortEntry *entry = mInputPortMap[port];
- int portState = MIDI_INPUT_PORT_STATE_OPEN_IDLE;
- while (!entry->state.compare_exchange_weak(portState, MIDI_INPUT_PORT_STATE_CLOSED)) {
- if (portState == MIDI_INPUT_PORT_STATE_CLOSED) return -EINVAL; // Already closed
- }
-
- *devicePtr = entry->port->device;
- *portTokenPtr = entry->port->binderToken;
- delete entry->port;
- entry->port = nullptr;
-
- mInputPortMap.erase(itr);
-
- return OK;
-}
-
-status_t MidiPortRegistry::getInputPortFd(AMIDI_InputPort port, base::unique_fd **ufdPtr) {
- if (mInputPortMap.find(port) == mInputPortMap.end()) {
- return -EINVAL;
- }
-
- InputPortEntry *entry = mInputPortMap[port];
-
- *ufdPtr = &entry->port->ufd;
-
- return OK;
-}
-
-status_t MidiPortRegistry::getInputPortFdAndLock(AMIDI_InputPort port, base::unique_fd **ufdPtr) {
- if (mInputPortMap.find(port) == mInputPortMap.end()) {
- return -EINVAL;
- }
-
- InputPortEntry *entry = mInputPortMap[port];
-
- int portState = MIDI_INPUT_PORT_STATE_OPEN_IDLE;
- if (!entry->state.compare_exchange_strong(portState, MIDI_INPUT_PORT_STATE_OPEN_ACTIVE)) {
- // The port has been closed.
- return -EPIPE;
- }
- *ufdPtr = &entry->port->ufd;
- return OK;
-}
-
-status_t MidiPortRegistry::MidiPortRegistry::unlockInputPort(AMIDI_InputPort port) {
- if (mInputPortMap.find(port) == mInputPortMap.end()) {
- return -EINVAL;
- }
-
- InputPortEntry *entry = mInputPortMap[port];
- entry->state.store(MIDI_INPUT_PORT_STATE_OPEN_IDLE);
- return OK;
-}
-
-} // namespace midi
-} // namespace media
-} // namespace android
diff --git a/media/native/midi/MidiPortRegistry.h b/media/native/midi/MidiPortRegistry.h
deleted file mode 100644
index f1ffb78..0000000
--- a/media/native/midi/MidiPortRegistry.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_MEDIA_MIDI_PORT_REGISTRY_H_
-#define ANDROID_MEDIA_MIDI_PORT_REGISTRY_H_
-
-#include <atomic>
-#include <map>
-
-#include <android-base/unique_fd.h>
-#include <binder/IBinder.h>
-#include <utils/Errors.h>
-#include <utils/Singleton.h>
-
-#include "midi.h"
-
-namespace android {
-namespace media {
-namespace midi {
-
-/*
- * Maintains lists of all active input and output MIDI ports and controls access to them. Provides
- * exclusive access to specific MIDI ports.
- */
-class MidiPortRegistry : public Singleton<MidiPortRegistry> {
- public:
- /*
- * Creates an output port entry and associates it with the specified MIDI device.
- * Called by AMIDI_openOutputPort();
- *
- * device The native API device ID.
- * portToken The port token (returned from the device server).
- * udf File descriptor for the data port associated with the MIDI output port.
- * portPtr Receives the native API port ID of the port being opened.
- */
- status_t addOutputPort(
- AMIDI_Device device,
- sp<IBinder> portToken,
- base::unique_fd &&ufd,
- AMIDI_OutputPort *portPtr);
-
- /*
- * Removes for the output port list a previously added output port.
- * Called by AMIDI_closeOutputPort();
- *
- * port The native API port ID of the port being closed.
- * devicePtr Receives the native API device ID associated with the port.
- * portTokenPtr Receives the binder token associated with the port.
- */
- status_t removeOutputPort(
- AMIDI_OutputPort port,
- AMIDI_Device *devicePtr,
- sp<IBinder> *portTokenPtr);
-
- /*
- * Creates an input port entry and associates it with the specified MIDI device.
- * Called by AMIDI_openInputPort();
- *
- * device The native API device ID.
- * portToken The port token (returned from the device server).
- * udf File descriptor for the data port associated with the MIDI input port.
- * portPtr Receives the native API port ID of the port being opened.
- */
- status_t addInputPort(
- AMIDI_Device device,
- sp<IBinder> portToken,
- base::unique_fd &&ufd,
- AMIDI_InputPort *portPtr);
-
- /*
- * Removes for the input port list a previously added input port.
- * Called by AMIDI_closeINputPort();
- *
- * port The native API port ID of the port being closed.
- * devicePtr Receives the native API device ID associated with the port.
- * portTokenPtr Receives the binder token associated with the port.
- */
- status_t removeInputPort(
- AMIDI_InputPort port,
- AMIDI_Device *devicePtr,
- sp<IBinder> *portTokenPtr);
-
- /*
- * Retrieves an exclusive-access file descriptor for an output port.
- * Called from AMIDI_receive().
- *
- * port The native API id of the output port.
- * ufdPtr Receives the exclusive-access file descriptor for the output port.
- */
- status_t getOutputPortFdAndLock(AMIDI_OutputPort port, base::unique_fd **ufdPtr);
-
- /*
- * Releases exclusive-access to the port and invalidates the previously received file
- * descriptor.
- * Called from AMIDI_receive().
- *
- * port The native API id of the output port.
- */
- status_t unlockOutputPort(AMIDI_OutputPort port);
-
- /*
- * Retrieves an exclusive-access file descriptor for an input port.
- * (Not being used as (perhaps) AMIDI_sendWithTimestamp() doesn't need exclusive access
- * to the port).
- *
- * port The native API id of the input port.
- * ufdPtr Receives the exclusive-access file descriptor for the input port.
- */
- status_t getInputPortFdAndLock(AMIDI_InputPort port, base::unique_fd **ufdPtr);
-
- /*
- * Releases exclusive-access to the port and invalidates the previously received file
- * descriptor.
- * (Not used. See above).
- *
- * port The native API id of the input port.
- */
- status_t unlockInputPort(AMIDI_InputPort port);
-
- /*
- * Retrieves an unlocked (multi-access) file descriptor for an input port.
- * Used by AMIDI_sendWith(), AMIDI_sendWithTimestamp & AMIDI_flush.
- *
- * port The native API id of the input port.
- * ufdPtr Receives the multi-access file descriptor for the input port.
- */
- status_t getInputPortFd(AMIDI_InputPort port, base::unique_fd **ufdPtr);
-
- private:
- friend class Singleton<MidiPortRegistry>;
- MidiPortRegistry();
-
- /*
- * Output (data receiving) ports.
- */
- struct OutputPort;
- enum {
- MIDI_OUTPUT_PORT_STATE_CLOSED = 0,
- MIDI_OUTPUT_PORT_STATE_OPEN_IDLE,
- MIDI_OUTPUT_PORT_STATE_OPEN_ACTIVE
- };
-
- struct OutputPortEntry {
- std::atomic_int state;
- OutputPort *port;
- };
-
- typedef std::map<AMIDI_OutputPort, OutputPortEntry*> OutputPortMap;
- // Access is synchronized per record via 'state' field.
- std::atomic<AMIDI_OutputPort> mNextOutputPortToken;
- OutputPortMap mOutputPortMap;
-
- /*
- * Input (data sending) ports.
- */
- struct InputPort;
- enum {
- MIDI_INPUT_PORT_STATE_CLOSED = 0,
- MIDI_INPUT_PORT_STATE_OPEN_IDLE,
- MIDI_INPUT_PORT_STATE_OPEN_ACTIVE
- };
-
- struct InputPortEntry {
- std::atomic_int state;
- InputPort *port;
- };
-
- typedef std::map<AMIDI_OutputPort, InputPortEntry*> InputPortMap;
- // Access is synchronized per record via 'state' field.
- std::atomic<AMIDI_InputPort> mNextInputPortToken;
- InputPortMap mInputPortMap;
-
-};
-
-} // namespace midi
-} // namespace media
-} // namespace android
-
-#endif // ANDROID_MEDIA_MIDI_PORT_REGISTRY_H_
diff --git a/media/native/midi/midi.cpp b/media/native/midi/midi.cpp
index 1bf0bd0..17b92da3 100644
--- a/media/native/midi/midi.cpp
+++ b/media/native/midi/midi.cpp
@@ -25,10 +25,9 @@
#include "android/media/midi/BpMidiDeviceServer.h"
#include "media/MidiDeviceInfo.h"
-#include "MidiDeviceRegistry.h"
-#include "MidiPortRegistry.h"
#include "midi.h"
+#include "midi_internal.h"
using android::IBinder;
using android::BBinder;
@@ -37,13 +36,28 @@
using android::status_t;
using android::base::unique_fd;
using android::binder::Status;
-using android::media::midi::BpMidiDeviceServer;
using android::media::midi::MidiDeviceInfo;
-using android::media::midi::MidiDeviceRegistry;
-using android::media::midi::MidiPortRegistry;
+
+struct AMIDI_Port {
+ std::atomic_int state;
+ AMIDI_Device *device;
+ sp<IBinder> binderToken;
+ unique_fd ufd;
+};
#define SIZE_MIDIRECEIVEBUFFER AMIDI_BUFFER_SIZE
+enum {
+ MIDI_PORT_STATE_CLOSED = 0,
+ MIDI_PORT_STATE_OPEN_IDLE,
+ MIDI_PORT_STATE_OPEN_ACTIVE
+};
+
+enum {
+ PORTTYPE_OUTPUT = 0,
+ PORTTYPE_INPUT = 1
+};
+
/* TRANSFER PACKET FORMAT (as defined in MidiPortImpl.java)
*
* Transfer packet format is as follows (see MidiOutputPort.mThread.run() to see decomposition):
@@ -63,20 +77,12 @@
* So 'read()' always returns a whole message.
*/
-status_t AMIDI_getDeviceById(int32_t id, AMIDI_Device *devicePtr) {
- return MidiDeviceRegistry::getInstance().obtainDeviceToken(id, devicePtr);
-}
-
-status_t AMIDI_getDeviceInfo(AMIDI_Device device, AMIDI_DeviceInfo *deviceInfoPtr) {
- sp<BpMidiDeviceServer> deviceServer;
- status_t result = MidiDeviceRegistry::getInstance().getDeviceByToken(device, &deviceServer);
- if (result != OK) {
- ALOGE("AMIDI_getDeviceInfo bad device token %d: %d", device, result);
- return result;
- }
-
+/*
+ * Device Functions
+ */
+status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr) {
MidiDeviceInfo deviceInfo;
- Status txResult = deviceServer->getDeviceInfo(&deviceInfo);
+ Status txResult = device->server->getDeviceInfo(&deviceInfo);
if (!txResult.isOk()) {
ALOGE("AMIDI_getDeviceInfo transaction error: %d", txResult.transactionError());
return txResult.transactionError();
@@ -87,49 +93,74 @@
deviceInfoPtr->isPrivate = deviceInfo.isPrivate();
deviceInfoPtr->inputPortCount = deviceInfo.getInputPortNames().size();
deviceInfoPtr->outputPortCount = deviceInfo.getOutputPortNames().size();
+
+ return OK;
+}
+
+/*
+ * Port Helpers
+ */
+static status_t AMIDI_openPort(AMIDI_Device *device, int portNumber, int type,
+ AMIDI_Port **portPtr) {
+ sp<BBinder> portToken(new BBinder());
+ unique_fd ufd;
+ Status txResult = type == PORTTYPE_OUTPUT
+ ? device->server->openOutputPort(portToken, portNumber, &ufd)
+ : device->server->openInputPort(portToken, portNumber, &ufd);
+ if (!txResult.isOk()) {
+ ALOGE("AMIDI_openPort transaction error: %d", txResult.transactionError());
+ return txResult.transactionError();
+ }
+
+ AMIDI_Port* port = new AMIDI_Port;
+ port->state = MIDI_PORT_STATE_OPEN_IDLE;
+ port->device = device;
+ port->binderToken = portToken;
+ port->ufd = std::move(ufd);
+
+ *portPtr = port;
+
+ return OK;
+}
+
+static status_t AMIDI_closePort(AMIDI_Port *port) {
+ int portState = MIDI_PORT_STATE_OPEN_IDLE;
+ while (!port->state.compare_exchange_weak(portState, MIDI_PORT_STATE_CLOSED)) {
+ if (portState == MIDI_PORT_STATE_CLOSED) {
+ return -EINVAL; // Already closed
+ }
+ }
+
+ Status txResult = port->device->server->closePort(port->binderToken);
+ if (!txResult.isOk()) {
+ return txResult.transactionError();
+ }
+
+ delete port;
+
return OK;
}
/*
* Output (receiving) API
*/
-status_t AMIDI_openOutputPort(AMIDI_Device device, int portNumber, AMIDI_OutputPort *outputPortPtr) {
- sp<BpMidiDeviceServer> deviceServer;
- status_t result = MidiDeviceRegistry::getInstance().getDeviceByToken(device, &deviceServer);
- if (result != OK) {
- ALOGE("AMIDI_openOutputPort bad device token %d: %d", device, result);
- return result;
- }
-
- sp<BBinder> portToken(new BBinder());
- unique_fd ufd;
- Status txResult = deviceServer->openOutputPort(portToken, portNumber, &ufd);
- if (!txResult.isOk()) {
- ALOGE("AMIDI_openOutputPort transaction error: %d", txResult.transactionError());
- return txResult.transactionError();
- }
-
- result = MidiPortRegistry::getInstance().addOutputPort(
- device, portToken, std::move(ufd), outputPortPtr);
- if (result != OK) {
- ALOGE("AMIDI_openOutputPort port registration error: %d", result);
- // Close port
- return result;
- }
- return OK;
+status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber,
+ AMIDI_OutputPort **outputPortPtr) {
+ return AMIDI_openPort(device, portNumber, PORTTYPE_OUTPUT, (AMIDI_Port**)outputPortPtr);
}
-ssize_t AMIDI_receive(AMIDI_OutputPort outputPort, AMIDI_Message *messages, ssize_t maxMessages) {
- unique_fd *ufd;
- // TODO: May return a nicer self-unlocking object
- status_t result = MidiPortRegistry::getInstance().getOutputPortFdAndLock(outputPort, &ufd);
- if (result != OK) {
- return result;
+ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages) {
+ AMIDI_Port *port = (AMIDI_Port*)outputPort;
+ int portState = MIDI_PORT_STATE_OPEN_IDLE;
+ if (!port->state.compare_exchange_strong(portState, MIDI_PORT_STATE_OPEN_ACTIVE)) {
+ // The port has been closed.
+ return -EPIPE;
}
+ status_t result = OK;
ssize_t messagesRead = 0;
while (messagesRead < maxMessages) {
- struct pollfd checkFds[1] = { { *ufd, POLLIN, 0 } };
+ struct pollfd checkFds[1] = { { port->ufd, POLLIN, 0 } };
int pollResult = poll(checkFds, 1, 0);
if (pollResult < 1) {
result = android::INVALID_OPERATION;
@@ -139,7 +170,7 @@
AMIDI_Message *message = &messages[messagesRead];
uint8_t readBuffer[AMIDI_PACKET_SIZE];
memset(readBuffer, 0, sizeof(readBuffer));
- ssize_t readCount = read(*ufd, readBuffer, sizeof(readBuffer));
+ ssize_t readCount = read(port->ufd, readBuffer, sizeof(readBuffer));
if (readCount == EINTR) {
continue;
}
@@ -157,100 +188,38 @@
if (dataSize) {
memcpy(message->buffer, readBuffer + 1, dataSize);
}
- message->timestamp = *(uint64_t*) (readBuffer + readCount - sizeof(uint64_t));
+ message->timestamp = *(uint64_t*)(readBuffer + readCount - sizeof(uint64_t));
}
message->len = dataSize;
++messagesRead;
}
- MidiPortRegistry::getInstance().unlockOutputPort(outputPort);
+ port->state.store(MIDI_PORT_STATE_OPEN_IDLE);
+
return result == OK ? messagesRead : result;
}
-status_t AMIDI_closeOutputPort(AMIDI_OutputPort outputPort) {
- AMIDI_Device device;
- sp<IBinder> portToken;
- status_t result =
- MidiPortRegistry::getInstance().removeOutputPort(outputPort, &device, &portToken);
- if (result != OK) {
- return result;
- }
-
- sp<BpMidiDeviceServer> deviceServer;
- result = MidiDeviceRegistry::getInstance().getDeviceByToken(device, &deviceServer);
- if (result != OK) {
- return result;
- }
-
- Status txResult = deviceServer->closePort(portToken);
- if (!txResult.isOk()) {
- return txResult.transactionError();
- }
- return OK;
+status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort) {
+ return AMIDI_closePort((AMIDI_Port*)outputPort);
}
/*
* Input (sending) API
*/
-status_t AMIDI_openInputPort(AMIDI_Device device, int portNumber, AMIDI_InputPort *inputPortPtr) {
- sp<BpMidiDeviceServer> deviceServer;
- status_t result = MidiDeviceRegistry::getInstance().getDeviceByToken(device, &deviceServer);
- if (result != OK) {
- ALOGE("AMIDI_openInputPort bad device token %d: %d", device, result);
- return result;
- }
-
- sp<BBinder> portToken(new BBinder());
- unique_fd ufd; // this is the file descriptor of the "receive" port s
- Status txResult = deviceServer->openInputPort(portToken, portNumber, &ufd);
- if (!txResult.isOk()) {
- ALOGE("AMIDI_openInputPort transaction error: %d", txResult.transactionError());
- return txResult.transactionError();
- }
-
- result = MidiPortRegistry::getInstance().addInputPort(
- device, portToken, std::move(ufd), inputPortPtr);
- if (result != OK) {
- ALOGE("AMIDI_openInputPort port registration error: %d", result);
- // Close port
- return result;
- }
-
- return OK;
+status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr) {
+ return AMIDI_openPort(device, portNumber, PORTTYPE_INPUT, (AMIDI_Port**)inputPortPtr);
}
-status_t AMIDI_closeInputPort(AMIDI_InputPort inputPort) {
- AMIDI_Device device;
- sp<IBinder> portToken;
- status_t result = MidiPortRegistry::getInstance().removeInputPort(
- inputPort, &device, &portToken);
- if (result != OK) {
- ALOGE("AMIDI_closeInputPort remove port error: %d", result);
- return result;
- }
-
- sp<BpMidiDeviceServer> deviceServer;
- result = MidiDeviceRegistry::getInstance().getDeviceByToken(device, &deviceServer);
- if (result != OK) {
- ALOGE("AMIDI_closeInputPort can't find device error: %d", result);
- return result;
- }
-
- Status txResult = deviceServer->closePort(portToken);
- if (!txResult.isOk()) {
- result = txResult.transactionError();
- ALOGE("AMIDI_closeInputPort transaction error: %d", result);
- return result;
- }
-
- return OK;
+status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort) {
+ return AMIDI_closePort((AMIDI_Port*)inputPort);
}
-ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort /*inputPort*/) {
+ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort */*inputPort*/) {
return SIZE_MIDIRECEIVEBUFFER;
}
-static ssize_t AMIDI_makeSendBuffer(uint8_t *buffer, uint8_t *data, ssize_t numBytes, uint64_t timestamp) {
+static ssize_t AMIDI_makeSendBuffer(
+ uint8_t *buffer, uint8_t *data, ssize_t numBytes,uint64_t timestamp) {
buffer[0] = AMIDI_OPCODE_DATA;
memcpy(buffer + 1, data, numBytes);
memcpy(buffer + 1 + numBytes, ×tamp, sizeof(timestamp));
@@ -264,11 +233,11 @@
// }
//}
-ssize_t AMIDI_send(AMIDI_InputPort inputPort, uint8_t *buffer, ssize_t numBytes) {
+ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes) {
return AMIDI_sendWithTimestamp(inputPort, buffer, numBytes, 0);
}
-ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort inputPort, uint8_t *data,
+ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *data,
ssize_t numBytes, int64_t timestamp) {
if (numBytes > SIZE_MIDIRECEIVEBUFFER) {
@@ -277,15 +246,9 @@
// AMIDI_logBuffer(data, numBytes);
- unique_fd *ufd = NULL;
- status_t result = MidiPortRegistry::getInstance().getInputPortFd(inputPort, &ufd);
- if (result != OK) {
- return result;
- }
-
uint8_t writeBuffer[SIZE_MIDIRECEIVEBUFFER + AMIDI_PACKET_OVERHEAD];
ssize_t numTransferBytes = AMIDI_makeSendBuffer(writeBuffer, data, numBytes, timestamp);
- ssize_t numWritten = write(*ufd, writeBuffer, numTransferBytes);
+ ssize_t numWritten = write(((AMIDI_Port*)inputPort)->ufd, writeBuffer, numTransferBytes);
if (numWritten < numTransferBytes) {
ALOGE("AMIDI_sendWithTimestamp Couldn't write MIDI data buffer. requested:%zu, written%zu",
@@ -295,16 +258,10 @@
return numWritten - AMIDI_PACKET_OVERHEAD;
}
-status_t AMIDI_flush(AMIDI_InputPort inputPort) {
- unique_fd *ufd = NULL;
- status_t result = MidiPortRegistry::getInstance().getInputPortFd(inputPort, &ufd);
- if (result != OK) {
- return result;
- }
-
+status_t AMIDI_flush(AMIDI_InputPort *inputPort) {
uint8_t opCode = AMIDI_OPCODE_FLUSH;
ssize_t numTransferBytes = 1;
- ssize_t numWritten = write(*ufd, &opCode, numTransferBytes);
+ ssize_t numWritten = write(((AMIDI_Port*)inputPort)->ufd, &opCode, numTransferBytes);
if (numWritten < numTransferBytes) {
ALOGE("AMIDI_flush Couldn't write MIDI flush. requested:%zu, written%zu",
diff --git a/media/native/midi/midi.h b/media/native/midi/midi.h
index 717bc66..9332b44 100644
--- a/media/native/midi/midi.h
+++ b/media/native/midi/midi.h
@@ -29,22 +29,11 @@
extern "C" {
#endif
-//typedef struct _AMIDI_Device;
-//typedef struct _AMIDI_InputPort;
-//typedef struct _AMIDI_OutputPort;
-//typedef _AMIDI_Device* AMIDI_Device;
-//typedef _AMIDI_InputPort* AMIDI_InputPort;
-//typedef _AMIDI_OutputPort* AMIDI_OutputPort;
+struct AMIDI_Device;
+struct AMIDI_InputPort;
+struct AMIDI_OutputPort;
-typedef int32_t AMIDI_Device;
-typedef int32_t AMIDI_InputPort;
-typedef int32_t AMIDI_OutputPort;
-
-//TODO - Do we want to wrap this stuff in namespace android { namespace media { namespace midi {?
-
-enum {
- AMIDI_INVALID_HANDLE = -1
-};
+#define AMIDI_INVALID_HANDLE NULL
enum {
AMIDI_OPCODE_DATA = 1,
@@ -56,10 +45,10 @@
};
typedef struct {
- uint32_t opcode;
- uint8_t buffer[AMIDI_BUFFER_SIZE];
- size_t len;
- int64_t timestamp;
+ uint32_t opcode;
+ uint8_t buffer[AMIDI_BUFFER_SIZE];
+ size_t len;
+ int64_t timestamp;
} AMIDI_Message;
enum {
@@ -80,16 +69,6 @@
* Device API
*/
/*
- * Retrieves the native API device token for the specified Java API device ID.
- *
- * uid The Java API id of the device.
- * devicePtr Receives the associated native API token for the device.
- *
- * Returns OK or a (negative) error code.
- */
-status_t AMIDI_getDeviceById(int32_t id, AMIDI_Device *devicePtr);
-
-/*
* Retrieves information for the native MIDI device.
*
* device The Native API token for the device.
@@ -97,7 +76,7 @@
*
* Returns OK or a (negative) error code.
*/
-status_t AMIDI_getDeviceInfo(AMIDI_Device device, AMIDI_DeviceInfo *deviceInfoPtr);
+status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr);
/*
* API for receiving data from the Output port of a device.
@@ -111,7 +90,8 @@
*
* Returns OK, or a (negative) error code.
*/
-status_t AMIDI_openOutputPort(AMIDI_Device device, int portNumber, AMIDI_OutputPort *outputPortPtr);
+status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber,
+ AMIDI_OutputPort **outputPortPtr);
/*
* Receives any pending MIDI messages (up to the specified maximum number of messages).
@@ -122,7 +102,7 @@
*
* Returns the number of messages received, or a (negative) error code.
*/
-ssize_t AMIDI_receive(AMIDI_OutputPort outputPort, AMIDI_Message *messages, ssize_t maxMessages);
+ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages);
/*
* Closes the output port.
@@ -131,7 +111,7 @@
*
* Returns OK, or a (negative) error code.
*/
-status_t AMIDI_closeOutputPort(AMIDI_OutputPort outputPort);
+status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort);
/*
* API for sending data to the Input port of a device.
@@ -145,12 +125,12 @@
*
* Returns OK, or a (negative) error code.
*/
-status_t AMIDI_openInputPort(AMIDI_Device device, int portNumber, AMIDI_InputPort *inputPortPtr);
+status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr);
/*
* Returns the maximum number of bytes that can be received in a single MIDI message.
*/
-ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort inputPort);
+ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort *inputPort);
/*
* Sends data to the specified input port.
@@ -161,7 +141,7 @@
*
* Returns The number of bytes sent or a (negative) error code.
*/
-ssize_t AMIDI_send(AMIDI_InputPort inputPort, uint8_t *buffer, ssize_t numBytes);
+ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes);
/*
* Sends data to the specified input port with a timestamp.
@@ -173,7 +153,7 @@
*
* Returns The number of bytes sent or a (negative) error code.
*/
-ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort inputPort, uint8_t *buffer,
+ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *buffer,
ssize_t numBytes, int64_t timestamp);
/*
@@ -183,7 +163,7 @@
*
* Returns OK, or a (negative) error code.
*/
-status_t AMIDI_flush(AMIDI_InputPort inputPort);
+status_t AMIDI_flush(AMIDI_InputPort *inputPort);
/*
* Closes the input port.
@@ -193,7 +173,7 @@
*
* Returns OK, or a (negative) error code.
*/
-status_t AMIDI_closeInputPort(AMIDI_InputPort inputPort);
+status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort);
#ifdef __cplusplus
}
diff --git a/media/native/midi/midi_internal.h b/media/native/midi/midi_internal.h
new file mode 100644
index 0000000..fd4770e
--- /dev/null
+++ b/media/native/midi/midi_internal.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_MEDIA_MIDI_INTERNAL_H_
+#define ANDROID_MEDIA_MIDI_INTERNAL_H_
+
+#include "android/media/midi/BpMidiDeviceServer.h"
+
+struct AMIDI_Device {
+ android::sp<android::media::midi::BpMidiDeviceServer> server;
+ int32_t deviceId;
+};
+
+#endif // ANDROID_MEDIA_MIDI_INTERNAL_H_
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
index 9a78544..476f016 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
@@ -45,8 +45,8 @@
import com.android.mediaframeworktest.MediaFrameworkIntegrationTestRunner;
-import org.mockito.ArgumentMatcher;
import org.mockito.ArgumentCaptor;
+import org.mockito.compat.ArgumentMatcher;
import static org.mockito.Mockito.*;
public class CameraDeviceBinderTest extends AndroidTestCase {
@@ -168,7 +168,7 @@
class IsMetadataNotEmpty extends ArgumentMatcher<CameraMetadataNative> {
@Override
- public boolean matches(Object obj) {
+ public boolean matchesObject(Object obj) {
return !((CameraMetadataNative) obj).isEmpty();
}
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaInserterTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaInserterTest.java
index 86c2284..712039d 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaInserterTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaInserterTest.java
@@ -37,9 +37,9 @@
import android.test.suitebuilder.annotation.SmallTest;
import org.hamcrest.Description;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.compat.ArgumentMatcher;
public class MediaInserterTest extends InstrumentationTestCase {
@@ -67,7 +67,7 @@
}
@Override
- public boolean matches(Object argument) {
+ public boolean matchesObject(Object argument) {
if (!(argument instanceof Uri)) {
return false;
}
@@ -79,13 +79,9 @@
}
@Override
- public void describeTo(Description description) {
- description
- .appendText("expected a TableUri '")
- .appendText(mUri.toString())
- .appendText("'");
+ public String toString() {
+ return "expected a TableUri '" + mUri.toString() + "'";
}
-
}
private static Uri eqUri(Uri in) {
diff --git a/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp b/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp
index 8aa874a..0110b75 100644
--- a/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp
+++ b/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp
@@ -66,8 +66,8 @@
static std::atomic_ullong sharedCounter;
-static AMIDI_Device midiDevice = AMIDI_INVALID_HANDLE;
-static std::atomic<AMIDI_OutputPort> midiOutputPort(AMIDI_INVALID_HANDLE);
+static AMIDI_Device* midiDevice = AMIDI_INVALID_HANDLE;
+static std::atomic<AMIDI_OutputPort*> midiOutputPort(AMIDI_INVALID_HANDLE);
static int setPlaySamples(int newPlaySamples)
{
@@ -86,7 +86,7 @@
{
sharedCounter++;
- AMIDI_OutputPort outputPort = midiOutputPort.load();
+ AMIDI_OutputPort* outputPort = midiOutputPort.load();
if (outputPort != AMIDI_INVALID_HANDLE) {
char midiDumpBuffer[1024];
ssize_t midiReceived = AMIDI_receive(
@@ -235,20 +235,21 @@
}
void Java_com_example_android_nativemididemo_NativeMidi_startReadingMidi(
- JNIEnv*, jobject, jint deviceId, jint portNumber) {
+ JNIEnv*, jobject, jlong deviceHandle, jint portNumber) {
char buffer[1024];
- int result = AMIDI_getDeviceById(deviceId, &midiDevice);
- if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Obtained device token for uid %d: token %d", deviceId, midiDevice);
- } else {
- snprintf(buffer, sizeof(buffer), "Could not obtain device token for uid %d: %d", deviceId, result);
- }
+ midiDevice = (AMIDI_Device*)deviceHandle;
+// int result = AMIDI_getDeviceById(deviceId, &midiDevice);
+// if (result == 0) {
+// snprintf(buffer, sizeof(buffer), "Obtained device token for uid %d: token %d", deviceId, midiDevice);
+// } else {
+// snprintf(buffer, sizeof(buffer), "Could not obtain device token for uid %d: %d", deviceId, result);
+// }
nativemididemo::writeMessage(buffer);
- if (result) return;
+// if (result) return;
AMIDI_DeviceInfo deviceInfo;
- result = AMIDI_getDeviceInfo(midiDevice, &deviceInfo);
+ int result = AMIDI_getDeviceInfo(midiDevice, &deviceInfo);
if (result == 0) {
snprintf(buffer, sizeof(buffer), "Device info: uid %d, type %d, priv %d, ports %d I / %d O",
deviceInfo.uid, deviceInfo.type, deviceInfo.isPrivate,
@@ -259,27 +260,27 @@
nativemididemo::writeMessage(buffer);
if (result) return;
- AMIDI_OutputPort outputPort;
+ AMIDI_OutputPort* outputPort;
result = AMIDI_openOutputPort(midiDevice, portNumber, &outputPort);
if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Opened port %d: token %d", portNumber, outputPort);
+ snprintf(buffer, sizeof(buffer), "Opened port %d: token %p", portNumber, outputPort);
midiOutputPort.store(outputPort);
} else {
- snprintf(buffer, sizeof(buffer), "Could not open port %d: %d", deviceId, result);
+ snprintf(buffer, sizeof(buffer), "Could not open port %p: %d", midiDevice, result);
}
nativemididemo::writeMessage(buffer);
}
void Java_com_example_android_nativemididemo_NativeMidi_stopReadingMidi(
JNIEnv*, jobject) {
- AMIDI_OutputPort outputPort = midiOutputPort.exchange(AMIDI_INVALID_HANDLE);
+ AMIDI_OutputPort* outputPort = midiOutputPort.exchange(AMIDI_INVALID_HANDLE);
if (outputPort == AMIDI_INVALID_HANDLE) return;
int result = AMIDI_closeOutputPort(outputPort);
char buffer[1024];
if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Closed port by token %d", outputPort);
+ snprintf(buffer, sizeof(buffer), "Closed port by token %p", outputPort);
} else {
- snprintf(buffer, sizeof(buffer), "Could not close port by token %d: %d", outputPort, result);
+ snprintf(buffer, sizeof(buffer), "Could not close port by token %p: %d", outputPort, result);
}
nativemididemo::writeMessage(buffer);
}
diff --git a/packages/BackupRestoreConfirmation/res/values-mk/strings.xml b/packages/BackupRestoreConfirmation/res/values-mk/strings.xml
index 3e295c1..d1cfe4a 100644
--- a/packages/BackupRestoreConfirmation/res/values-mk/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-mk/strings.xml
@@ -26,10 +26,10 @@
<string name="deny_restore_button_label" msgid="1724367334453104378">"Не враќај"</string>
<string name="current_password_text" msgid="8268189555578298067">"Внесете ја вашата тековна резервна лозинка подолу:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Внеси лозинката за шифрирање на уредот подолу."</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Внесете ја лозинката за шифрирање на вашиот уред подолу. Таа ќе се користи и за шифрирање на резервната копија на архивата."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Внесете ја лозинката за шифрирање на вашиот уред подолу. Таа ќе се користи и за шифрирање на архивата на бекапот."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Внесете лозинка што ќе се користи за шифрирање на целосната резервна копија на податоците. Ако ова поле остане празно, ќе се користи вашата тековна лозинка за резервна копија:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ако сакате да ја шифрирате целосната резервна копија на податоци, внесете лозинка подолу:"</string>
- <string name="backup_enc_password_required" msgid="7889652203371654149">"Бидејќи уредот е шифриран, треба да ја шифрирате и резервната копија. Внесете лозинка подолу:"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"Бидејќи уредот е шифриран, треба да го шифрирате и бекапот. Внесете лозинка подолу:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ако податоците што се враќаат се шифрирани, внесете ја лозинката подолу:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Започнува правење резервна копија..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"Правењето резервна копија заврши"</string>
diff --git a/packages/CarrierDefaultApp/AndroidManifest.xml b/packages/CarrierDefaultApp/AndroidManifest.xml
index d910920..2e642ec 100644
--- a/packages/CarrierDefaultApp/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/AndroidManifest.xml
@@ -17,16 +17,16 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.carrierdefaultapp"
- android:sharedUserId="android.uid.phone" >
+ package="com.android.carrierdefaultapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+ <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
<application android:label="@string/app_name" >
<receiver android:name="com.android.carrierdefaultapp.CarrierDefaultBroadcastReceiver">
diff --git a/packages/CarrierDefaultApp/res/drawable/ic_sim_card.xml b/packages/CarrierDefaultApp/res/drawable/ic_sim_card.xml
index 5896757..dc54fe2 100644
--- a/packages/CarrierDefaultApp/res/drawable/ic_sim_card.xml
+++ b/packages/CarrierDefaultApp/res/drawable/ic_sim_card.xml
@@ -14,13 +14,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="@dimen/glif_icon_size"
- android:height="@dimen/glif_icon_size"
- android:viewportWidth="48"
- android:viewportHeight="48">
- <path
- android:fillColor="?android:attr/colorPrimary"
- android:pathData="M39.98,8c0,-2.21 -1.77,-4 -3.98,-4L20,4L8,16v24c0,2.21 1.79,4 4,4h24.02c2.21,0 3.98,-1.79 3.98,-4l-0.02,-32zM18,38h-4v-4h4v4zM34,38h-4v-4h4v4zM18,30h-4v-8h4v8zM26,38h-4v-8h4v8zM26,26h-4v-4h4v4zM34,30h-4v-8h4v8z" />
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+<path
+ android:fillColor="#757575"
+ android:pathData="M18,2h-8L4.02,8 4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM13,17h-2v-2h2v2zM13,13h-2L11,8h2v5z"/>
</vector>
\ No newline at end of file
diff --git a/packages/CarrierDefaultApp/res/values-af/strings.xml b/packages/CarrierDefaultApp/res/values-af/strings.xml
index eb330a5..5b9cee8 100644
--- a/packages/CarrierDefaultApp/res/values-af/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-af/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktiveer jou diens"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Geen datadiens nie"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tik om jou diens te aktiveer"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Geen diens nie – kontak asseblief jou diensverskaffer"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Koppel aan kontoleringsportaal …"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Netwerk-uitteltyd – wil jy dalk weer probeer?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Netwerk onbeskikbaar"</string>
diff --git a/packages/CarrierDefaultApp/res/values-am/strings.xml b/packages/CarrierDefaultApp/res/values-am/strings.xml
index fc62e8d..b839ffe6 100644
--- a/packages/CarrierDefaultApp/res/values-am/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-am/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"አገልግሎትዎን ያግብሩ"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ምንም የውሂብ አገልግሎት የለም"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"አገልግሎትዎን ለማግበር መታ ያድርጉ"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"ምንም አገልግሎት የለም፣ እባክዎ የአገልግሎት አቅራቢዎን ያነጋግሩ"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"ከተያዥ መግቢያ ጋር በመገናኘት ላይ..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"አውታረ መረብ የእረፍት ጊዜ ወስዷል፣ እንደገና መሞከር ይፈልጋሉ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"አውታረ መረብ አይገኝም"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ar/strings.xml b/packages/CarrierDefaultApp/res/values-ar/strings.xml
index 3903c35..ccca24d 100644
--- a/packages/CarrierDefaultApp/res/values-ar/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ar/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"تنشيط الخدمة"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ليست هناك خدمة بيانات"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"انقر لتنشيط الخدمة"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"ليست هناك خدمة، يرجى الاتصال بمقدم الخدمة"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"جارٍ الاتصال بالمدخل المقيد الوصول..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"انتهت مهلة الشبكة، هل ترغب في إعادة المحاولة؟"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"الشبكة غير متاحة"</string>
diff --git a/packages/CarrierDefaultApp/res/values-az/strings.xml b/packages/CarrierDefaultApp/res/values-az/strings.xml
index 90d7f09..75af74a 100644
--- a/packages/CarrierDefaultApp/res/values-az/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-az/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Xidməti aktiv edin"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Data xidməti yoxdur"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Xidməti aktiv etmək üçün klikləyin"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Xidmət yoxdur, xidmət provayderi ilə əlaqə saxlayın"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Avtorizasiya portalına qoşulur..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Şəbəkə zaman aşımı, yenidən cəhd etmək istərdiniz?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Şəbəkə yoxdur"</string>
diff --git a/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml b/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml
index 57f8bf5..a7833a5 100644
--- a/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-b+sr+Latn/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivirajte uslugu"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Nema usluge prenosa podataka"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Dodirnite da biste aktivirali uslugu"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Nema usluge. Kontaktirajte dobavljača usluge"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Povezuje se sa ulaznim portalom…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Vremensko ograničenje mreže je isteklo. Želite li da probate ponovo?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Mreža nije dostupna"</string>
diff --git a/packages/CarrierDefaultApp/res/values-be/strings.xml b/packages/CarrierDefaultApp/res/values-be/strings.xml
index 1f3032b..83149eb 100644
--- a/packages/CarrierDefaultApp/res/values-be/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-be/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Актывуйце сэрвіс"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Няма сэрвісу перадачы даных"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Дакраніцеся, каб актываваць сэрвіс"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Няма абслугоўвання, звярніцеся да свайго пастаўшчыка паслуг"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Ідзе падключэнне да партала ўзаемадзеяння..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Час чакання сеткі скончыўся, хочаце паўтарыць спробу?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Сетка недаступная"</string>
diff --git a/packages/CarrierDefaultApp/res/values-bg/strings.xml b/packages/CarrierDefaultApp/res/values-bg/strings.xml
index b6bdd5d..ada9077 100644
--- a/packages/CarrierDefaultApp/res/values-bg/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bg/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Активирайте услугата си"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Няма услуга за данни"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Докоснете, за да активирате услугата си"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Няма покритие. Моля, свържете се с доставчика си"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Установява се връзка с портал за удостоверяване..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Времето за изчакване на мрежата изтече. Искате ли да опитате отново?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Мрежата не е налице"</string>
diff --git a/packages/CarrierDefaultApp/res/values-bn/strings.xml b/packages/CarrierDefaultApp/res/values-bn/strings.xml
index 7afa1c9..c1098c4 100644
--- a/packages/CarrierDefaultApp/res/values-bn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bn/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"আপনার পরিষেবা সক্রিয় করুন"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ডেটা পরিষেবা উপলব্ধ নয়"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"আপনার পরিষেবা সক্রিয় করতে আলতো চাপুন"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"পরিষেবা উপলব্ধ নয়, অনুগ্রহ করে আপনার পরিষেবা প্রদানকারীর সঙ্গে যোগাযোগ করুন"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"অন্তরীণ পোর্টালের সঙ্গে সংযুক্ত করা হচ্ছে..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"নেটওয়ার্কের সময় সমাপ্ত হয়েছে, আপনি কি আবার চেষ্টা করতে চান?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"নেটওয়ার্ক অনুপলব্ধ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-bs/strings.xml b/packages/CarrierDefaultApp/res/values-bs/strings.xml
index b43e766..7a65d04 100644
--- a/packages/CarrierDefaultApp/res/values-bs/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-bs/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivirajte uslugu"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Nema mobilnog interneta"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Dodirnite da aktivirate uslugu"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Nema usluge. Obratite se pružaocu usluge."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Povezivanje na zaštitni portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Isteklo je vrijeme za odziv mreže. Želite li ponoviti?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Mreža nije dostupna"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ca/strings.xml b/packages/CarrierDefaultApp/res/values-ca/strings.xml
index 0730a01..18f9ab9 100644
--- a/packages/CarrierDefaultApp/res/values-ca/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ca/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activa el servei"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"No hi ha servei de dades"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toca per activar el servei"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No hi ha servei. Contacta amb el proveïdor del servei."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"S\'està connectant al portal captiu…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"S\'ha esgotat el temps d\'espera de la xarxa. Vols tornar-ho a provar?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Xarxa no disponible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-cs/strings.xml b/packages/CarrierDefaultApp/res/values-cs/strings.xml
index 4056b05..409e4144 100644
--- a/packages/CarrierDefaultApp/res/values-cs/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-cs/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivování služby"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Datová služba není dostupná"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Klepnutím službu aktivujete"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Služba není dostupná, kontaktujte poskytovatele"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Připojování ke captive portálu..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Časový limit sítě vypršel, zopakovat pokus?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Síť není dostupná"</string>
diff --git a/packages/CarrierDefaultApp/res/values-da/strings.xml b/packages/CarrierDefaultApp/res/values-da/strings.xml
index 83c8b8c..6aca35c 100644
--- a/packages/CarrierDefaultApp/res/values-da/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-da/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivér din tjeneste"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ingen datatjeneste"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tryk for at aktivere din tjeneste"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Der er ingen tjeneste. Kontakt din tjenesteudbyder"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Opretter forbindelse til loginportal…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Timeout for netværket. Vil du prøve igen?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Netværket er ikke tilgængeligt"</string>
diff --git a/packages/CarrierDefaultApp/res/values-de/strings.xml b/packages/CarrierDefaultApp/res/values-de/strings.xml
index 2713560..454e2a6 100644
--- a/packages/CarrierDefaultApp/res/values-de/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-de/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Dienst aktivieren"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Kein Datendienst"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Zum Aktivieren des Dienstes tippen"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Kein Dienst, kontaktiere bitte deinen Internetanbieter"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Verbindung mit Captive Portal wird hergestellt…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Zeitüberschreitung für Netzwerk – möchtest du es noch einmal versuchen?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Netzwerk nicht verfügbar"</string>
diff --git a/packages/CarrierDefaultApp/res/values-el/strings.xml b/packages/CarrierDefaultApp/res/values-el/strings.xml
index 6e9b2a4..009b124 100644
--- a/packages/CarrierDefaultApp/res/values-el/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-el/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ενεργοποιήστε την υπηρεσία σας"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Δεν υπάρχει υπηρεσία δεδομένων"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Πατήστε για να ενεργοποιήσετε την υπηρεσία σας"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Η υπηρεσία δεν είναι διαθέσιμη. Επικοινωνήστε με τον παροχέα υπηρεσιών που χρησιμοποιείτε."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Σύνδεση στην πύλη υποδοχής…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Λήξη χρονικού ορίου δικτύου, θέλετε να δοκιμάσετε ξανά;"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Το δίκτυο δεν είναι διαθέσιμο"</string>
diff --git a/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml b/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml
index 2e9060f..86d6aee 100644
--- a/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-en-rAU/strings.xml
@@ -2,10 +2,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activate your service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"No data service"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tap to activate your service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No Service. Please contact your service provider"</string>
+ <string name="android_system_label" msgid="4571709328900953606">"Android System"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string>
+ <string name="no_data_notification_id" msgid="7900410098774295500">"No Mobile data service"</string>
+ <string name="portal_notification_detail" msgid="2903915627830838406">"Tap to add funds to your %s SIM"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"Please contact your service provider %s"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connecting to captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Network timeout; would you like to retry?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Network unavailable"</string>
diff --git a/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml b/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml
index 2e9060f..86d6aee 100644
--- a/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-en-rGB/strings.xml
@@ -2,10 +2,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activate your service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"No data service"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tap to activate your service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No Service. Please contact your service provider"</string>
+ <string name="android_system_label" msgid="4571709328900953606">"Android System"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string>
+ <string name="no_data_notification_id" msgid="7900410098774295500">"No Mobile data service"</string>
+ <string name="portal_notification_detail" msgid="2903915627830838406">"Tap to add funds to your %s SIM"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"Please contact your service provider %s"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connecting to captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Network timeout; would you like to retry?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Network unavailable"</string>
diff --git a/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml b/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml
index 2e9060f..86d6aee 100644
--- a/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-en-rIN/strings.xml
@@ -2,10 +2,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activate your service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"No data service"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tap to activate your service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No Service. Please contact your service provider"</string>
+ <string name="android_system_label" msgid="4571709328900953606">"Android System"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string>
+ <string name="no_data_notification_id" msgid="7900410098774295500">"No Mobile data service"</string>
+ <string name="portal_notification_detail" msgid="2903915627830838406">"Tap to add funds to your %s SIM"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"Please contact your service provider %s"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connecting to captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Network timeout; would you like to retry?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Network unavailable"</string>
diff --git a/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml b/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml
index 735b255..d7b6bb9 100644
--- a/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-es-rUS/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activa tu servicio"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Sin servicio de datos"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Presiona para activar tu servicio"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No hay servicio, por lo que debes comunicarte con tu proveedor de servicios"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Conectando al portal cautivo…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Se agotó el tiempo de espera de la red, ¿quieres volver a intentarlo?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Red no disponible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-es/strings.xml b/packages/CarrierDefaultApp/res/values-es/strings.xml
index 49be628..55e09e5 100644
--- a/packages/CarrierDefaultApp/res/values-es/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-es/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activar el servicio"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Sin servicio de datos"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toca aquí para activar tu servicio"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Sin servicio. Ponte en contacto con el proveedor de servicios"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Conectando al portal cautivo…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Se ha agotado el tiempo de espera de la red. ¿Quieres volver a intentarlo?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Red no disponible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-et/strings.xml b/packages/CarrierDefaultApp/res/values-et/strings.xml
index 0cdf5bb..0afee4b 100644
--- a/packages/CarrierDefaultApp/res/values-et/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-et/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktiveerige teenus"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Andmesideteenus puudub"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Puudutage teenuse aktiveerimiseks"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Teenus puudub. Võtke ühendust oma teenusepakkujaga"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Hõiveportaaliga ühendamine …"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Võrgu ajalõpp. Kas soovite uuesti proovida?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Võrk ei ole saadaval"</string>
diff --git a/packages/CarrierDefaultApp/res/values-eu/strings.xml b/packages/CarrierDefaultApp/res/values-eu/strings.xml
index c1f7fa9..1e656d7 100644
--- a/packages/CarrierDefaultApp/res/values-eu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-eu/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktibatu zerbitzua"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Datu-zerbitzua ez dago erabilgarri"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Sakatu zerbitzua aktibatzeko"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Zerbitzua ez dago erabilgarri. Jarri operadorearekin harremanetan."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Sare-zerbitzuaren atarira konektatzen…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Denbora-muga gainditu du sareak. Berriro saiatu nahi duzu?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Sarea ez dago erabilgarri"</string>
diff --git a/packages/CarrierDefaultApp/res/values-fa/strings.xml b/packages/CarrierDefaultApp/res/values-fa/strings.xml
index d7a67f6..2f69b1f 100644
--- a/packages/CarrierDefaultApp/res/values-fa/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fa/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"فعال کردن سرویس"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"سرویس داده وجود ندارد"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"برای فعال کردن سرویستان ضربه بزنید"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"سرویسی وجود ندارد، لطفاً با ارائهدهنده سرویس خود تماس بگیرید"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"درحال اتصال به درگاه مهمان…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"مهلت زمانی شبکه تمام شد، مایلید دوباره امتحان کنید؟"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"شبکه دردسترس نیست"</string>
diff --git a/packages/CarrierDefaultApp/res/values-fi/strings.xml b/packages/CarrierDefaultApp/res/values-fi/strings.xml
index 8316e1c..1f8d633 100644
--- a/packages/CarrierDefaultApp/res/values-fi/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fi/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ota yhteys käyttöön"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ei datayhteyttä"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Ota yhteys käyttöön napauttamalla."</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ei yhteyttä verkkoon. Ota yhteyttä palveluntarjoajaan."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Yhdistetään captive portal ‑palveluun…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Verkkoyhteys aikakatkaistiin. Yritetäänkö uudelleen?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Verkko ei ole käytettävissä"</string>
diff --git a/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml b/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
index a2666cd..c011a3c 100644
--- a/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fr-rCA/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activez votre service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Aucun service de données"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Touchez pour activer votre service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Aucun service. Veuillez communiquer avec votre fournisseur de services."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connexion au portail captif en cours…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Expiration du délai sur le réseau. Voulez-vous réessayer?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Réseau non disponible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-fr/strings.xml b/packages/CarrierDefaultApp/res/values-fr/strings.xml
index 7a63bab..635c139 100644
--- a/packages/CarrierDefaultApp/res/values-fr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-fr/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activer votre service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Aucun service de données"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Appuyez pour activer votre service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Aucun service. Veuillez contacter votre fournisseur de services"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connexion au portail captif..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Expiration du délai au niveau du réseau. Souhaitez-vous réessayer ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Réseau indisponible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-gl/strings.xml b/packages/CarrierDefaultApp/res/values-gl/strings.xml
index ba18ee9..6f03b27 100644
--- a/packages/CarrierDefaultApp/res/values-gl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-gl/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activa o servizo"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Non hai servizo de datos"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toca para activar o servizo"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Non hai servizo. Ponte en contacto co teu fornecedor de servizo"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Conectando co portal cativo..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Superouse o tempo de espera da rede. Queres tentalo de novo?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"A rede non está dispoñible"</string>
diff --git a/packages/CarrierDefaultApp/res/values-gu/strings.xml b/packages/CarrierDefaultApp/res/values-gu/strings.xml
index c6d7f96..3d8ba7d 100644
--- a/packages/CarrierDefaultApp/res/values-gu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-gu/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"કૅરિઅર ડિફૉલ્ટ ઍપ્લિકેશન"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"તમારી સેવા સક્રિય કરો"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"કોઈ ડેટા સેવા ઉપલબ્ધ નથી"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"તમારી સેવા સક્રિય કરવા માટે ટૅપ કરો"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"કોઈ સેવા ઉપલબ્ધ નથી, કૃપા કરીને તમારા સેવા પ્રદાતાનો સંપર્ક કરો"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"કૅપ્ટિવ પોર્ટલ સાથે કનેક્ટ થઈ રહ્યું છે..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"નેટવર્કનો સમય સમાપ્ત થયો, શું તમે ફરીથી પ્રયાસ કરશો?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"નેટવર્ક અનુપલબ્ધ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-hi/strings.xml b/packages/CarrierDefaultApp/res/values-hi/strings.xml
index a1de4bc..fc10bca 100644
--- a/packages/CarrierDefaultApp/res/values-hi/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hi/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"अपनी सेवा सक्रिय करें"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"कोई डेटा सेवा नहीं है"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"अपनी सेवा सक्रिय करने के लिए टैप करें"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"कोई सेवा नहीं है, कृपया आपको सेवा प्रदान करने वाले से संपर्क करें"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"कैप्टिव पोर्टल से कनेक्ट हो रहा है..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"नेटवर्क रुक गया है, क्या आप फिर से कोशिश करना चाहेंगे?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"नेटवर्क उपलब्ध नहीं है"</string>
diff --git a/packages/CarrierDefaultApp/res/values-hr/strings.xml b/packages/CarrierDefaultApp/res/values-hr/strings.xml
index d5c05de6..51953ad 100644
--- a/packages/CarrierDefaultApp/res/values-hr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hr/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"Zadana aplikacija mobilnog operatera"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivirajte uslugu"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Podatkovna usluga nije dostupna"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Dodirnite da biste aktivirali uslugu"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Usluga nije dostupna. Obratite se davatelju usluga."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Povezivanje sa zaštitnim portalom..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Isteklo je vremensko ograničenje mreže. Želite li pokušati ponovo?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Mreža nije dostupna"</string>
diff --git a/packages/CarrierDefaultApp/res/values-hu/strings.xml b/packages/CarrierDefaultApp/res/values-hu/strings.xml
index c204ee0..a8cea39 100644
--- a/packages/CarrierDefaultApp/res/values-hu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hu/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"A szolgáltatás aktiválása"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Az adatszolgáltatás szünetel"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Koppintson a szolgáltatás aktiválásához"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"A szolgáltatás szünetel. Kérjük, vegye fel a kapcsolatot szolgáltatójával."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Kapcsolódás a hitelesítési portálhoz…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Hálózati időtúllépés. Megpróbálja újra?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"A hálózat nem áll rendelkezésre"</string>
diff --git a/packages/CarrierDefaultApp/res/values-hy/strings.xml b/packages/CarrierDefaultApp/res/values-hy/strings.xml
index ac53574..63d44ed 100644
--- a/packages/CarrierDefaultApp/res/values-hy/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-hy/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ակտիվացրեք ձեր ծառայությունը"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Տվյալների ծառայությունն անհասանելի է"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Հպեք՝ ծառայությունն ակտիվացնելու համար"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ծառայությունն անհասանելի է։ Դիմեք ձեր ծառայություններ մատուցողին"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Միանում է մուտքի էջին…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Ցանցի սպասման ժամանակը սպառվել է։ Փորձե՞լ կրկին։"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Ցանցն անհասանելի է"</string>
diff --git a/packages/CarrierDefaultApp/res/values-in/strings.xml b/packages/CarrierDefaultApp/res/values-in/strings.xml
index 15b6849..7db4283 100644
--- a/packages/CarrierDefaultApp/res/values-in/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-in/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"AplikasiDefaultOperator"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktifkan layanan"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Tidak ada layanan data"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tap untuk mengaktifkan layanan"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Tidak Ada Layanan, hubungi penyedia layanan"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Menyambungkan ke captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Waktu tunggu jaringan habis, ingin mencoba lagi?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Jaringan tidak tersedia"</string>
diff --git a/packages/CarrierDefaultApp/res/values-is/strings.xml b/packages/CarrierDefaultApp/res/values-is/strings.xml
index fb6ca57..30644e8 100644
--- a/packages/CarrierDefaultApp/res/values-is/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-is/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Virkja þjónustuna"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ekkert gagnasamband"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Ýttu til að virkja þjónustuna"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ekkert samband, hafðu samband við þjónustuaðila"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Tengist innskráningarsíðu..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Tímamörk nettengingar runnu út, viltu reyna aftur?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Ekkert net til staðar"</string>
diff --git a/packages/CarrierDefaultApp/res/values-it/strings.xml b/packages/CarrierDefaultApp/res/values-it/strings.xml
index fca6eb9..76eb35c 100644
--- a/packages/CarrierDefaultApp/res/values-it/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-it/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Attiva il servizio"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Nessun servizio dati"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tocca per attivare il servizio"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Nessun servizio. Contatta il provider Internet."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connessione al captive portal…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Timeout di rete. Vuoi riprovare?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rete non disponibile"</string>
diff --git a/packages/CarrierDefaultApp/res/values-iw/strings.xml b/packages/CarrierDefaultApp/res/values-iw/strings.xml
index 60b9168..b95c8ee 100644
--- a/packages/CarrierDefaultApp/res/values-iw/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-iw/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"הפעל את השירות"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"אין שירות נתונים"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"הקש כדי להפעיל את השירות"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"שירות הנתונים לא זמין. צור קשר עם ספק השירות."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"מתחבר לפורטל שבוי..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"הזמן הקצוב לתפוגת הרשת עבר. תרצה לנסות שוב?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"הרשת אינה זמינה"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ja/strings.xml b/packages/CarrierDefaultApp/res/values-ja/strings.xml
index 2875577..78d23e5 100644
--- a/packages/CarrierDefaultApp/res/values-ja/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ja/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"携帯通信会社のデフォルト アプリ"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"サービスの有効化"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"データサービスがありません"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"サービスを有効にするにはタップします"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"サービスがありません。ご利用のサービス プロバイダにお問い合わせください"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"キャプティブ ポータルに接続しています…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ネットワークがタイムアウトしました。再試行しますか?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ネットワーク接続不可"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ka/strings.xml b/packages/CarrierDefaultApp/res/values-ka/strings.xml
index c191575..32aeadd 100644
--- a/packages/CarrierDefaultApp/res/values-ka/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ka/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"თქვენი სერვისის გააქტიურება"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"მონაცემთა სერვისი არ არის"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"შეეხეთ თქვენი სერვისის გასააქტიურებლად"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"სერვისი არ არის — გთხოვთ, დაუკავშირდეთ სერვისის პროვაიდერს"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"მიმდინარეობს ავტორიზაციის პორტალთან დაკავშირება…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ქსელის დროის ლიმიტი ამოიწურა. გსურთ ხელახლა ცდა?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ქსელი მიუწვდომელია"</string>
diff --git a/packages/CarrierDefaultApp/res/values-kk/strings.xml b/packages/CarrierDefaultApp/res/values-kk/strings.xml
index 2285fda..6a64251 100644
--- a/packages/CarrierDefaultApp/res/values-kk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-kk/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Қызметті іске қосу"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Деректер қызметі көрсетілмейді"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Қызметті іске қосу үшін түртіңіз"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Қызмет көрсетілмейді, қызмет провайдеріне хабарласыңыз"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Адаптивті порталға қосылуда…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Желі мерзімі аяқталды, әрекетті қайталайсыз ба?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Желі қолжетімді емес"</string>
diff --git a/packages/CarrierDefaultApp/res/values-km/strings.xml b/packages/CarrierDefaultApp/res/values-km/strings.xml
index 7a02a0f..8da851c 100644
--- a/packages/CarrierDefaultApp/res/values-km/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-km/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"បើកដំណើរការសេវាកម្មរបស់អ្នក"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"គ្មានសេវាកម្មទិន្នន័យទេ"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"ចុចដើម្បីបើកដំណើរការសេវាកម្មរបស់អ្នក"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"គ្មានសេវាកម្មទេ សូមទាក់ទងក្រុមហ៊ុនផ្តល់សេវាកម្មរបស់អ្នក"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"កំពុងភ្ជាប់ទៅច្រកចូលប្រើបណ្តាញ..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"បណ្តាញអស់ម៉ោងហើយ តើអ្នកចង់ព្យាយាមម្តងទៀតដែរទេ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"មិនមានបណ្តាញទេ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-kn/strings.xml b/packages/CarrierDefaultApp/res/values-kn/strings.xml
index 42fe9a0..a9757c1 100644
--- a/packages/CarrierDefaultApp/res/values-kn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-kn/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"ನಿಮ್ಮ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ಯಾವುದೇ ಡೇಟಾ ಸೇವೆ ಲಭ್ಯವಿಲ್ಲ"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"ನಿಮ್ಮ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"ಸೇವೆಯು ಲಭ್ಯವಿಲ್ಲ, ನಿಮಗೆ ಸೇವೆ ಒದಗಿಸುವವರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"ವೈ-ಫೈ ಪ್ರಾರಂಭ ಪೋರ್ಟಲ್ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ನೆಟ್ವರ್ಕ್ ಕಾಲಾವಧಿ ಮುಗಿದಿದೆ, ನೀವು ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಲು ಬಯಸುವಿರಾ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ko/strings.xml b/packages/CarrierDefaultApp/res/values-ko/strings.xml
index 4cdcb91..ed26164 100644
--- a/packages/CarrierDefaultApp/res/values-ko/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ko/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"이동통신사 기본 앱"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"서비스 활성화"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"데이터 서비스를 이용할 수 없음"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"탭하여 서비스 활성화"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"서비스를 이용할 수 없습니다. 서비스 제공업체에 문의하세요."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"종속 포털에 연결 중..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"네트워크 제한 시간이 초과되었습니다. 다시 시도하시겠습니까?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"네트워크를 사용할 수 없음"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ky/strings.xml b/packages/CarrierDefaultApp/res/values-ky/strings.xml
index 54c95755..663c771 100644
--- a/packages/CarrierDefaultApp/res/values-ky/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ky/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"ОператордунДемейкиКолдонмосу"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Кызматты жандырыңыз"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Мобилдик туташуу кызматы жок"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Кызматты жандыруу үчүн таптаңыз"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Байланыш жок, кызмат көрсөтүүчүңүзгө кайрылыңыз"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Кирүү бетине туташууда…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Тармактын күтүү убакыты аяктады, кайра аракет кыласызбы?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Тармак жеткиликтүү эмес"</string>
diff --git a/packages/CarrierDefaultApp/res/values-lo/strings.xml b/packages/CarrierDefaultApp/res/values-lo/strings.xml
index 205d9b6..90b4f63 100644
--- a/packages/CarrierDefaultApp/res/values-lo/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-lo/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activate your service"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"No data service"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tap to activate your service"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"No Service, please contact your service provider"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Connecting to captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Network timeout, would you like to retry?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Network unavailable"</string>
diff --git a/packages/CarrierDefaultApp/res/values-lt/strings.xml b/packages/CarrierDefaultApp/res/values-lt/strings.xml
index 61f6d59..e34bc6b 100644
--- a/packages/CarrierDefaultApp/res/values-lt/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-lt/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Suaktyvinkite paslaugas"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Duomenų paslaugos neteikiamos"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Palieskite, kad suaktyvintumėte paslaugą"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Paslauga neteikiama. Susisiekite su paslaugos teikėju"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Prisijungiama prie fiksuotojo portalo..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Baigėsi skirtasis tinklo laikas. Ar norite bandyti dar kartą?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Tinklas nepasiekiamas"</string>
diff --git a/packages/CarrierDefaultApp/res/values-lv/strings.xml b/packages/CarrierDefaultApp/res/values-lv/strings.xml
index 1b6b90b..49d52d5 100644
--- a/packages/CarrierDefaultApp/res/values-lv/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-lv/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivizēt pakalpojumu"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Nav datu pakalpojuma"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Pieskarieties, lai aktivizētu pakalpojumu"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Nav pakalpojuma. Lūdzu, sazinieties ar pakalpojuma sniedzēju."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Notiek savienojuma izveide ar caurlaides lapu..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Radās tīkla noildze. Vai vēlaties mēģināt vēlreiz?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Tīkls nav pieejams"</string>
diff --git a/packages/CarrierDefaultApp/res/values-mk/strings.xml b/packages/CarrierDefaultApp/res/values-mk/strings.xml
index 066fb31..615c5e2 100644
--- a/packages/CarrierDefaultApp/res/values-mk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mk/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Активирајте ја услугата"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Нема услуга за подотоци"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Допрете за да ја активирате услугата"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Нема услуга, контактирајте со давателот на услуги"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Се поврзува на порталот за автентикација…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Истече времето на мрежата, дали сакате да се обидете повторно?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Мрежата е недостапна"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ml/strings.xml b/packages/CarrierDefaultApp/res/values-ml/strings.xml
index b72e877..83fa334 100644
--- a/packages/CarrierDefaultApp/res/values-ml/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ml/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"നിങ്ങളുടെ സേവനം ആക്റ്റിവേറ്റ് ചെയ്യുക"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ഡാറ്റ സേവനം ലഭ്യമല്ല"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"നിങ്ങളുടെ സേവനം ആക്റ്റിവേറ്റ് ചെയ്യാൻ ടാപ്പുചെയ്യുക"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"സേവനം ലഭ്യമല്ല, നിങ്ങളുടെ സേവനദാതാവിനെ ബന്ധപ്പെടുക"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"ക്യാപ്റ്റീവ് പോർട്ടലിലേയ്ക്ക് കണക്റ്റുചെയ്യുന്നു..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"നെറ്റ്വർക്ക് കാലഹരണപ്പെട്ടു, വീണ്ടും ശ്രമിക്കണോ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"നെറ്റ്വർക്ക് ലഭ്യമല്ല"</string>
diff --git a/packages/CarrierDefaultApp/res/values-mn/strings.xml b/packages/CarrierDefaultApp/res/values-mn/strings.xml
index c262e8f..4368926 100644
--- a/packages/CarrierDefaultApp/res/values-mn/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mn/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Үйлчилгээгээ идэвхжүүлнэ үү"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Дата үйлчилгээ алга"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Үйлчилгээгээ идэвхжүүлэхийн тулд товшино уу"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Үйлчилгээ алга. Үйлчилгээ үзүүлэгчтэйгээ холбогдоно уу"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Дамжих порталд холбогдож байна..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Сүлжээний хугацаа дууссан байна. Дахин оролдох уу?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Сүлжээ боломжгүй"</string>
diff --git a/packages/CarrierDefaultApp/res/values-mr/strings.xml b/packages/CarrierDefaultApp/res/values-mr/strings.xml
index beff675..00f4777 100644
--- a/packages/CarrierDefaultApp/res/values-mr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mr/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"आपली सेवा सक्रिय करा"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"डेटा सेवा नाही"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"आपली सेवा सक्रिय करण्यासाठी टॅप करा"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"सेवा नाही, कृपया आपल्या सेवा प्रदात्याशी संपर्क साधा"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"कॅप्टिव्ह पोर्टलशी कनेक्ट करत आहे..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"नेटवर्क कालबाह्य झाले, आपण पुन्हा प्रयत्न करू इच्छिता का?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"नेटवर्क अनुपलब्ध"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ms/strings.xml b/packages/CarrierDefaultApp/res/values-ms/strings.xml
index eff78c6..86b70cd 100644
--- a/packages/CarrierDefaultApp/res/values-ms/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ms/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"AplLalaiPembawa"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktifkan perkhidmatan anda"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Tiada perkhidmatan data"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Ketik untuk mengaktifkan perkhidmatan anda"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Tiada Perkhidmatan, sila hubungi penyedia perkhidmatan anda"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Menyambung ke portal terbolot…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Rangkaian tamat masa, adakah anda mahu mencuba semula?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rangkaian tidak tersedia"</string>
diff --git a/packages/CarrierDefaultApp/res/values-my/strings.xml b/packages/CarrierDefaultApp/res/values-my/strings.xml
index b0e929e..e2fe8c2 100644
--- a/packages/CarrierDefaultApp/res/values-my/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-my/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"ဝန်ဆောင်မှုကို စဖွင့်အသုံးပြုရန်"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ဒေတာချိတ်ဆက်မှုမရှိပါ"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"ဝန်ဆောင်မှုကို စဖွင့်အသုံးပြုရန် တို့ပါ"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"လိုင်းမရှိပါ။ သင့်ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"captive portal သို့ ချိတ်ဆက်နေသည်..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ချိတ်ဆက်မှု ပြတ်တောက်သွားပါသည်။ ထပ်လုပ်လိုပါသလား။"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ကွန်ရက်ချိတ်ဆက်မှု မရှိပါ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-nb/strings.xml b/packages/CarrierDefaultApp/res/values-nb/strings.xml
index 6f69e9a..68b3da6 100644
--- a/packages/CarrierDefaultApp/res/values-nb/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-nb/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktiver tjenesten"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ingen datatjeneste"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Trykk for å aktivere tjenesten"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ingen dekning – ta kontakt med tjenesteleverandøren din."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Kobler til obligatorisk side …"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Tidsavbrudd for nettverk – vil du prøve på nytt?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Nettverket er utilgjengelig"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ne/strings.xml b/packages/CarrierDefaultApp/res/values-ne/strings.xml
index 4807d6d..921d0ce 100644
--- a/packages/CarrierDefaultApp/res/values-ne/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ne/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"आफ्नो सेवालाई सक्रिय पार्नुहोस्"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"डेटा सेवा छैन"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"आफ्नो सेवालाई सक्रिय पार्न ट्याप गर्नुहोस्"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"सेवा उपलब्ध छैन,कृपया आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नुहोस्"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"क्याप्टिभ पोर्टलमा जडान हुँदैछ..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"नेटवर्कमा जडान हुने समय समाप्त भयो, के तपाईं पुनः प्रयास गर्न चाहानुहुन्छ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"नेटवर्क उपलब्ध छैन"</string>
diff --git a/packages/CarrierDefaultApp/res/values-nl/strings.xml b/packages/CarrierDefaultApp/res/values-nl/strings.xml
index b7da335..af87f98 100644
--- a/packages/CarrierDefaultApp/res/values-nl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-nl/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"De service activeren"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Geen gegevensservice"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tik om de service te activeren"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Geen service. Neem contact op met je serviceprovider."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Verbinding maken met captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Time-out voor het netwerk. Wil je het opnieuw proberen?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Netwerk niet beschikbaar"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pa/strings.xml b/packages/CarrierDefaultApp/res/values-pa/strings.xml
index a044edf..36c704f 100644
--- a/packages/CarrierDefaultApp/res/values-pa/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pa/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"ਆਪਣੀ ਸੇਵਾ ਨੂੰ ਸਰਗਰਮ ਕਰੋ"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ਕੋਈ ਡੈਟਾ ਸੇਵਾ ਨਹੀਂ"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"ਆਪਣੀ ਸੇਵਾ ਨੂੰ ਸਰਗਰਮ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"ਕੈਪਟਿਵ ਪੋਰਟਲ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ਨੈੱਟਵਰਕ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ, ਕੀ ਤੁਸੀਂ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰਨਾ ਚਾਹੋਂਗੇ?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pl/strings.xml b/packages/CarrierDefaultApp/res/values-pl/strings.xml
index 2f10e5c..8bc1bf1 100644
--- a/packages/CarrierDefaultApp/res/values-pl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pl/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"Domyślna aplikacja operatora"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktywuj usługę"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Brak usługi transmisji danych"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Kliknij, by aktywować usługę"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Brak usługi. Skontaktuj się z operatorem."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Łączę z portalem przechwytującym..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Czas oczekiwania na sieć minął. Chcesz spróbować ponownie?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Sieć jest niedostępna"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml b/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml
index e730dc6..64b5632 100644
--- a/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pt-rBR/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ative seu serviço"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Sem serviço de dados"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toque para ativar seu serviço"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Sem serviço. Entre em contato com seu provedor de serviços"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Conectando-se ao portal cativo…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Tempo limite de rede. Deseja tentar novamente?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rede indisponível"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml b/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml
index a2c10e9..375e92b 100644
--- a/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pt-rPT/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ativar o seu serviço"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Sem serviço de dados"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toque para ativar o seu serviço"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Sem serviço. Contacte o seu fornecedor de serviços"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"A ligar ao portal cativo…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"O limite de tempo da rede foi excedido. Pretende tentar novamente?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rede não disponível"</string>
diff --git a/packages/CarrierDefaultApp/res/values-pt/strings.xml b/packages/CarrierDefaultApp/res/values-pt/strings.xml
index e730dc6..64b5632 100644
--- a/packages/CarrierDefaultApp/res/values-pt/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-pt/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Ative seu serviço"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Sem serviço de dados"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Toque para ativar seu serviço"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Sem serviço. Entre em contato com seu provedor de serviços"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Conectando-se ao portal cativo…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Tempo limite de rede. Deseja tentar novamente?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rede indisponível"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ro/strings.xml b/packages/CarrierDefaultApp/res/values-ro/strings.xml
index 234c410..9f1df7e 100644
--- a/packages/CarrierDefaultApp/res/values-ro/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ro/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"AplicațiePrestabilităOperator"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Activați serviciul"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Fără serviciu de date"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Atingeți pentru a activa serviciul"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Fără serviciu. Contactați furnizorul de servicii."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Se conectează la portalul captiv..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Timpul limită pentru rețea a expirat. Doriți să încercați din nou?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rețea indisponibilă"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ru/strings.xml b/packages/CarrierDefaultApp/res/values-ru/strings.xml
index b038f0f..0e4ca36 100644
--- a/packages/CarrierDefaultApp/res/values-ru/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ru/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Активируйте сервис"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Нет подключения"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Нажмите, чтобы активировать сервис"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Обратитесь к своему поставщику услуг Интернета."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Подключение к странице входа…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Время ожидания для сети истекло. Повторить попытку?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Сеть недоступна"</string>
diff --git a/packages/CarrierDefaultApp/res/values-si/strings.xml b/packages/CarrierDefaultApp/res/values-si/strings.xml
index 2f016b2..7a4e471 100644
--- a/packages/CarrierDefaultApp/res/values-si/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-si/strings.xml
@@ -2,10 +2,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"ඔබේ සේවාව සක්රිය කරන්න"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"දත්ත සේවාව නැත"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"ඔබේ සේවාව සක්රිය කිරීමට තට්ටු කරන්න"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"සේවාව නැත. කරුණාකර ඔබගේ සේවා සැපයුම්කරු අමතන්න"</string>
+ <string name="android_system_label" msgid="4571709328900953606">"Android පද්ධතිය"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"ජංගම දත්ත අවසන් වී ඇත"</string>
+ <string name="no_data_notification_id" msgid="7900410098774295500">"ජංගම දත්ත සේවාව නැත"</string>
+ <string name="portal_notification_detail" msgid="2903915627830838406">"ඔබගේ %s SIM එකට මුදල් දැමීමට තට්ටු කරන්න"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"කරුණාකර ඔබගේ සේවා සැපයුම්කරු %s අමතන්න"</string>
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"පිවිසුම් දොරටුව වෙත සබැඳෙමින්..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"ජාලය කාල නිමා විය, ඔබ යළි උත්සාහ කිරීමට කැමතිද?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"ජාලය ලබා ගත නොහැකිය"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sk/strings.xml b/packages/CarrierDefaultApp/res/values-sk/strings.xml
index 088e188..44d2d355 100644
--- a/packages/CarrierDefaultApp/res/values-sk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sk/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivujte službu"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Žiadna dátová služba"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Klepnutím aktivujete službu"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Žiadna služba, kontaktujte svojho poskytovateľa služieb"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Pripájanie k prihlasovaciemu portálu…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Vypršal časový limit siete. Chcete to skúsiť znova?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Sieť nie je k dispozícii"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sl/strings.xml b/packages/CarrierDefaultApp/res/values-sl/strings.xml
index 7ef9b7e..063cdc6 100644
--- a/packages/CarrierDefaultApp/res/values-sl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sl/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"Privzeta aplikacija operaterja"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivirajte storitev"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ni storitve za prenos podatkov"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Dotaknite se, da aktivirate storitev"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ni signala. Obrnite se na ponudnika storitev."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Povezovanje s prestreznim portalom …"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Časovna omejitev omrežja je potekla. Želite poskusiti znova?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Omrežje ni na voljo"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sq/strings.xml b/packages/CarrierDefaultApp/res/values-sq/strings.xml
index 316fe1d..d7562f0 100644
--- a/packages/CarrierDefaultApp/res/values-sq/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sq/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivizo shërbimin"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Nuk ka shërbim për të dhënat"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Trokit për të aktivizuar shërbimin"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Nuk ka shërbim, kontakto me ofruesin e shërbimit"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Po lidhet me portalin e izoluar..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Koha e pritjes së rrjetit përfundoi. Dëshiron të provosh sërish?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Rrjeti është i padisponueshëm"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sr/strings.xml b/packages/CarrierDefaultApp/res/values-sr/strings.xml
index 5c381f4..5a6e55d 100644
--- a/packages/CarrierDefaultApp/res/values-sr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sr/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Активирајте услугу"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Нема услуге преноса података"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Додирните да бисте активирали услугу"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Нема услуге. Контактирајте добављача услуге"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Повезује се са улазним порталом…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Временско ограничење мреже је истекло. Желите ли да пробате поново?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Мрежа није доступна"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sv/strings.xml b/packages/CarrierDefaultApp/res/values-sv/strings.xml
index ce21821..646b3b0 100644
--- a/packages/CarrierDefaultApp/res/values-sv/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sv/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Aktivera tjänsten"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Det finns ingen datatjänst"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Tryck för att aktivera tjänsten"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Det finns ingen tjänst. Kontakta internetleverantören."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Ansluter till infångstportal …"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Nätverkets tidsgräns nådd. Vill du försöka igen?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Nätverket är inte tillgängligt"</string>
diff --git a/packages/CarrierDefaultApp/res/values-sw/strings.xml b/packages/CarrierDefaultApp/res/values-sw/strings.xml
index 90ea014..0274865 100644
--- a/packages/CarrierDefaultApp/res/values-sw/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-sw/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Anzisha huduma yako"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Hakuna huduma ya data"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Gonga ili uanzishe huduma yako"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Hakuna Huduma, tafadhali wasiliana na mtoa huduma wako"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Inaunganisha kwenye ukurasa wa mwanzo..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Mtandao haupatikani, ungependa kujaribu tena?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Mtandao haupatikani"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ta/strings.xml b/packages/CarrierDefaultApp/res/values-ta/strings.xml
index bf836df..74e60c1 100644
--- a/packages/CarrierDefaultApp/res/values-ta/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ta/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"சேவையைச் செயல்படுத்தவும்"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"தரவுச் சேவை இல்லை"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"சேவையைச் செயல்படுத்த, தட்டவும்"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"சேவை இல்லை. உங்கள் சேவை வழங்குநரைத் தொடர்புகொள்ளவும்"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"கேப்டிவ் போர்டலுடன் இணைக்கிறது..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"நெட்வொர்க் நேரம் முடிந்தது, மீண்டும் முயல விரும்புகிறீர்களா?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"நெட்வொர்க் இல்லை"</string>
diff --git a/packages/CarrierDefaultApp/res/values-te/strings.xml b/packages/CarrierDefaultApp/res/values-te/strings.xml
index 70fe499..b28dc95 100644
--- a/packages/CarrierDefaultApp/res/values-te/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-te/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"మీ సేవని సక్రియం చేయండి"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"డేటా సేవ లేదు"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"మీ సేవని సక్రియం చేయడానికి నొక్కండి"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"సేవ లేదు, దయచేసి మీ సేవా ప్రదాతను సంప్రదించండి"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"క్యాప్టివ్ పోర్టల్కు కనెక్ట్ చేస్తోంది..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"నెట్వర్క్ గడువు సమయం ముగిసింది, మీరు మళ్లీ ప్రయత్నించాలనుకుంటున్నారా?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"నెట్వర్క్ అందుబాటులో లేదు"</string>
diff --git a/packages/CarrierDefaultApp/res/values-th/strings.xml b/packages/CarrierDefaultApp/res/values-th/strings.xml
index 66526ea..9cf6711 100644
--- a/packages/CarrierDefaultApp/res/values-th/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-th/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"เปิดใช้งานบริการของคุณ"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ไม่มีบริการข้อมูล"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"แตะเพื่อเปิดใช้งานบริการ"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"ไม่มีบริการ โปรดติดต่อผู้ให้บริการ"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"กำลังเชื่อมต่อแคพทีฟพอร์ทัล..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"หมดเวลาเชื่อมต่อเครือข่ายแล้ว ลองอีกครั้งไหม"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"เครือข่ายใช้ไม่ได้"</string>
diff --git a/packages/CarrierDefaultApp/res/values-tl/strings.xml b/packages/CarrierDefaultApp/res/values-tl/strings.xml
index d844956..06b97b6 100644
--- a/packages/CarrierDefaultApp/res/values-tl/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-tl/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"I-activate ang iyong serbisyo"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Walang serbisyo sa data"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"I-tap upang i-activate ang iyong serbisyo"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Walang Serbisyo, mangyaring makipag-ugnayan sa iyong service provider"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Kumokonekta sa captive portal..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Nag-timeout ang network, gusto mo bang subukang muli?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Hindi available ang network"</string>
diff --git a/packages/CarrierDefaultApp/res/values-tr/strings.xml b/packages/CarrierDefaultApp/res/values-tr/strings.xml
index 31c781c..ff3620a 100644
--- a/packages/CarrierDefaultApp/res/values-tr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-tr/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"VarsayılanOperatörUygulaması"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Hizmetinizi etkinleştirin"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Veri hizmeti yok"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Hizmetinizi etkinleştirmek için dokunun"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Hizmet yok, lütfen servis sağlayıcınıza başvurun"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Giriş portalına bağlanıyor..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Ağ zaman aşımı, yeniden denemek istiyor musunuz?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Ağa ulaşılamıyor"</string>
diff --git a/packages/CarrierDefaultApp/res/values-uk/strings.xml b/packages/CarrierDefaultApp/res/values-uk/strings.xml
index dfd1545..7027166 100644
--- a/packages/CarrierDefaultApp/res/values-uk/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-uk/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"Додаток оператора за умовчанням"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Активуйте з’єднання"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Немає мобільного Інтернету"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Торкніться, щоб активувати з’єднання"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Немає з’єднання. Зв’яжіться зі своїм постачальником послуг."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Під’єднання до адаптивного порталу…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Час очікування мережі минув. Повторити спробу?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Мережа недоступна"</string>
diff --git a/packages/CarrierDefaultApp/res/values-ur/strings.xml b/packages/CarrierDefaultApp/res/values-ur/strings.xml
index 3002d40..8cee27c 100644
--- a/packages/CarrierDefaultApp/res/values-ur/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ur/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"اپنی سروس فعال کریں"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"ڈیٹا سروس موجود نہیں"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"اپنی سروس فعال کرنے کے لیے تھپتھپائیں"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"سروس موجود نہیں، براہ کرم اپنے خدمت کے فراہم کنندہ سے رابطہ کریں"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"کیپٹو پورٹل سے منسلک ہو رہا ہے..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"نیٹ ورک ٹائم آؤٹ، کیا آپ دوبارہ کوشش کرنا چاہیں گے؟"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"نیٹ ورک غیر دستیاب ہے"</string>
diff --git a/packages/CarrierDefaultApp/res/values-uz/strings.xml b/packages/CarrierDefaultApp/res/values-uz/strings.xml
index 92a0af0..6fc1db1 100644
--- a/packages/CarrierDefaultApp/res/values-uz/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-uz/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Xizmatni faollashtiring"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Aloqa yo‘q"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Xizmatni faollashtirish uchun bosing"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Xizmat yo‘q. Xizmat ta’minotchisi bilan bog‘laning."</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Kirish sahifasida haqiqiylik tekshiruvi bor tarmoqqa ulanilmoqda…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Tarmoq uchun kutish vaqti tugadi. Qayta urinilsinmi?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Tarmoq mavjud emas"</string>
diff --git a/packages/CarrierDefaultApp/res/values-vi/strings.xml b/packages/CarrierDefaultApp/res/values-vi/strings.xml
index 06ea6f0..561f66f 100644
--- a/packages/CarrierDefaultApp/res/values-vi/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-vi/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Kích hoạt dịch vụ của bạn"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Không có dịch vụ dữ liệu"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Nhấn để kích hoạt dịch vụ của bạn"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Không có dịch vụ, vui lòng liên hệ với nhà cung cấp dịch vụ của bạn"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Đang kết nối với cổng cố định..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Hết thời gian chờ mạng, bạn có muốn thử lại không?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Mạng không khả dụng"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml
index 6734a31..fb8e7d2 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rCN/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"运营商默认应用"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"启用您的服务"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"没有数据服务"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"点按即可启用您的服务"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"没有服务,请与您的服务提供商联系"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"正在连接到强制门户…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"网络超时,要重试吗?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"无法连接到网络"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
index c74d543..5162d7b 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rHK/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"啟用服務"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"沒有數據服務"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"輕按即可啟用服務"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"沒有服務,請聯絡您的服務供應商"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"正在連接至強制網絡入口…"</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"網絡逾時,要再試一次嗎?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"無法使用網絡"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
index cbe677d..cecbfb2 100644
--- a/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zh-rTW/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"電信業者預設應用程式"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"啟用服務"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"沒有數據服務"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"輕觸即可啟用服務"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"沒有服務,請與你的服務供應商聯絡"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"正在連線至網頁認證入口..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"網路逾時,你要重試嗎?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"無法連上網路"</string>
diff --git a/packages/CarrierDefaultApp/res/values-zu/strings.xml b/packages/CarrierDefaultApp/res/values-zu/strings.xml
index 12e8a7d..16d87b4 100644
--- a/packages/CarrierDefaultApp/res/values-zu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-zu/strings.xml
@@ -2,10 +2,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
- <string name="portal_notification_id" msgid="267536768510843288">"Sebenzisa isevisi yakho"</string>
- <string name="no_data_notification_id" msgid="5216950045164991172">"Ayikho isevisi yedatha"</string>
- <string name="portal_notification_detail" msgid="2860620550281695686">"Thepha ukuze usebenzise isevisi yakho"</string>
- <string name="no_data_notification_detail" msgid="1757413358517680719">"Ayikho isevisi, sicela uxhumane nomhlinzeki wakho wesevisi"</string>
+ <!-- no translation found for android_system_label (4571709328900953606) -->
+ <skip />
+ <!-- no translation found for portal_notification_id (5155057562457079297) -->
+ <skip />
+ <!-- no translation found for no_data_notification_id (7900410098774295500) -->
+ <skip />
+ <!-- no translation found for portal_notification_detail (2903915627830838406) -->
+ <skip />
+ <!-- no translation found for no_data_notification_detail (3112125343857014825) -->
+ <skip />
<string name="progress_dialogue_network_connection" msgid="4964125154591905581">"Ixhuma kuphothali yabathunjiweyo..."</string>
<string name="alert_dialogue_network_timeout" msgid="4515760047815901797">"Ukuphela kwesikhathi senethiwekhi, ungathanda ukuzama futhi?"</string>
<string name="alert_dialogue_network_timeout_title" msgid="3117252205484891837">"Inethiwekhi ayitholakali"</string>
diff --git a/packages/CarrierDefaultApp/res/values/strings.xml b/packages/CarrierDefaultApp/res/values/strings.xml
index 838ff39..f904600 100644
--- a/packages/CarrierDefaultApp/res/values/strings.xml
+++ b/packages/CarrierDefaultApp/res/values/strings.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CarrierDefaultApp</string>
- <string name="portal_notification_id">Activate your service</string>
- <string name="no_data_notification_id">No data service</string>
- <string name="portal_notification_detail">Tap to activate your service</string>
- <string name="no_data_notification_detail">No Service, please contact your service provider</string>
+ <string name="android_system_label">Mobile Carrier</string>
+ <string name="portal_notification_id">Mobile data has run out</string>
+ <string name="no_data_notification_id">Your mobile data has been deactivated</string>
+ <string name="portal_notification_detail">Tap to visit the %s website</string>
+ <string name="no_data_notification_detail">Please contact your service provider %s</string>
<string name="progress_dialogue_network_connection">Connecting to captive portal...</string>
<string name="alert_dialogue_network_timeout">Network timeout, would you like to retry?</string>
<string name="alert_dialogue_network_timeout_title">Network unavailable</string>
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
index db4890f..d9bd2fc 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.os.Bundle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -146,18 +147,25 @@
private static Notification getNotification(Context context, int titleId, int textId,
PendingIntent pendingIntent) {
- Resources resources = context.getResources();
+ final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
+ final Resources resources = context.getResources();
+ final Bundle extras = Bundle.forPair(Notification.EXTRA_SUBSTITUTE_APP_NAME,
+ resources.getString(R.string.android_system_label));
Notification.Builder builder = new Notification.Builder(context)
.setContentTitle(resources.getString(titleId))
- .setContentText(resources.getString(textId))
+ .setContentText(String.format(resources.getString(textId),
+ telephonyMgr.getNetworkOperatorName()))
.setSmallIcon(R.drawable.ic_sim_card)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
.setOngoing(true)
.setPriority(Notification.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_ALL)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setLocalOnly(true)
.setWhen(System.currentTimeMillis())
- .setShowWhen(false);
+ .setShowWhen(false)
+ .setExtras(extras);
if (pendingIntent != null) {
builder.setContentIntent(pendingIntent);
diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml
index 65cac09..34bc4eb 100644
--- a/packages/CompanionDeviceManager/AndroidManifest.xml
+++ b/packages/CompanionDeviceManager/AndroidManifest.xml
@@ -26,6 +26,8 @@
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<application
android:allowClearUserData="true"
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
index 12bab18..14b9de5 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
@@ -16,10 +16,9 @@
package com.android.companiondevicemanager;
-import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayName;
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress;
import android.app.Activity;
-import android.bluetooth.BluetoothDevice;
import android.companion.CompanionDeviceManager;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -34,6 +33,8 @@
import android.widget.ProgressBar;
import android.widget.TextView;
+import com.android.companiondevicemanager.DeviceDiscoveryService.DeviceFilterPair;
+
public class DeviceChooserActivity extends Activity {
private static final boolean DEBUG = false;
@@ -55,11 +56,11 @@
if (getService().mRequest.isSingleDevice()) {
setContentView(R.layout.device_confirmation);
- final BluetoothDevice selectedDevice = getService().mDevicesFound.get(0);
+ final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0);
setTitle(Html.fromHtml(getString(
R.string.confirmation_title,
getCallingAppName(),
- getDeviceDisplayName(selectedDevice)), 0));
+ selectedDevice.getDisplayName()), 0));
getService().mSelectedDevice = selectedDevice;
} else {
setContentView(R.layout.device_chooser);
@@ -127,10 +128,11 @@
return DeviceDiscoveryService.sInstance;
}
- protected void onPairTapped(BluetoothDevice selectedDevice) {
- getService().onDeviceSelected(getCallingPackage(), selectedDevice.getAddress());
+ protected void onPairTapped(DeviceFilterPair selectedDevice) {
+ getService().onDeviceSelected(
+ getCallingPackage(), getDeviceMacAddress(selectedDevice.device));
setResult(RESULT_OK,
- new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice));
+ new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice.device));
finish();
}
}
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
index f0f9108..e1e60bb 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java
@@ -16,8 +16,10 @@
package com.android.companiondevicemanager;
-import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayName;
-import static android.companion.BluetoothLEDeviceFilter.nullsafe;
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceDisplayNameInternal;
+import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress;
+
+import static com.android.internal.util.ArrayUtils.isEmpty;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -32,28 +34,38 @@
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.companion.AssociationRequest;
+import android.companion.BluetoothDeviceFilter;
+import android.companion.BluetoothDeviceFilterUtils;
import android.companion.BluetoothLEDeviceFilter;
import android.companion.CompanionDeviceManager;
+import android.companion.DeviceFilter;
import android.companion.ICompanionDeviceDiscoveryService;
import android.companion.ICompanionDeviceDiscoveryServiceCallback;
import android.companion.IFindDeviceCallback;
+import android.companion.WifiDeviceFilter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
+import android.net.wifi.WifiManager;
import android.os.IBinder;
+import android.os.Parcelable;
import android.os.RemoteException;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.Preconditions;
+
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
+import java.util.Objects;
public class DeviceDiscoveryService extends Service {
@@ -63,12 +75,16 @@
static DeviceDiscoveryService sInstance;
private BluetoothAdapter mBluetoothAdapter;
- private BluetoothLEDeviceFilter mFilter;
- private ScanFilter mScanFilter;
+ private WifiManager mWifiManager;
private ScanSettings mDefaultScanSettings = new ScanSettings.Builder().build();
- AssociationRequest<?> mRequest;
- List<BluetoothDevice> mDevicesFound;
- BluetoothDevice mSelectedDevice;
+ private List<DeviceFilter<?>> mFilters;
+ private List<BluetoothLEDeviceFilter> mBLEFilters;
+ private List<BluetoothDeviceFilter> mBluetoothFilters;
+ private List<WifiDeviceFilter> mWifiFilters;
+ private List<ScanFilter> mBLEScanFilters;
+ AssociationRequest mRequest;
+ List<DeviceFilterPair> mDevicesFound;
+ DeviceFilterPair mSelectedDevice;
DevicesAdapter mDevicesAdapter;
IFindDeviceCallback mFindCallback;
ICompanionDeviceDiscoveryServiceCallback mServiceCallback;
@@ -95,11 +111,13 @@
private final ScanCallback mBLEScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
- final BluetoothDevice device = result.getDevice();
+ final DeviceFilterPair<ScanResult> deviceFilterPair
+ = DeviceFilterPair.findMatch(result, mBLEFilters);
+ if (deviceFilterPair == null) return;
if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) {
- onDeviceLost(device);
+ onDeviceLost(deviceFilterPair);
} else {
- onDeviceFound(device);
+ onDeviceFound(deviceFilterPair);
}
}
};
@@ -109,18 +127,38 @@
private BroadcastReceiver mBluetoothDeviceFoundBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- final BluetoothDevice device = intent.getParcelableExtra(
- BluetoothDevice.EXTRA_DEVICE);
- if (!mFilter.matches(device)) return; // ignore device
-
+ final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ final DeviceFilterPair<BluetoothDevice> deviceFilterPair
+ = DeviceFilterPair.findMatch(device, mBluetoothFilters);
+ if (deviceFilterPair == null) return;
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
- onDeviceFound(device);
+ onDeviceFound(deviceFilterPair);
} else {
- onDeviceLost(device);
+ onDeviceLost(deviceFilterPair);
}
}
};
+ private BroadcastReceiver mWifiDeviceFoundBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
+ List<android.net.wifi.ScanResult> scanResults = mWifiManager.getScanResults();
+
+ if (DEBUG) {
+ Log.i(LOG_TAG, "Wifi scan results: " + TextUtils.join("\n", scanResults));
+ }
+
+ for (int i = 0; i < scanResults.size(); i++) {
+ DeviceFilterPair<android.net.wifi.ScanResult> deviceFilterPair =
+ DeviceFilterPair.findMatch(scanResults.get(i), mWifiFilters);
+ if (deviceFilterPair != null) onDeviceFound(deviceFilterPair);
+ }
+ }
+
+ }
+ };
+
@Override
public IBinder onBind(Intent intent) {
if (DEBUG) Log.i(LOG_TAG, "onBind(" + intent + ")");
@@ -135,6 +173,7 @@
mBluetoothAdapter = getSystemService(BluetoothManager.class).getAdapter();
mBLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
+ mWifiManager = getSystemService(WifiManager.class);
mDevicesFound = new ArrayList<>();
mDevicesAdapter = new DevicesAdapter();
@@ -142,23 +181,39 @@
sInstance = this;
}
- private void startDiscovery(AssociationRequest<?> request) {
- //TODO support other protocols as well
+ private void startDiscovery(AssociationRequest request) {
mRequest = request;
- mFilter = nullsafe((BluetoothLEDeviceFilter) request.getDeviceFilter());
- mScanFilter = mFilter.getScanFilter();
+
+ mFilters = request.getDeviceFilters();
+ mWifiFilters = ArrayUtils.filter(mFilters, WifiDeviceFilter.class);
+ mBluetoothFilters = ArrayUtils.filter(mFilters, BluetoothDeviceFilter.class);
+ mBLEFilters = ArrayUtils.filter(mFilters, BluetoothLEDeviceFilter.class);
+ mBLEScanFilters = ArrayUtils.map(mBLEFilters, BluetoothLEDeviceFilter::getScanFilter);
reset();
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
- intentFilter.addAction(BluetoothDevice.ACTION_DISAPPEARED);
+ if (shouldScan(mBluetoothFilters)) {
+ final IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
+ intentFilter.addAction(BluetoothDevice.ACTION_DISAPPEARED);
- registerReceiver(mBluetoothDeviceFoundBroadcastReceiver, intentFilter);
- mBluetoothAdapter.startDiscovery();
+ registerReceiver(mBluetoothDeviceFoundBroadcastReceiver, intentFilter);
+ mBluetoothAdapter.startDiscovery();
+ }
- mBLEScanner.startScan(
- Collections.singletonList(mScanFilter), mDefaultScanSettings, mBLEScanCallback);
+ if (shouldScan(mBLEFilters)) {
+ mBLEScanner.startScan(mBLEScanFilters, mDefaultScanSettings, mBLEScanCallback);
+ }
+
+ if (shouldScan(mWifiFilters)) {
+ registerReceiver(mWifiDeviceFoundBroadcastReceiver,
+ new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+ mWifiManager.startScan();
+ }
+ }
+
+ private boolean shouldScan(List<? extends DeviceFilter> mediumSpecificFilters) {
+ return !isEmpty(mediumSpecificFilters) || isEmpty(mFilters);
}
private void reset() {
@@ -178,25 +233,18 @@
mBluetoothAdapter.cancelDiscovery();
mBLEScanner.stopScan(mBLEScanCallback);
unregisterReceiver(mBluetoothDeviceFoundBroadcastReceiver);
+ unregisterReceiver(mWifiDeviceFoundBroadcastReceiver);
stopSelf();
}
- private void onDeviceFound(BluetoothDevice device) {
+ private void onDeviceFound(@Nullable DeviceFilterPair device) {
if (mDevicesFound.contains(device)) {
return;
}
- if (DEBUG) {
- Log.i(LOG_TAG, "Considering device " + getDeviceDisplayName(device));
- }
+ if (DEBUG) Log.i(LOG_TAG, "Found device " + device.getDisplayName() + " "
+ + getDeviceMacAddress(device.device));
- if (!mFilter.matches(device)) {
- return;
- }
-
- if (DEBUG) {
- Log.i(LOG_TAG, "Found device " + getDeviceDisplayName(device));
- }
if (mDevicesFound.isEmpty()) {
onReadyToShowUI();
}
@@ -217,12 +265,10 @@
}
}
- private void onDeviceLost(BluetoothDevice device) {
+ private void onDeviceLost(@Nullable DeviceFilterPair device) {
mDevicesFound.remove(device);
mDevicesAdapter.notifyDataSetChanged();
- if (DEBUG) {
- Log.i(LOG_TAG, "Lost device " + getDeviceDisplayName(device));
- }
+ if (DEBUG) Log.i(LOG_TAG, "Lost device " + device.getDisplayName());
}
void onDeviceSelected(String callingPackage, String deviceAddress) {
@@ -236,7 +282,8 @@
}
}
- class DevicesAdapter extends ArrayAdapter<BluetoothDevice> {
+ class DevicesAdapter extends ArrayAdapter<DeviceFilterPair> {
+ //TODO wifi icon
private Drawable BLUETOOTH_ICON = icon(android.R.drawable.stat_sys_data_bluetooth);
private Drawable icon(int drawableRes) {
@@ -261,8 +308,8 @@
return view;
}
- private void bind(TextView textView, BluetoothDevice device) {
- textView.setText(getDeviceDisplayName(device));
+ private void bind(TextView textView, DeviceFilterPair device) {
+ textView.setText(device.getDisplayName());
textView.setBackgroundColor(
device.equals(mSelectedDevice)
? Color.GRAY
@@ -285,4 +332,62 @@
return textView;
}
}
+
+ /**
+ * A pair of device and a filter that matched this device if any.
+ *
+ * @param <T> device type
+ */
+ static class DeviceFilterPair<T extends Parcelable> {
+ public final T device;
+ @Nullable
+ public final DeviceFilter<T> filter;
+
+ private DeviceFilterPair(T device, @Nullable DeviceFilter<T> filter) {
+ this.device = device;
+ this.filter = filter;
+ }
+
+ /**
+ * {@code (device, null)} if the filters list is empty or null
+ * {@code null} if none of the provided filters match the device
+ * {@code (device, filter)} where filter is among the list of filters and matches the device
+ */
+ @Nullable
+ public static <T extends Parcelable> DeviceFilterPair<T> findMatch(
+ T dev, @Nullable List<? extends DeviceFilter<T>> filters) {
+ if (isEmpty(filters)) return new DeviceFilterPair<>(dev, null);
+ final DeviceFilter<T> matchingFilter = ArrayUtils.find(filters, (f) -> f.matches(dev));
+ return matchingFilter != null ? new DeviceFilterPair<>(dev, matchingFilter) : null;
+ }
+
+ public String getDisplayName() {
+ if (filter == null) {
+ Preconditions.checkNotNull(device);
+ if (device instanceof BluetoothDevice) {
+ return getDeviceDisplayNameInternal((BluetoothDevice) device);
+ } else if (device instanceof android.net.wifi.ScanResult) {
+ return getDeviceDisplayNameInternal((android.net.wifi.ScanResult) device);
+ } else if (device instanceof ScanResult) {
+ return getDeviceDisplayNameInternal(((ScanResult) device).getDevice());
+ } else {
+ throw new IllegalArgumentException("Unknown device type: " + device.getClass());
+ }
+ }
+ return filter.getDeviceDisplayName(device);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DeviceFilterPair<?> that = (DeviceFilterPair<?>) o;
+ return Objects.equals(getDeviceMacAddress(device), getDeviceMacAddress(that.device));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getDeviceMacAddress(device));
+ }
+ }
}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 3cc9f65e..8802010 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -19,24 +19,14 @@
import android.annotation.Nullable;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
import android.content.UriPermission;
-import android.content.pm.ParceledListSlice;
-import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.MatrixCursor.RowBuilder;
-import android.graphics.Point;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
-import android.os.CancellationSignal;
import android.os.Environment;
-import android.os.FileObserver;
-import android.os.FileUtils;
-import android.os.Handler;
-import android.os.ParcelFileDescriptor;
-import android.os.ParcelFileDescriptor.OnCloseListener;
import android.os.UserHandle;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
@@ -45,15 +35,12 @@
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Path;
import android.provider.DocumentsContract.Root;
-import android.provider.DocumentsProvider;
-import android.provider.MediaStore;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.DebugUtils;
import android.util.Log;
import android.util.Pair;
-import android.webkit.MimeTypeMap;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.FileSystemProvider;
@@ -62,10 +49,8 @@
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
-import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
-import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
@@ -408,7 +393,7 @@
}
@Override
- public Path findDocumentPath(String childDocId, @Nullable String parentDocId)
+ public Path findDocumentPath(@Nullable String parentDocId, String childDocId)
throws FileNotFoundException {
final Pair<RootInfo, File> resolvedDocId = resolveDocId(childDocId, false);
final RootInfo root = resolvedDocId.first;
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index b8c10a6..e60b5a9 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -435,7 +435,7 @@
}
@Override
- public Path findDocumentPath(String childDocumentId, String parentDocumentId)
+ public Path findDocumentPath(String parentDocumentId, String childDocumentId)
throws FileNotFoundException {
final LinkedList<String> ids = new LinkedList<>();
final Identifier childIdentifier = mDatabase.createIdentifier(childDocumentId);
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
index 491e24d..29783e4 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
@@ -35,7 +35,6 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedList;
-import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.TimeoutException;
@@ -802,7 +801,7 @@
setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") });
setupHierarchyDocuments("1");
- final Path path = mProvider.findDocumentPath("15", null);
+ final Path path = mProvider.findDocumentPath(null, "15");
assertEquals("1", path.getRootId());
assertEquals(4, path.getPath().size());
assertEquals("1", path.getPath().get(0));
@@ -816,7 +815,7 @@
setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") });
setupHierarchyDocuments("1");
- final Path path = mProvider.findDocumentPath("18", "3");
+ final Path path = mProvider.findDocumentPath("3", "18");
assertNull(path.getRootId());
assertEquals(3, path.getPath().size());
assertEquals("3", path.getPath().get(0));
@@ -831,7 +830,7 @@
new MtpRoot(0, 1, "Storage B", 1000, 1000, "") });
setupHierarchyDocuments("2");
- final Path path = mProvider.findDocumentPath("16", null);
+ final Path path = mProvider.findDocumentPath(null, "16");
assertEquals("2", path.getRootId());
assertEquals(4, path.getPath().size());
assertEquals("2", path.getPath().get(0));
@@ -847,7 +846,7 @@
new MtpRoot(0, 1, "Storage B", 1000, 1000, "") });
setupHierarchyDocuments("2");
- final Path path = mProvider.findDocumentPath("19", "4");
+ final Path path = mProvider.findDocumentPath("4", "19");
assertNull(path.getRootId());
assertEquals(3, path.getPath().size());
assertEquals("4", path.getPath().get(0));
diff --git a/packages/Osu/src/com/android/hotspot2/app/OSUService.java b/packages/Osu/src/com/android/hotspot2/app/OSUService.java
index 62a203d..e9da113 100644
--- a/packages/Osu/src/com/android/hotspot2/app/OSUService.java
+++ b/packages/Osu/src/com/android/hotspot2/app/OSUService.java
@@ -46,8 +46,9 @@
private static final String[] INTENTS = {
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION,
- WifiManager.PASSPOINT_WNM_FRAME_RECEIVED_ACTION,
- WifiManager.PASSPOINT_ICON_RECEIVED_ACTION,
+ // TODO(b/32883320): use updated intent definitions.
+ //WifiManager.PASSPOINT_WNM_FRAME_RECEIVED_ACTION,
+ //WifiManager.PASSPOINT_ICON_RECEIVED_ACTION,
WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION,
WifiManager.WIFI_STATE_CHANGED_ACTION,
WifiManager.NETWORK_STATE_CHANGED_ACTION,
@@ -120,6 +121,8 @@
case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION:
mOsuManager.pushScanResults(wifiManager.getScanResults());
break;
+ // TODO(b/32883320): use updated intent definitions.
+ /*
case WifiManager.PASSPOINT_WNM_FRAME_RECEIVED_ACTION:
long bssid = bundle.getLong(WifiManager.EXTRA_PASSPOINT_WNM_BSSID);
String url = bundle.getString(WifiManager.EXTRA_PASSPOINT_WNM_URL);
@@ -157,6 +160,7 @@
bundle.getString(WifiManager.EXTRA_PASSPOINT_ICON_FILE),
bundle.getByteArray(WifiManager.EXTRA_PASSPOINT_ICON_DATA));
break;
+ */
case WifiManager.NETWORK_STATE_CHANGED_ACTION:
mOsuManager.networkConnectChange(
(WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO));
diff --git a/packages/SettingsLib/tests/integ/Android.mk b/packages/SettingsLib/tests/integ/Android.mk
index 091f965..60d1c77 100644
--- a/packages/SettingsLib/tests/integ/Android.mk
+++ b/packages/SettingsLib/tests/integ/Android.mk
@@ -22,6 +22,8 @@
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
+LOCAL_JACK_FLAGS := --multi-dex native
+
LOCAL_PACKAGE_NAME := SettingsLibTests
LOCAL_STATIC_JAVA_LIBRARIES := \
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
index 8cfec7a..594a294 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
@@ -44,10 +44,9 @@
import android.view.inputmethod.InputMethodInfo;
import com.android.settingslib.BaseTest;
-import org.hamcrest.Description;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.compat.ArgumentMatcher;
import java.util.ArrayList;
import java.util.List;
@@ -249,7 +248,7 @@
}
@Override
- public boolean matches(Object argument) {
+ public boolean matchesObject(Object argument) {
if (argument instanceof Intent) {
return ((Intent) argument).filterEquals(mIntent);
}
@@ -257,8 +256,8 @@
}
@Override
- public void describeTo(Description description) {
- description.appendText("Expected: " + mIntent);
+ public String toString() {
+ return "Expected: " + mIntent;
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 0676efd..4a54c0e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -240,8 +240,8 @@
Settings.Global.HDMI_CONTROL_ENABLED,
GlobalSettingsProto.HDMI_CONTROL_ENABLED);
dumpSetting(s, p,
- Settings.Global.HDMI_SYSTEM_AUDIO_ENABLED,
- GlobalSettingsProto.HDMI_SYSTEM_AUDIO_ENABLED);
+ Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
+ GlobalSettingsProto.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED);
dumpSetting(s, p,
Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
GlobalSettingsProto.HDMI_CONTROL_AUTO_WAKEUP_ENABLED);
@@ -976,8 +976,8 @@
Settings.Secure.VOICE_INTERACTION_SERVICE,
SecureSettingsProto.VOICE_INTERACTION_SERVICE);
dumpSetting(s, p,
- Settings.Secure.AUTO_FILL_SERVICE,
- SecureSettingsProto.AUTO_FILL_SERVICE);
+ Settings.Secure.AUTOFILL_SERVICE,
+ SecureSettingsProto.AUTOFILL_SERVICE);
dumpSetting(s, p,
Settings.Secure.BLUETOOTH_HCI_LOG,
SecureSettingsProto.BLUETOOTH_HCI_LOG);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 0916abe..91a4e79 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -1578,8 +1578,14 @@
}
private List<String> getSettingsNamesLocked(int settingsType, int userId) {
- ApplicationInfo ai = getCallingApplicationInfoOrThrow(userId);
- if (ai.isInstantApp()) {
+ boolean instantApp;
+ if (UserHandle.getAppId(Binder.getCallingUid()) < Process.FIRST_APPLICATION_UID) {
+ instantApp = false;
+ } else {
+ ApplicationInfo ai = getCallingApplicationInfoOrThrow();
+ instantApp = ai.isInstantApp();
+ }
+ if (instantApp) {
return new ArrayList<String>(getInstantAppAccessibleSettings(settingsType));
} else {
return mSettingsRegistry.getSettingsNamesLocked(settingsType, userId);
@@ -1590,7 +1596,7 @@
if (UserHandle.getAppId(Binder.getCallingUid()) < Process.FIRST_APPLICATION_UID) {
return;
}
- ApplicationInfo ai = getCallingApplicationInfoOrThrow(userId);
+ ApplicationInfo ai = getCallingApplicationInfoOrThrow();
if (!ai.isInstantApp()) {
return;
}
@@ -1600,10 +1606,16 @@
}
}
- private ApplicationInfo getCallingApplicationInfoOrThrow(int userId) {
+ private ApplicationInfo getCallingApplicationInfoOrThrow() {
+ // We always use the callingUid for this lookup. This means that if hypothetically an
+ // app was installed in user A with cross user and in user B as an Instant App
+ // the app in A would be able to see all the settings in user B. However since cross
+ // user is a system permission and the app must be uninstalled in B and then installed as
+ // an Instant App that situation is not realistic or supported.
ApplicationInfo ai = null;
try {
- ai = mPackageManager.getApplicationInfo(getCallingPackage(), 0 , userId);
+ ai = mPackageManager.getApplicationInfo(getCallingPackage(), 0
+ , UserHandle.getCallingUserId());
} catch (RemoteException ignored) {
}
if (ai == null) {
diff --git a/packages/Shell/res/drawable/ic_bug_report_black_24dp.xml b/packages/Shell/res/drawable/ic_bug_report_black_24dp.xml
new file mode 100644
index 0000000..a102cee
--- /dev/null
+++ b/packages/Shell/res/drawable/ic_bug_report_black_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"
+ android:fillColor="#000000"/>
+</vector>
diff --git a/packages/Shell/res/values/strings.xml b/packages/Shell/res/values/strings.xml
index 2a5703a..1c49a55d 100644
--- a/packages/Shell/res/values/strings.xml
+++ b/packages/Shell/res/values/strings.xml
@@ -4,9 +4,9 @@
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.
@@ -16,6 +16,9 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label">Shell</string>
+ <!-- Title of notification channel for bug report related notifications. [CHAR LIMIT=50] -->
+ <string name="bugreport_notification_channel">Bug reports</string>
+
<!-- Title of notification indicating a bugreport is being generated. [CHAR LIMIT=50] -->
<string name="bugreport_in_progress_title">Bug report <xliff:g id="id">#%d</xliff:g> is being generated</string>
<!-- Title of notification indicating a bugreport has been successfully captured. [CHAR LIMIT=50] -->
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 1df626f..bf5e6f8 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -57,6 +57,7 @@
import android.app.AlertDialog;
import android.app.Notification;
import android.app.Notification.Action;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -64,6 +65,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -196,6 +198,8 @@
*/
private static final String SCREENSHOT_DIR = "bugreports";
+ private static final String NOTIFICATION_CHANNEL_ID = "bugreports";
+
/** Managed dumpstate processes (keyed by id) */
private final SparseArray<DumpstateListener> mProcesses = new SparseArray<>();
@@ -240,6 +244,12 @@
final Configuration conf = mContext.getResources().getConfiguration();
mIsWatch = (conf.uiMode & Configuration.UI_MODE_TYPE_MASK) ==
Configuration.UI_MODE_TYPE_WATCH;
+ NotificationManager nm = NotificationManager.from(mContext);
+ nm.createNotificationChannel(
+ new NotificationChannel(NOTIFICATION_CHANNEL_ID,
+ mContext.getString(R.string.bugreport_notification_channel),
+ isTv(this) ? NotificationManager.IMPORTANCE_DEFAULT
+ : NotificationManager.IMPORTANCE_LOW));
}
@Override
@@ -1008,13 +1018,16 @@
sNotificationBundle.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
context.getString(com.android.internal.R.string.android_system_label));
}
- return new Notification.Builder(context)
+ return new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
.addExtras(sNotificationBundle)
.setCategory(Notification.CATEGORY_SYSTEM)
- .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setSmallIcon(
+ isTv(context) ? R.drawable.ic_bug_report_black_24dp
+ : com.android.internal.R.drawable.stat_sys_adb)
.setLocalOnly(true)
.setColor(context.getColor(
- com.android.internal.R.color.system_notification_accent_color));
+ com.android.internal.R.color.system_notification_accent_color))
+ .extend(new Notification.TvExtender());
}
/**
@@ -1333,6 +1346,10 @@
return false;
}
+ private static boolean isTv(Context context) {
+ return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
+ }
+
/**
* Checks whether a character is valid on bugreport names.
*/
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index b2e2a2c..428b7b8 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -177,6 +177,9 @@
<uses-permission android:name="android.permission.MODIFY_THEME_OVERLAY" />
+ <!-- accessibility -->
+ <uses-permission android:name="android.permission.MODIFY_ACCESSIBILITY_DATA" />
+
<application
android:name=".SystemUIApplication"
android:persistent="true"
@@ -300,20 +303,6 @@
</intent-filter>
</activity>
- <activity android:name=".recents.tv.RecentsTvActivity"
- android:label="@string/accessibility_desc_recent_apps"
- android:exported="false"
- android:launchMode="singleInstance"
- android:excludeFromRecents="true"
- android:stateNotNeeded="true"
- android:resumeWhilePausing="true"
- android:screenOrientation="behind"
- android:theme="@style/RecentsTvTheme.Wallpaper">
- <intent-filter>
- <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" />
- </intent-filter>
- </activity>
-
<activity
android:name=".stackdivider.ForcedResizableInfoActivity"
android:theme="@style/ForcedResizableTheme"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index fc0b568..51adc1e 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -28,25 +28,42 @@
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
androidprv:layout_maxHeight="@dimen/keyguard_security_height"
android:gravity="center_horizontal|top">
- <LinearLayout
+ <RelativeLayout
android:id="@+id/keyguard_clock_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|top"
- android:orientation="vertical" >
+ android:layout_gravity="center_horizontal|top">
<TextClock
android:id="@+id/clock_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentTop="true"
android:textColor="@color/clock_white"
android:singleLine="true"
style="@style/widget_big_thin"
android:format12Hour="@string/keyguard_widget_12_hours_format"
android:format24Hour="@string/keyguard_widget_24_hours_format"
android:layout_marginBottom="@dimen/bottom_text_spacing_digital" />
+ <com.android.systemui.ChargingView
+ android:id="@+id/battery_doze"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/clock_view"
+ android:layout_alignBottom="@id/clock_view"
+ android:layout_toEndOf="@id/clock_view"
+ android:visibility="invisible"
+ android:src="@drawable/ic_aod_charging_24dp"
+ android:contentDescription="@string/accessibility_ambient_display_charging"
+ />
- <include layout="@layout/keyguard_status_area" />
+ <include layout="@layout/keyguard_status_area"
+ android:id="@+id/keyguard_status_area"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/clock_view" />
+
<TextView
android:id="@+id/owner_info"
android:layout_marginLeft="16dp"
@@ -54,12 +71,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/date_owner_info_margin"
- android:layout_gravity="center_horizontal"
+ android:layout_centerHorizontal="true"
+ android:layout_below="@id/keyguard_status_area"
android:textColor="@color/clock_gray"
android:textSize="@dimen/widget_label_font_size"
android:letterSpacing="0.05"
android:ellipsize="marquee"
android:singleLine="true" />
- </LinearLayout>
+ </RelativeLayout>
</com.android.keyguard.KeyguardStatusView>
diff --git a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml
deleted file mode 100644
index 52e3a04..0000000
--- a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
- <objectAnimator
- android:propertyName="translationY"
- android:valueTo="0dp"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
- <objectAnimator
- android:propertyName="scaleX"
- android:valueTo="1.0"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
- <objectAnimator
- android:propertyName="scaleY"
- android:valueTo="1.0"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
-</set>
diff --git a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_loss_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_loss_animation.xml
deleted file mode 100644
index b571aa5..0000000
--- a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_loss_animation.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
- <objectAnimator
- android:propertyName="translationY"
- android:valueTo="-57dp"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
- <objectAnimator
- android:propertyName="scaleX"
- android:valueTo="0.7"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
- <objectAnimator
- android:propertyName="scaleY"
- android:valueTo="0.7"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="@integer/recents_tv_pip_focus_anim_duration" />
-</set>
diff --git a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml
deleted file mode 100644
index 257bf35..0000000
--- a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:propertyName="alpha"
- android:valueTo="1"
- android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="100" />
diff --git a/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml b/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml
new file mode 100644
index 0000000..6134b8f
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_aod_charging_24dp.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M11.0,22.98l0.0,-8.98 -4.0,0.0 6.0,-13.0 0.0,9.0 4.0,0.0z"
+ android:fillColor="#ffffff"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/pip_expand_ll.xml b/packages/SystemUI/res/drawable/pip_expand_ll.xml
new file mode 100644
index 0000000..a8b82b5
--- /dev/null
+++ b/packages/SystemUI/res/drawable/pip_expand_ll.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="60dp"
+ android:height="60dp"
+ android:viewportWidth="60"
+ android:viewportHeight="60">
+
+ <path
+ android:fillColor="#fff"
+ android:pathData="M7.5,52h45a5,5,0,0,0,5-5V12.95A5,5,0,0,0,52.5,8H7.5a5,5,0,0,0-5,4.95V47A5,5,0,0,0,7.5,52Zm-1-5V13a1,1,0,0,1,1-1h45a1,1,0,0,1,1,1V47a1,1,0,0,1-1,1H7.5A1,1,0,0,1,6.5,47Z" />
+ <path
+ android:pathData="M0,0V60H60V0H0Z" />
+ <path
+ android:fillColor="#fff"
+ android:pathData="M35,39.14v2a1,1,0,0,0,1,1H46.5a1,1,0,0,0,1-1V30.64a1,1,0,0,0-1-1h-2a1,1,0,0,0-1,1v7.5H36A1,1,0,0,0,35,39.14Z" />
+ <path
+ android:fillColor="#fff"
+ android:pathData="M13.5,30.36h2a1,1,0,0,0,1-1v-7.5H24a1,1,0,0,0,1-1v-2a1,1,0,0,0-1-1H13.5a1,1,0,0,0-1,1v10.5A1,1,0,0,0,13.5,30.36Z" />
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/pip_expand_lr.xml b/packages/SystemUI/res/drawable/pip_expand_lr.xml
new file mode 100644
index 0000000..44d97ef
--- /dev/null
+++ b/packages/SystemUI/res/drawable/pip_expand_lr.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="60dp"
+ android:height="60dp"
+ android:viewportWidth="60"
+ android:viewportHeight="60">
+
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M57.5,47V12.95c0-2.75-2.25-4.95-5-4.95h-45c-2.75,0-5,2.2-5,4.95V47c0,2.75,2.25,5,5,5h45
+C55.25,52,57.5,49.75,57.5,47z
+M52.5,48h-45c-0.55,0-1-0.45-1-1V13c0-0.55,0.45-1,1-1h45c0.55,0,1,0.45,1,1v34
+C53.5,47.55,53.05,48,52.5,48z" />
+ <path
+ android:pathData="M60,0v60H0L0,0L60,0z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M25,39.14v2c0,0.55-0.45,1-1,1H13.5c-0.55,0-1-0.45-1-1v-10.5c0-0.55,0.45-1,1-1h2c0.55,0,1,0.45,1,1v7.5
+H24C24.55,38.14,25,38.59,25,39.14z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M46.5,30.36h-2c-0.55,0-1-0.45-1-1v-7.5H36c-0.55,0-1-0.45-1-1v-2c0-0.55,0.45-1,1-1h10.5
+c0.55,0,1,0.45,1,1v10.5C47.5,29.91,47.05,30.36,46.5,30.36z" />
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/pip_expand_pl.xml b/packages/SystemUI/res/drawable/pip_expand_pl.xml
new file mode 100644
index 0000000..57b9358
--- /dev/null
+++ b/packages/SystemUI/res/drawable/pip_expand_pl.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="60dp"
+ android:height="60dp"
+ android:viewportWidth="60"
+ android:viewportHeight="60">
+
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M47,2.5H12.95C10.2,2.5,8,4.75,8,7.5v45c0,2.75,2.2,5,4.95,5H47c2.75,0,5-2.25,5-5v-45
+C52,4.75,49.75,2.5,47,2.5z
+M48,7.5v45c0,0.55-0.45,1-1,1H13c-0.55,0-1-0.45-1-1v-45c0-0.55,0.45-1,1-1h34
+C47.55,6.5,48,6.95,48,7.5z" />
+ <path
+ android:pathData="M0,0l60,0v60H0L0,0z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M39.14,35h2c0.55,0,1,0.45,1,1v10.5c0,0.55-0.45,1-1,1h-10.5c-0.55,0-1-0.45-1-1v-2c0-0.55,0.45-1,1-1h7.5
+V36C38.14,35.45,38.59,35,39.14,35z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M30.36,13.5v2c0,0.55-0.45,1-1,1h-7.5V24c0,0.55-0.45,1-1,1h-2c-0.55,0-1-0.45-1-1V13.5c0-0.55,0.45-1,1-1
+h10.5C29.91,12.5,30.36,12.95,30.36,13.5z" />
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/pip_expand.xml b/packages/SystemUI/res/drawable/pip_expand_pr.xml
similarity index 100%
rename from packages/SystemUI/res/drawable/pip_expand.xml
rename to packages/SystemUI/res/drawable/pip_expand_pr.xml
diff --git a/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml b/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml
deleted file mode 100644
index 1e52a91..0000000
--- a/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:startColor="#4C000000"
- android:endColor="#72000000"
- android:angle="90"/>
-</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/recents_tv_card_thumbnail_background.xml b/packages/SystemUI/res/drawable/recents_tv_card_thumbnail_background.xml
deleted file mode 100644
index dc8e629..0000000
--- a/packages/SystemUI/res/drawable/recents_tv_card_thumbnail_background.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
-
- <solid
- android:color="@color/recents_tv_card_background_color"/>
- <corners
- android:radius="@dimen/recents_tv_card_corner_radius" />
-</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/recents_tv_dismiss_icon.xml b/packages/SystemUI/res/drawable/recents_tv_dismiss_icon.xml
deleted file mode 100644
index 7fb67a2..0000000
--- a/packages/SystemUI/res/drawable/recents_tv_dismiss_icon.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<transition xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_dismiss_outline" />
- <item android:drawable="@drawable/ic_cancel_white_24dp" />
-</transition>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout-television/recents_on_tv.xml b/packages/SystemUI/res/layout-television/recents_on_tv.xml
deleted file mode 100644
index 2b78bee..0000000
--- a/packages/SystemUI/res/layout-television/recents_on_tv.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<com.android.systemui.recents.tv.views.RecentsTvView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/recents_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:background="@drawable/recents_tv_background_gradient">
-
- <com.android.systemui.recents.tv.views.TaskStackHorizontalGridView
- android:id="@+id/task_list"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:descendantFocusability="beforeDescendants"
- android:layout_marginTop="@dimen/recents_tv_gird_row_top_margin"
- android:focusable="true"
- android:layoutDirection="rtl" />
-
- <!-- Placeholder view to give focus to the PIP menus in talkback mode -->
- <View
- android:id="@+id/pip"
- android:layout_width="1dp"
- android:layout_height="1dp"
- android:focusable="true"
- android:visibility="gone" />
-
- <!-- Placeholder to dismiss during talkback. -->
- <ImageView
- android:id="@+id/dismiss_placeholder"
- android:layout_width="@dimen/recents_tv_dismiss_icon_size"
- android:layout_height="@dimen/recents_tv_dismiss_icon_size"
- android:layout_gravity="bottom|center_horizontal"
- android:layout_marginBottom="50dp"
- android:src="@drawable/ic_cancel_white_24dp"
- android:contentDescription="@string/status_bar_accessibility_dismiss_recents"
- android:focusable="true"
- android:visibility="gone" />
-
-</com.android.systemui.recents.tv.views.RecentsTvView>
diff --git a/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml b/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml
deleted file mode 100644
index 34cba07..0000000
--- a/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/card_info_field"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <ImageView
- android:id="@+id/card_extra_badge"
- android:layout_width="@dimen/recents_tv_card_extra_badge_size"
- android:layout_height="@dimen/recents_tv_card_extra_badge_size"
- android:layout_marginBottom="@dimen/recents_tv_icon_padding_bottom"
- android:scaleType="fitCenter"
- android:layout_centerVertical="true"
- android:layout_alignParentEnd="true"/>
- <TextView
- android:id="@+id/card_title_text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:includeFontPadding="true"
- android:singleLine="true"
- android:shadowColor="@color/recents_tv_text_shadow_color"
- android:shadowRadius="5"
- android:shadowDx="0"
- android:shadowDy="0"
- android:textColor="@color/recents_tv_card_title_text_color"
- android:fontFamily="@string/font_roboto_regular"
- android:textSize="@dimen/recents_tv_title_text_size"
- android:paddingStart="@dimen/recents_tv_text_padding_start"
- android:layout_marginBottom="@dimen/recents_tv_text_padding_bottom"
- android:ellipsize="end"/>
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout-television/recents_tv_empty.xml b/packages/SystemUI/res/layout-television/recents_tv_empty.xml
deleted file mode 100644
index e5d888f..0000000
--- a/packages/SystemUI/res/layout-television/recents_tv_empty.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center"
- android:drawablePadding="25dp"
- android:textSize="16sp"
- android:textColor="#ffffffff"
- android:text="@string/recents_empty_message"
- android:fontFamily="sans-serif"
- android:visibility="gone" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml b/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml
deleted file mode 100644
index 201f47d..0000000
--- a/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<com.android.systemui.recents.tv.views.TaskCardView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:layout_gravity="center"
- android:layout_centerInParent="true"
- android:clipToPadding="false"
- android:orientation="vertical" >
- <include layout="@layout/recents_tv_card_info_field"/>
- <LinearLayout
- android:id="@+id/card_view_thumbnail"
- android:layout_width="@dimen/recents_tv_card_width"
- android:layout_height="@dimen/recents_tv_screenshot_height"
- android:gravity="center"
- android:orientation="vertical"
- android:background="@drawable/recents_tv_card_thumbnail_background"
- android:layout_centerHorizontal="true" >
-
- <ImageView
- android:id="@+id/card_view_banner_icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_centerHorizontal="true"
- android:scaleType="centerCrop"
- android:gravity="center" />
-
- </LinearLayout>
- <ImageView
- android:id="@+id/dismiss_icon"
- android:layout_width="@dimen/recents_tv_dismiss_icon_size"
- android:layout_height="@dimen/recents_tv_dismiss_icon_size"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="@dimen/recents_tv_dismiss_icon_top_margin"
- android:layout_marginBottom="@dimen/recents_tv_dismiss_icon_bottom_margin"
- android:alpha="@integer/dismiss_unselected_alpha"
- android:src="@drawable/recents_tv_dismiss_icon" />
- <TextView
- android:id="@+id/card_dismiss_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="@dimen/recents_tv_dismiss_text_size"
- android:fontFamily="@string/font_roboto_light"
- android:textColor="@color/recents_tv_dismiss_text_color"
- android:text="@string/recents_tv_dismiss"
- android:alpha="0.0"
- android:layout_gravity="center_horizontal" />
-</com.android.systemui.recents.tv.views.TaskCardView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/pip_menu_action.xml b/packages/SystemUI/res/layout/pip_menu_action.xml
index 9b954f7..77efc9b 100644
--- a/packages/SystemUI/res/layout/pip_menu_action.xml
+++ b/packages/SystemUI/res/layout/pip_menu_action.xml
@@ -15,7 +15,7 @@
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:padding="10dp"
+ android:layout_width="@dimen/pip_action_size"
+ android:layout_height="@dimen/pip_action_size"
+ android:padding="@dimen/pip_action_padding"
android:background="?android:selectableItemBackgroundBorderless" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/pip_menu_activity.xml b/packages/SystemUI/res/layout/pip_menu_activity.xml
index f38c8ff..5e49d05 100644
--- a/packages/SystemUI/res/layout/pip_menu_activity.xml
+++ b/packages/SystemUI/res/layout/pip_menu_activity.xml
@@ -18,38 +18,39 @@
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#00000000">
+ android:background="#4D000000">
<!-- The above background is only for the dismiss button ripple to show. -->
<ImageView
android:id="@+id/dismiss"
- android:layout_width="48dp"
- android:layout_height="48dp"
+ android:layout_width="@dimen/pip_action_size"
+ android:layout_height="@dimen/pip_action_size"
android:layout_gravity="top|end"
- android:padding="10dp"
+ android:padding="@dimen/pip_action_padding"
android:contentDescription="@string/pip_phone_close"
android:src="@drawable/ic_close_white"
android:background="?android:selectableItemBackgroundBorderless" />
+ <!-- The margins for this container is calculated in the code depending on whether the
+ actions_container is visible. -->
<FrameLayout
android:id="@+id/expand_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
- android:layout_width="64dp"
- android:layout_height="64dp"
+ android:id="@+id/expand_button"
+ android:layout_width="60dp"
+ android:layout_height="60dp"
android:layout_gravity="center"
android:contentDescription="@string/pip_phone_expand"
- android:src="@drawable/pip_expand"
android:background="?android:selectableItemBackgroundBorderless" />
</FrameLayout>
<FrameLayout
android:id="@+id/actions_container"
android:layout_width="match_parent"
- android:layout_height="48dp"
+ android:layout_height="@dimen/pip_action_size"
android:layout_gravity="bottom"
- android:background="#66000000"
android:visibility="invisible">
<LinearLayout
android:id="@+id/actions_group"
diff --git a/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml b/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml
deleted file mode 100644
index 949400c..0000000
--- a/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="top|center_horizontal"
- android:orientation="vertical">
-
- <com.android.systemui.pip.tv.PipRecentsControlsView
- android:id="@+id/pip_controls"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:clipToPadding="false">
-
- <View
- android:id="@+id/scrim"
- android:layout_width="160dp"
- android:layout_height="32dp"
- android:translationY="-46dp"
- android:layout_gravity="top|center_horizontal"
- android:background="@drawable/tv_pip_recents_overlay_scrim"
- android:alpha="0" />
- <com.android.systemui.pip.tv.PipControlsView
- android:id="@+id/pip_control_contents"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:layout_gravity="top|center_horizontal" />
- </com.android.systemui.pip.tv.PipRecentsControlsView>
-
- <!-- Placeholder view to handle focus change between Recents row and PIP controls
- in talkback mode -->
- <View
- android:id="@+id/recents"
- android:layout_width="1dp"
- android:layout_height="1dp"
- android:focusable="true" />
-</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index c6231df..1786e36 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Databespaarder is afgeskakel."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Databespaarder is aangeskakel."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Skermhelderheid"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data is laat wag"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data is laat wag"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Sellulêre data is onderbreek"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om te ontdemp."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om op vibreer te stel. Toeganklikheidsdienste kan dalk gedemp wees."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volumekontroles word gewys. Swiep na bo om toe te maak."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumekontroles is versteek"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Stelsel-UI-ontvanger"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Algemene boodskappe"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Berging"</string>
<string name="instant_apps" msgid="6647570248119804907">"Kitsprogramme"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Kitsprogramme hoef nie geïnstalleer te word nie."</string>
<string name="app_info" msgid="6856026610594615344">"Programinligting"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 3fca840..9e84a35 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ውሂብ ቆጣቢ ጠፍቷል።"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ውሂብ ቆጣቢ በርቷል።"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ብሩህነት ያሳዩ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2ጂ-3ጂ ውሂብ ላፍታ ቆሟል"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4ጂ ውሂብ ላፍታ ቆሟል"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"የተንቀሳቃሽ ስልክ ውሂብ ላፍታ ቆሟል"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"የ%s ድምጽ መቆጣጠሪያዎች ይታያሉ። ለማሰናበት ወደ ላይ ያንሸራትቱ።"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"የድምጽ መቆጣጠሪያዎች ተደብቀዋል"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"የስርዓት በይነገጽ መቃኛ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"አጠቃላይ መልዕክቶች"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ማከማቻ"</string>
<string name="instant_apps" msgid="6647570248119804907">"የቅጽበት መተግበሪያዎች"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ቅጽበታዊ መተግበሪያዎች መጫን አያስፈልጋቸውም።"</string>
<string name="app_info" msgid="6856026610594615344">"የመተግበሪያ መረጃ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 1de61c2..d7f35ff 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"تم تعطيل توفير البيانات."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"تم تشغيل توفير البيانات."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"سطوع الشاشة"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"بيانات شبكات الجيل الثاني والثالث متوقفة مؤقتًا"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"تم إيقاف بيانات شبكة الجيل الرابع مؤقتًا"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"تم إيقاف بيانات شبكة الجوّال مؤقتًا"</string>
@@ -474,6 +476,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. انقر لإلغاء التجاهل."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. انقر للتعيين على الاهتزاز. قد يتم تجاهل خدمات إمكانية الوصول."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. انقر للتجاهل. قد يتم تجاهل خدمات إمكانية الوصول."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"تم عرض %s عنصر تحكم في مستوى الصوت. يمكنك التمرير سريعًا لأعلى للتجاهل."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"تم إخفاء عناصر التحكم في مستوى الصوت"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"أداة ضبط واجهة مستخدم النظام"</string>
@@ -705,8 +711,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"رسائل عامة"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"سعة التخزين"</string>
<string name="instant_apps" msgid="6647570248119804907">"التطبيقات الفورية"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"لا تتطلب التطبيقات الفورية إجراء التثبيت."</string>
<string name="app_info" msgid="6856026610594615344">"معلومات عن التطبيق"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"بيانات الجوّال"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 0694c3f..ab9f258cd 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Qənaəti deaktiv edildi."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Qənaəti aktiv edildi."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G məlumatlarına fasilə verildi"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G məlumatlarına fasilə verildi"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobil məlumatlara fasilə verildi"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Səsli etmək üçün tıklayın."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Vibrasiyanı ayarlamaq üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s həcm nəzarəti göstərilir. Bitirmək üçün yuxarı çəkin."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Həcm nəzarət gizlədilib"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Ümumi Mesajlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Yaddaş"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ani Tətbiqlər"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Ani tətbiqlər quraşdırma tələb etmir."</string>
<string name="app_info" msgid="6856026610594615344">"Tətbiq məlumatı"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobil data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 2751eb8..0b44eb5 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -237,6 +237,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ušteda podataka je isključena."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ušteda podataka je uključena."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Osvetljenost ekrana"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G podaci su pauzirani"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G podaci su pauzirani"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilni podaci su pauzirani"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste podesili na vibraciju. Zvuk usluga pristupačnosti će možda biti isključen."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrole za jačinu zvuka (%s) su prikazane. Prevucite nagore da biste ih odbacili."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole za jačinu zvuka su sakrivene"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Tjuner za korisnički interfejs sistema"</string>
@@ -696,8 +702,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Opšte poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Memorijski prostor"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije ne zahtevaju instalaciju."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 148ba31..0796cff 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Эканомія трафіку адключана."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Эканомія трафіку ўключана."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Яркасць дысплэя"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Перадача даных 2G-3G прыпынена"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Перадача даных 4G прыпынена"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Мабільная перадача даных прыпынена"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дакраніцеся, каб уключыць гук."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Дакраніцеся, каб уключыць вібрацыю. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Паказваецца наступная колькасць рэгулятараў гучнасці: %s. Правядзіце пальцам уверх, каб закрыць іх."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Рэгулятары гучнасці схаваны"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Наладка сістэмнага інтэрфейсу карыстальніка"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Агульныя паведамленні"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Захоўванне"</string>
<string name="instant_apps" msgid="6647570248119804907">"Імгненныя праграмы"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Імгненныя праграмы не патрабуюць усталёўкі."</string>
<string name="app_info" msgid="6856026610594615344">"Інфармацыя пра праграму"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Маб. перадача даных"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 993595a..5e4dd71 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Функцията „Икономия на данни“ е изключена."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Функцията „Икономия на данни“ е включена."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Яркост на екрана"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Данните от 2G – 3G са поставени на пауза"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Данните от 4G са поставени на пауза"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Мобилните данни са поставени на пауза"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Докоснете, за да включите отново звука."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Докоснете, за да зададете вибриране. Възможно е звукът на услугите за достъпност да бъде заглушен."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показани са контролите за силата на звука на %s. Прекарайте пръст нагоре, за да ги скриете."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контролите за силата на звука са скрити"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Тунер на системния потребителски интерфейс"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Общи съобщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
<string name="instant_apps" msgid="6647570248119804907">"Мигновени приложения"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"За мигновените приложения не се изисква инсталиране."</string>
<string name="app_info" msgid="6856026610594615344">"Информация за приложението"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобилни данни"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 18e0396..5bcaaf8 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ডেটা সেভার বন্ধ আছে।"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ডেটা সেভার চালু আছে।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"প্রদর্শনের উজ্জ্বলতা"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ডেটা বিরতি দেওয়া হয়েছে"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ডেটা বিরতি দেওয়া হয়েছে"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"সেলুলার ডেটা বিরতি দেওয়া হয়েছে"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। সশব্দ করতে আলতো চাপুন।"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। কম্পন এ সেট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। নিঃশব্দ করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ভলিউম নিয়ন্ত্রণগুলি দেখানো হয়েছে৷ খারিজ করতে উপরের দিকে সোয়াইপ করুন৷"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ভলিউম নিয়ন্ত্রণগুলি লুকানো রয়েছে"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"সিস্টেম UI টিউনার"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"সাধারণ বার্তাগুলি"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়স্থান"</string>
<string name="instant_apps" msgid="6647570248119804907">"ঝটপট অ্যাপ"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ঝটপট অ্যাপ ইনস্টল করার প্রয়োজন হয় না।"</string>
<string name="app_info" msgid="6856026610594615344">"অ্যাপ্লিকেশানের তথ্য"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"মোবাইল ডেটা"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 10d3aa5..27390b9 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -237,6 +237,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ušteda podataka je isključena."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ušteda podataka je uključena."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Osvjetljenje ekrana"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G prijenos podataka je pauzirano"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G prijenos podataka je pauzirano"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilni podaci su pauzirani"</string>
@@ -470,6 +472,10 @@
<skip />
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite za postavljanje vibracije. Zvukovi usluga pristupačnosti mogu biti isključeni."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da isključite zvuk. Zvukovi usluga pristupačnosti mogu biti isključeni."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazane kontrole jačine zvuka za: %s. Prevucite prema gore za odbacivanje."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole jačine zvuka sakrivene"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Podešavač za korisničko sučelje sistema"</string>
@@ -698,8 +704,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-aplikacije"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Za instant aplikacije nije potrebna instalacija"</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 82a4c0e..8a2bc3d 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"S\'ha desactivat l\'Economitzador de dades."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"S\'ha activat l\'Economitzador de dades."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brillantor de la pantalla"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Les dades 2G-3G estan aturades"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Les dades 4G estan aturades"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Les dades mòbils estan aturades"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca per activar el so."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca per activar la vibració. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Es mostren %s controls de volum. Llisca cap amunt per ignorar-ho."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Els controls de volum estan amagats"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Personalitzador d\'interfície d\'usuari"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Missatges generals"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Emmagatzematge"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicacions instantànies"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"No cal instal·lar les aplicacions instantànies."</string>
<string name="app_info" msgid="6856026610594615344">"Informació de l\'aplicació"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dades mòbils"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index ff33ba6..2b477d9 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Spořič dat byl vypnut."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Spořič dat byl zapnut."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Jas displeje"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G a 3G jsou pozastavena"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G jsou pozastavena"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilní data jsou pozastavena"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnete zvuk."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujete režim vibrací. Služby přístupnosti mohou být ztlumeny."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovládací prvky hlasitosti aplikace %s jsou zobrazeny. Zavřete je přejetím prstem."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládací prvky hlasitosti jsou skryty"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Nástroj na ladění uživatelského rozhraní systému"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Všeobecné zprávy"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Úložiště"</string>
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikace"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikace není třeba instalovat."</string>
<string name="app_info" msgid="6856026610594615344">"Informace o aplikaci"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilní data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 04b3faf..af58c03 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Datasparefunktionen er slået fra."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Datasparefunktionen er slået til."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Skærmens lysstyrke"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G-data er sat på pause"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er sat på pause"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobildata er sat på pause"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryk for at slå lyden til."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryk for at konfigurere til at vibrere. Tilgængelighedstjenester kan blive deaktiveret."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lydstyrkeknapperne for %s er synlige. Stryg op for at lukke."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lydstyrkeknapperne er skjult"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Generelle meddelelser"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagerplads"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps kræver ingen installation."</string>
<string name="app_info" msgid="6856026610594615344">"Oplysninger om appen"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index cc5bb73..7b27ced 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Der Datensparmodus ist deaktiviert."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Der Datensparmodus ist aktiviert."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Helligkeit des Displays"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-/3G-Daten pausiert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-Daten pausiert"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilfunkdaten pausiert"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Zum Aufheben der Stummschaltung tippen."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tippen, um Vibrieren festzulegen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lautstärkeregler von %s werden angezeigt. Zum Schließen nach oben wischen."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lautstärkeregler ausgeblendet"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Nachrichten"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Speicher"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Bei Instant-Apps ist keine vorherige Installation erforderlich."</string>
<string name="app_info" msgid="6856026610594615344">"App-Informationen"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobile Daten"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index dde7ed4..df2509a 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Η Εξοικονόμηση δεδομένων είναι ανενεργή."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Η Εξοικονόμηση δεδομένων είναι ενεργή."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Φωτεινότητα οθόνης"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Τα δεδομένα 2G-3G τέθηκαν σε παύση"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Τα δεδομένα 4G τέθηκαν σε παύση"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Τα δεδομένα κινητής τηλεφωνίας τέθηκαν σε παύση"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Πατήστε για κατάργηση σίγασης."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Πατήστε για ενεργοποιήσετε τη δόνηση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Εμφανίζονται τα στοιχεία ελέγχου έντασης %s. Σύρετε για παράβλεψη."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Έγινε απόκρυψη των στοιχείων ελέγχου έντασης"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Γενικά μηνύματα"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Αποθηκευτικός χώρος"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Εφαρμογές"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Οι Instant Εφαρμογές δεν απαιτούν εγκατάσταση."</string>
<string name="app_info" msgid="6856026610594615344">"Πληροφορίες εφαρμογής"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Δεδομένα κινητής τηλεφωνίας"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index a1c3bea..8a2dc4f 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -236,6 +236,7 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver turned off."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Charging"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobile data is paused"</string>
@@ -466,6 +467,8 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +696,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index a1c3bea..8a2dc4f 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -236,6 +236,7 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver turned off."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Charging"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobile data is paused"</string>
@@ -466,6 +467,8 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +696,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index a1c3bea..8a2dc4f 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -236,6 +236,7 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver turned off."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Display brightness"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"Charging"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G data is paused"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data is paused"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobile data is paused"</string>
@@ -466,6 +467,8 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +696,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant apps don\'t require installation."</string>
<string name="app_info" msgid="6856026610594615344">"App info"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobile data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index a8774c5..c1b1497 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Se desactivó Reducir datos."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Se activó Reducir datos."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de pantalla"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Datos 2G-3G pausados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Datos 4G pausados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Datos móviles pausados"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Presiona para dejar de silenciar."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Presiona para establecer el modo vibración. Es posible que los servicios de accesibilidad estén silenciados."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Se muestran los controles de volumen de %s. Desliza el dedo para descartar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador de IU del sistema"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensajes generales"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Apps instantáneas"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Las Apps instantáneas no requieren instalación."</string>
<string name="app_info" msgid="6856026610594615344">"Información de la app"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 5892ac8..4dca5cb 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ahorro de datos desactivado."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ahorro de datos activado."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de la pantalla"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Datos 2G-3G pausados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Datos 4G pausados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Datos móviles pausados"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar el sonido."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para poner el dispositivo en vibración. Los servicios de accesibilidad pueden silenciarse."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volumen mostrados. Desliza el dedo hacia arriba para rechazar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Configurador de IU del sistema"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensajes generales"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicaciones Instantáneas"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"No es necesario instalar las Aplicaciones Instantáneas."</string>
<string name="app_info" msgid="6856026610594615344">"Información de la aplicación"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Datos móviles"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 561486e..1908347 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Andmeside mahu säästja on välja lülitatud."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Andmeside mahu säästja on sisse lülitatud."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ekraani heledus"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G andmekasutus on peatatud"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G andmekasutus on peatatud"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobiilse andmeside kasutus on peatatud"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Puudutage vaigistuse tühistamiseks."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Puudutage värinarežiimi määramiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s helitugevuse juhtnuppu on kuvatud. Loobumiseks pühkige üles."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Helitugevuse juhtnupud on peidetud"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Süsteemi kasutajaliidese tuuner"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Üldised sõnumid"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Salvestusruum"</string>
<string name="instant_apps" msgid="6647570248119804907">"Installimata avatavad rakendused"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Installimata avatavaid rakendusi pole vaja installida."</string>
<string name="app_info" msgid="6856026610594615344">"Rakenduse teave"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobiilne andmeside"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index c123c50..b012e8f 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Desaktibatuta dago datu-aurrezlea."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Aktibatuta dago datu-aurrezlea."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Bistaratu distira"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G datuen erabilera eten da"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datuen erabilera eten da"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Sare mugikorreko datuen erabilera eten da"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sakatu audioa aktibatzeko."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Sakatu dardara ezartzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Bolumena kontrolatzeko %s aukera daude ikusgai. Pasatu hatza gora baztertzeko."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ezkutatuta daude bolumena kontrolatzeko aukerak"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sistemako erabiltzaile-interfazearen konfiguratzailea"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mezu orokorrak"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Memoria"</string>
<string name="instant_apps" msgid="6647570248119804907">"Zuzeneko aplikazioak"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Zuzeneko aplikazioak ez dira instalatu behar."</string>
<string name="app_info" msgid="6856026610594615344">"Aplikazioari buruzko informazioa"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Datu mugikorrak"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 642fd43..75e21e4 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"صرفهجویی داده خاموش شد."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"صرفهجویی داده روشن شد."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"روشنایی نمایشگر"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"داده 2G-3G موقتاً متوقف شده است"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"داده 4G موقتاً متوقف شده است"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"داده شبکه همراه موقتاً متوقف شده است"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. برای باصدا کردن ضربه بزنید."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. برای تنظیم روی لرزش ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای بیصدا کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"کنترلهای میزان صدای %s نشان داده شدند. برای نپذیرفتن انگشتتان را تند بکشید."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"کنترلهای صدا پنهان هستند"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"تنظیمکننده واسط کاربری سیستم"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"پیامهای عمومی"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"فضای ذخیرهسازی"</string>
<string name="instant_apps" msgid="6647570248119804907">"برنامههای فوری"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"برنامههای فوری نیاز به نصب ندارند."</string>
<string name="app_info" msgid="6856026610594615344">"اطلاعات برنامه"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"داده تلفن همراه"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e3fc32c..ddec327 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver poistettiin käytöstä."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver otettiin käyttöön."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Näytön kirkkaus"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G-tiedonsiirto keskeytettiin"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-tiedonsiirto keskeytettiin"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobiilitiedonsiirto keskeytettiin"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Poista mykistys koskettamalla."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Siirry värinätilaan koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Äänenvoimakkuuden säätimiä on näkyvissä (%s). Hylkää pyyhkäisemällä ylös."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Äänenvoimakkuuden säätimet piilotettiin."</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Yleiset viestit"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Tallennustila"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Pikasovelluksia ei tarvitse asentaa."</string>
<string name="app_info" msgid="6856026610594615344">"Sovelluksen tiedot"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobiilitiedonsiirto"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index afec321..6a704c4 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Mode Économiseur de données désactivé."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Mode Économiseur de données activé."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Luminosité de l\'écran"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Données 2G/3G désactivées"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Données 4G désactivées"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Données cellulaires désactivées"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Touchez pour réactiver le son."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Touchez pour activer les vibrations. Il est possible de couper le son des services d\'accessibilité."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Les commandes de volume sont masquées"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Messages généraux"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Stockage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Données cellulaires"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index a4983ac..39d2702 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"L\'économiseur de données est désactivé."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"L\'économiseur de données est activé."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Luminosité de l\'affichage"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Données 2G-3G désactivées"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Données 4G désactivées"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Données mobiles désactivées"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Appuyez pour ne plus ignorer."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Appuyez pour mettre en mode vibreur. Vous pouvez ignorer les services d\'accessibilité."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Commandes de volume masquées"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Nouveaux messages"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Espace de stockage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Applis instantanées"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Les applis instantanées ne nécessitent pas d\'installation."</string>
<string name="app_info" msgid="6856026610594615344">"Infos sur l\'appli"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Données mobiles"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 5bbdf60..22614fe 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Desactivouse o Economizador de datos."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Activouse o Economizador de datos."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de pantalla"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os datos 2G-3G están en pausa"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os datos 4G están en pausa"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Os datos de móbiles están en pausa"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar o son."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para establecer a vibración. Pódense silenciar os servizos de accesibilidade."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Estanse mostrando os controis de volume de %s. Pasa o dedo cara a arriba para ignoralos."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ocultáronse os controis de volume"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Configurador da IU do sistema"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensaxes xerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicacións instantáneas"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"As aplicacións instantáneas non precisan instalación."</string>
<string name="app_info" msgid="6856026610594615344">"Información da aplicación"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Datos móbiles"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index e63390a..cad51ed 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ડેટા સેવર બંધ કર્યું."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ડેટા સેવર ચાલુ કર્યું."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"પ્રદર્શન તેજ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"સેલ્યુલર ડેટા થોભાવ્યો છે"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. અનમ્યૂટ કરવા માટે ટૅપ કરો."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. વાઇબ્રેટ પર સેટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s વૉલ્યૂમ નિયંત્રણ બતાવ્યાં. છોડી દેવા માટે સ્વાઇપ કરો."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"વૉલ્યૂમ નિયંત્રણ છુપાવ્યાં"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"સિસ્ટમ UI ટ્યૂનર"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"સામાન્ય સંદેશા"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"સ્ટોરેજ"</string>
<string name="instant_apps" msgid="6647570248119804907">"ઝટપટ ઍપ્લિકેશનો"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ઝટપટ ઍપ્લિકેશનો માટે ઇન્સ્ટૉલેશનની જરૂર નથી."</string>
<string name="app_info" msgid="6856026610594615344">"ઍપ્લિકેશન માહિતી"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"મોબાઇલ ડેટા"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f1d4545..0d037ba 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"डेटा बचतकर्ता बंद किया गया."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"डेटा बचतकर्ता चालू किया गया."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"स्क्रीन की स्क्रीन की रोशनी"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटा रोक दिया गया है"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोक दिया गया है"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"सेल्युलर डेटा रोक दिया गया है"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. अनम्यूट करने के लिए टैप करें."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन पर सेट करने के लिए टैप करें. एक्सेस-योग्यता सेवाएं म्यूट हो सकती हैं."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. एक्सेस-योग्यता सेवाएं म्यूट हो सकती हैं."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s वॉल्यूम नियंत्रण दिखाए गए हैं. खारिज करने के लिए स्वाइप करें."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"वॉल्यूम नियंत्रण छिपे हुए हैं"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"सिस्टम UI ट्यूनर"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"जगह"</string>
<string name="instant_apps" msgid="6647570248119804907">"झटपट ऐप्स"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"झटपट ऐप्स के लिए इंस्टॉलेशन ज़रूरी नहीं है."</string>
<string name="app_info" msgid="6856026610594615344">"ऐप की जानकारी"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index a8fe4b1..8873476 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -237,6 +237,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ušteda podataka isključena."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ušteda podataka uključena."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Svjetlina zaslona"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G – 3G podaci pauzirani"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G podaci pauzirani"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilni podaci pauzirani"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste postavili na vibraciju. Usluge pristupačnosti možda neće imati zvuk."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kontrole glasnoće prikazane. Kliznite prstom prema gore da biste ih odbacili."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole glasnoće skrivene"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Ugađanje korisničkog sučelja sustava"</string>
@@ -696,8 +702,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant aplikacije"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant aplikacije nije potrebno instalirati."</string>
<string name="app_info" msgid="6856026610594615344">"Informacije o aplikaciji"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilni podaci"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 0bd7fd0..2f55f2e 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Adatforgalom-csökkentő kikapcsolva."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Adatforgalom-csökkentő bekapcsolva."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"A kijelző fényereje"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"A 2G és 3G adatforgalom szünetel."</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"A 4G adatforgalom szünetel"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"A mobilhálózati adatforgalom szünetel"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Koppintson a némítás megszüntetéséhez."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Koppintson a rezgés beállításához. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"A(z) %s hangvezérlői megjelenítve. Az elvetéshez húzza felfelé az ujját."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Hangvezérlők elrejtve"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Kezelőfelület-hangoló"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Általános üzenetek"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Tárhely"</string>
<string name="instant_apps" msgid="6647570248119804907">"Azonnali alkalmazások"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Az azonnali alkalmazásokat nem kell telepíteni."</string>
<string name="app_info" msgid="6856026610594615344">"Alkalmazásinformáció"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobiladatok"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 63882e6..0e1807e 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Տվյալների խնայումն անջատվեց:"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Տվյալների խնայումը միացվեց:"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ցուցադրել պայծառությունը"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2Գ-3Գ տվյալների օգտագործումը դադարեցված է"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4Գ տվյալների օգտագործումը դադարեցված է"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Բջջային տվյալների օգտագործումը դադարեցված է"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s: Հպեք՝ ձայնը միացնելու համար:"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s: Հպեք՝ թրթռումը միացնելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ձայնի ուժգնության կառավարները ցուցադրված են: Մատը սահեցրեք վերև՝ փակելու համար:"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ձայնի ուժգնության կառավարները թաքցված են"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Համակարգի ՕՄ-ի կարգավորիչ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Ընդհանուր հաղորդագրություններ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Հիշողություն"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ակնթարթորեն գործարկվող հավելվածներ"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Ակնթարթորեն գործարկվող հավելվածները տեղադրում չեն պահանջում։"</string>
<string name="app_info" msgid="6856026610594615344">"Հավելվածի տվյալներ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Բջջային ինտերնետ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 2be8a4d..220c7f3 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Penghemat Data nonaktif."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Penghemat Data diaktifkan."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Kecerahan tampilan"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G-3G dijeda"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G dijeda"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Data seluler dijeda"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketuk untuk menyuarakan."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrol volume %s ditampilkan. Gesek ke atas untuk menutup."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrol volume disembunyikan"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Penyetel Antarmuka Pengguna Sistem"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Pesan Umum"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Penyimpanan"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikasi Instan"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikasi instan tidak perlu diinstal."</string>
<string name="app_info" msgid="6856026610594615344">"Info aplikasi"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Data seluler"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 04ae68d..e701519 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Slökkt var á gagnasparnaði."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Kveikt var á gagnasparnaði."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Birtustig skjás"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Slökkt er á 2G- og 3G-gögnum"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Slökkt er á 4G-gögnum"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Slökkt er á farsímagögnum"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ýttu til að hætta að þagga."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ýttu til að stilla á titring. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s stýringar fyrir hljóðstyrk sýnilegar. Strjúktu upp til að hunsa."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Stýringar fyrir hljóðstyrk faldar"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Fínstillingar kerfisviðmóts"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Almenn skilaboð"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Geymslurými"</string>
<string name="instant_apps" msgid="6647570248119804907">"Skyndiforrit"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Skyndiforrit þurfa ekki uppsetningu."</string>
<string name="app_info" msgid="6856026610594615344">"Forritsupplýsingar"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Farsímagögn"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 2766dd4..3f7adb1 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Funzione Risparmio dati disattivata."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Funzione Risparmio dati attivata."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Luminosità dello schermo"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dati 2G-3G sospesi"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dati 4G sospesi"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Dati cellulari sospesi"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tocca per riattivare l\'audio."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s comandi del volume mostrati. Fai scorrere verso l\'alto per ignorare."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comandi del volume nascosti"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintetizzatore interfaccia utente di sistema"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Messaggi generali"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Spazio di archiviazione"</string>
<string name="instant_apps" msgid="6647570248119804907">"App istantanee"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Le app istantanee non richiedono l\'installazione."</string>
<string name="app_info" msgid="6856026610594615344">"Informazioni app"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dati mobili"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index e9719ba..649d2e1 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"חוסך הנתונים (Data Saver) כובה."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"חוסך הנתונים (Data Saver) הופעל."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"בהירות תצוגה"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"השימוש בנתוני 2G-3G מושהה"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"השימוש בנתוני 4G מושהה"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"השימוש בנתונים סלולריים מושהה"</string>
@@ -470,6 +472,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. הקש כדי לבטל את ההשתקה."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. הקש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s פקדי עוצמת הקול גלויים. החלק כלפי מעלה כדי לסגור."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"פקדי עוצמת הקול מוסתרים"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -699,8 +705,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"הודעות כלליות"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"אחסון"</string>
<string name="instant_apps" msgid="6647570248119804907">"אפליקציות אינסטנט"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"אפליקציות אינסטנט לא דורשות התקנה."</string>
<string name="app_info" msgid="6856026610594615344">"פרטי אפליקציה"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"נתונים סלולריים"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 968c437..4220945 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"データセーバーが OFF になりました。"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"データセーバーが ON になりました。"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ディスプレイの明るさ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G~3Gデータは一時停止中です"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4Gデータは一時停止中です"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"モバイルデータは一時停止中です"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。タップしてミュートを解除します。"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。タップしてバイブレーションに設定します。ユーザー補助機能サービスがミュートされる場合があります。"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。タップしてミュートします。ユーザー補助機能サービスがミュートされる場合があります。"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s の音量調節が表示されています。閉じるには、上にスワイプします。"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"音量調節を非表示にしました"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"システムUI調整ツール"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"一般メッセージ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ストレージ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps はインストールせずに利用できます。"</string>
<string name="app_info" msgid="6856026610594615344">"アプリ情報"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"モバイルデータ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 258f447..7d42fa3 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"მონაცემთა დამზოგველი გამორთულია."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"მონაცემთა დამზოგველი ჩართულია."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ეკრანის სიკაშკაშე"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G მონაცემები შეჩერებულია"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G მონაცემები შეჩერებულია"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ფიჭური მონაცემები შეჩერებულია"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. შეეხეთ დადუმების გასაუქმებლად."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s-ის ხმის მართვის საშუალებები დამალულია. დასახურად, გადაფურცლეთ ზემოთ."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ხმის მართვის საშუალებები დამალულია"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"სისტემის UI ტუნერი"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"ზოგადი შეტყობინებები"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"მეხსიერება"</string>
<string name="instant_apps" msgid="6647570248119804907">"მყისიერი აპები"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"მყისიერი აპები ინსტალაციას არ საჭიროებს."</string>
<string name="app_info" msgid="6856026610594615344">"აპის შესახებ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"მობილური ინტერნეტი"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 66f3ea7..9a8d694 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Трафикті үнемдеу функциясы өшірілді."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Трафикті үнемдеу функциясы қосылды."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Дисплей жарықтығы"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G деректері кідіртілді"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G деректері кідіртілді"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Ұялы деректер кідіртілді"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дыбысын қосу үшін түртіңіз."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Діріл режимін орнату үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s дыбысты басқару элементтері көрсетулі. Сырғыту арқылы жабыңыз."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Дыбысты басқару элементтері жасырын"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Жүйелік пайдаланушылық интерфейс тюнері"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы хабарлар"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Жад"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Лездік қолданбаларды орнатудың қажеті жоқ."</string>
<string name="app_info" msgid="6856026610594615344">"Қолданба ақпараты"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобильдік деректер"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index a5c724b..1482cf2 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"បានបិទកម្មវិធីសន្សំសំចៃទិន្នន័យ"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"បានបើកកម្មវិធីសន្សំសំចៃទិន្នន័យ"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ពន្លឺការបង្ហាញ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ទិន្នន័យ 2G-3G ត្រូវបានផ្អាក"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ទិន្នន័យ 4G ត្រូវបានផ្អាក"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ទិន្នន័យចល័តត្រូវបានផ្អាក"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s។ ប៉ះដើម្បីបើកសំឡេង។"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s។ ប៉ះដើម្បីកំណត់ឲ្យញ័រ។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"អង្គគ្រប់គ្រងកម្រិតសំឡេង %s បានបង្ហាញ។ អូសឡើងលើដើម្បីបដិសេធ។"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"អង្គគ្រប់គ្រងកម្រិតសំឡេងបានលាក់"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"កម្មវិធីសម្រួល UI ប្រព័ន្ធ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"សារទូទៅ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ទំហំផ្ទុក"</string>
<string name="instant_apps" msgid="6647570248119804907">"កម្មវិធីប្រើភ្លាមៗ"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"កម្មវិធីប្រើភ្លាមៗមិនតម្រូវឲ្យមានការដំឡើងទេ។"</string>
<string name="app_info" msgid="6856026610594615344">"ព័ត៌មានកម្មវិធី"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ទិន្នន័យចល័ត"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index f4ce3bf..045d4a4 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ಡೇಟಾ ಸೇವರ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ಹೊಳಪನ್ನು ಪ್ರದರ್ಶಿಸಿ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ಅನ್ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವಜಾಗೊಳಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"ಸಿಸ್ಟಮ್ UI ಟ್ಯೂನರ್"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"ಸಾಮಾನ್ಯ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ಸಂಗ್ರಹಣೆ"</string>
<string name="instant_apps" msgid="6647570248119804907">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳು"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ತತ್ಕ್ಷಣ ಆಪ್ಗಳಿಗೆ ಸ್ಥಾಪನೆಯ ಅಗತ್ಯವಿಲ್ಲ."</string>
<string name="app_info" msgid="6856026610594615344">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index b624b58..8f96354 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"데이터 절약 모드를 사용 중지했습니다."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"데이터 절약 모드를 사용 설정했습니다."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"디스플레이 밝기"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 데이터 사용 중지됨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 데이터 사용 중지됨"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"모바일 데이터 사용 중지됨"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. 탭하여 음소거를 해제하세요."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. 탭하여 진동으로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s 볼륨 컨트롤이 표시됩니다. 닫으려면 위로 스와이프합니다."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"볼륨 컨트롤 숨김"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"시스템 UI 튜너"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"저장소"</string>
<string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index c56d9bb..96bda15d 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Дайындарды үнөмдөгүч өчүрүлдү."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Дайындарды үнөмдөгүч күйгүзүлдү."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Жарыктыгын көрсөтүү"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дайындары тындырылды."</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дайындары тындырылды"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Уюлдук дайындар тындырылды"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Үнүн чыгаруу үчүн таптап коюңуз."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Дирилдөөгө коюу үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s үндү башкаруу элементтери көрсөтүлгөн. Этибарга албоо үчүн өйдө серпип коюңуз."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Үндү башкаруу элементтери жашырылган"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Жалпы билдирүүлөр"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Сактагыч"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ыкчам ачылуучу колдонмолор"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Ыкчам ачылуучу колдонмолорду орнотуу талап кылынбайт."</string>
<string name="app_info" msgid="6856026610594615344">"Колдонмо тууралуу"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобилдик дайындар"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 05e4e57..7e0188a 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ປິດຕົວປະຢັດຂໍ້ມູນແລ້ວ."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ເປີດຕົວປະຢັດຂໍ້ມູນແລ້ວ."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ຄວາມແຈ້ງຂອງຈໍ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"ຂໍ້ມູນ 2G-3G ຢຸດຊົ່ວຄາວແລ້ວ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"ຂໍ້ມູນ 4G ຢຸດຊົ່ວຄາວແລ້ວ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ຂໍ້ມູນເຊວລູລາຢຸດຊົ່ວຄາວແລ້ວ"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ແຕະເພື່ອເຊົາປິດສຽງ."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"ສະແດງສ່ວນຄວບຄຸມສຽງ %s ແລ້ວ. ປັດອອກຂ້າງເພື່ອປິດໄວ້."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ເຊື່ອງສ່ວນຄວບຄຸມສຽງແລ້ວ"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"ຂໍ້ຄວາມທົ່ວໄປ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ບ່ອນເກັບຂໍ້ມູນ"</string>
<string name="instant_apps" msgid="6647570248119804907">"ອິນສະແຕນແອັບ"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ອິນສະແຕນແອັບບໍ່ຈຳເປັນຕ້ອງມີການຕິດຕັ້ງ."</string>
<string name="app_info" msgid="6856026610594615344">"ຂໍ້ມູນແອັບ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ອິນເຕີເນັດມືຖື"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 095ae2f..12a2a33 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Duomenų taupymo priemonė išjungta."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Duomenų taupymo priemonė įjungta."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ekrano šviesumas"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G duomenys pristabdyti"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G duomenys pristabdyti"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Korinio ryšio duomenys pristabdyti"</string>
@@ -470,6 +472,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Palieskite, kad įjungtumėte garsą."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Palieskite, kad nustatytumėte vibravimą. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Rodomi „%s“ garsumo valdikliai. Perbraukite į viršų, kad atsisakytumėte."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Garsumo valdikliai paslėpti"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sistemos naudotojo sąsajos derinimo priemonė"</string>
@@ -699,8 +705,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Bendrieji pranešimai"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Saugykla"</string>
<string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programėlės"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamų programėlių nereikia įdiegti."</string>
<string name="app_info" msgid="6856026610594615344">"Programos informacija"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilieji duomenys"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 9eff144..5ee7266 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -237,6 +237,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Datu lietojuma samazinātājs ir izslēgts."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Datu lietojuma samazinātājs ir ieslēgts."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ekrāna spilgtums"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G datu lietojums ir apturēts"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G datu lietojums ir apturēts"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilo datu lietojums ir apturēts"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Pieskarieties, lai ieslēgtu skaņu."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Pieskarieties, lai iestatītu uz vibrozvanu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tiek rādītas %s skaļuma vadīklas. Velciet augšup, lai nerādītu."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Skaļuma vadīklas paslēptas"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sistēmas saskarnes regulators"</string>
@@ -696,8 +702,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Vispārīgi ziņojumi"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Krātuve"</string>
<string name="instant_apps" msgid="6647570248119804907">"Tūlītējās lietotnes"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Tūlītējām lietotnēm nav nepieciešama instalēšana."</string>
<string name="app_info" msgid="6856026610594615344">"Lietotnes informācija"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilie dati"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index e384ae3..1093e15 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Штедачот на интернет е исклучен."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Штедачот на интернет е вклучен."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Осветленост на екранот"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Податоците 2G-3G се паузирани"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Податоците 4G се паузирани"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Мобилните податоци се паузирани"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Допрете за да вклучите звук."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Допрете за да поставите на вибрации. Можеби ќе се исклучи звукот на услугите за достапност."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Прикажани се контролите за јачина на звукот на %s. Повлечете нагоре за да отфрлите."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Скриени се контролите за јачина на звукот"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Адаптер на УИ на системот"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Општи пораки"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Меморија"</string>
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликации"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликациите нема потреба да се инсталираат."</string>
<string name="app_info" msgid="6856026610594615344">"Информации за апликација"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобилен интернет"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 427430f..62db8951 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ഡാറ്റ സേവർ ഓഫാക്കി."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ഡാറ്റ സേവർ ഓണാക്കി."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ഡിസ്പ്ലേ തെളിച്ചം"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"സെല്ലുലാർ ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. അൺമ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s വോളിയം നിയന്ത്രണങ്ങൾ കാണിച്ചിരിക്കുന്നു. ഡിസ്മിസ് ചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"വോളിയം നിയന്ത്രണങ്ങൾ മറച്ചിരിക്കുന്നു"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"സിസ്റ്റം UI ട്യൂണർ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"പൊതുവായ സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"സ്റ്റോറേജ്"</string>
<string name="instant_apps" msgid="6647570248119804907">"ഇൻസ്റ്റന്റ് ആപ്പ്"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ഇൻസ്റ്റന്റ് ആപ്പിന് ഇൻസ്റ്റലേഷൻ ആവശ്യമില്ല."</string>
<string name="app_info" msgid="6856026610594615344">"ആപ്പ് വിവരം"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"മൊബൈൽ ഡാറ്റ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 08d10d1..afdfa7a 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -234,6 +234,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Өгөгдөл хамгаалагчийг унтраасан."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Өгөгдөл хамгаалагчийг асаасан."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Дэлгэцийн гэрэлтэлт"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G дата-г түр зогсоосон байна"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G дата-г түр зогсоосон байна"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Гар утасны дата-г түр зогсоосон байна"</string>
@@ -464,6 +466,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дууг нь нээхийн тулд товшино уу."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Чичиргээнд тохируулахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) -->
<skip />
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Энгийн зурвас"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хадгалах сан"</string>
<string name="instant_apps" msgid="6647570248119804907">"Шуурхай апп"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Шуурхай аппыг суулгах шаардлагагүй."</string>
<string name="app_info" msgid="6856026610594615344">"Апп-н мэдээлэл"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобайл дата"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 2d6dd89..1af8619 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"डेटा सर्व्हर बंद केला."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"डेटा सर्व्हर चालू केला."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"प्रदर्शन चमक"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटास विराम दिला आहे"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटास विराम दिला आहे"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"सेल्युलर डेटास विराम दिला आहे"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. सशब्द करण्यासाठी टॅप करा."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. कंपन सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा नि:शब्द केल्या जाऊ शकतात."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. नि:शब्द करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा नि:शब्द केल्या जाऊ शकतात."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s आवाज नियंत्रणे दर्शविली. डिसमिस करण्यासाठी वर स्वाइप करा."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"आवाज नियंत्रणे लपविली"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"सिस्टीम UI ट्यूनर"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"सर्वसाधारण संदेश"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"संचय"</string>
<string name="instant_apps" msgid="6647570248119804907">"इन्सटंट अॅप्स"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"इन्सटंट अॅप्सना स्थापनेची आवश्यकता नसते."</string>
<string name="app_info" msgid="6856026610594615344">"अॅप माहिती"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index b043460..3722302 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Penjimat Data dimatikan."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Penjimat Data dihidupkan."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Kecerahan paparan"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data 2G-3G dijeda"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data 4G dijeda"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Data selular dijeda"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketik untuk menyahredam."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketik untuk menetapkan pada getar. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kawalan kelantangan ditunjukkan. Leret ke atas untuk mengetepikan."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kawalan kelantangan disembunyikan"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Penala UI Sistem"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mesej Am"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storan"</string>
<string name="instant_apps" msgid="6647570248119804907">"Apl Segera"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Apl segera tidak memerlukan pemasangan."</string>
<string name="app_info" msgid="6856026610594615344">"Maklumat apl"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Data mudah alih"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 3fefa6d..a933fd0 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ဒေတာချွေတာမှု ပိတ်ထားသည်။"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ဒေတာချွေတာမှု ဖွင့်ထားသည်။"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"တောက်ပမှုကို ပြရန်"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ဒေတာ ခေတ္တရပ်တန့်သည်"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G data ခေတ္တရပ်တန့်သည်"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"cellular data ခေတ္တရပ်တန့်သည်"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s။ အသံပြန်ဖွင့်ရန် တို့ပါ။"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"အသံအတိုးအလျှော့ခလုတ် %s ပြသထားပါသည်။ ပယ်ရန် အပေါ်သို့ပွတ်ဆွဲပါ။"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"အသံအတိုးအလျှော့ခလုတ်များကို ဝှက်ထားပါသည်"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"စနစ် UI ဖမ်းစက်"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"အထွေထွေ မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"သိုလှောင်မှုများ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ချက်ခြင်းသုံးအက်ပ်များကို ထည့်သွင်းစရာမလိုပါ။"</string>
<string name="app_info" msgid="6856026610594615344">"အက်ပ်အချက်အလက်"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"မိုဘိုင်းဒေတာ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index bf081e4..1cd0485 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Datasparing er slått av."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Datasparing er slått på."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Lysstyrken på skjermen"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- og 3G-data er satt på pause"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data er satt på pause"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobildata er satt på pause"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trykk for å slå på lyden."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trykk for å angi vibrasjon. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumkontrollene for %s vises. Sveip opp for å avvise dem."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumkontrollene er skjult"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Generelle meldinger"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Du trenger ikke å installere instant-apper."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index bfcaf16..58caf9f 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"डेटा सेभरलाई निष्क्रिय पारियो।"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"डेटा सेभरलाई सक्रिय गरियो।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"प्रदर्शन चमक"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G डेटा रोकिएको छ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G डेटा रोकिएको छ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"सेल्यूलर डेटा रोकिएको छ"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। अनम्यूट गर्नका लागि ट्याप गर्नुहोस्।"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। कम्पनमा सेट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। म्यूट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s का भोल्युम सम्बन्धी नियन्त्रणहरूलाई देखाइएको छ। खारेज गर्नका लागि स्वाइप गर्नुहोस्।"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"भोल्युम सम्बन्धी नियन्त्रणहरूलाई लुकाइयो"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"प्रणाली UI ट्युनर"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"सामान्य सन्देशहरू"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"भण्डारण"</string>
<string name="instant_apps" msgid="6647570248119804907">"तात्कालिक अनुप्रयोगहरू"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"तात्कालिक अनुप्रयोगहरूलाई स्थापना गर्नु पर्दैन|"</string>
<string name="app_info" msgid="6856026610594615344">"अनुप्रयोगका बारे जानकारी"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"मोबाइल डेटा"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 4ec7528..0519d94 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Databesparing is uitgeschakeld."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Databesparing is ingeschakeld."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Helderheid van het scherm"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G/3G-data zijn onderbroken"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data zijn onderbroken"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobiele data zijn onderbroken"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om dempen op te heffen."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om in te stellen op trillen. Toegankelijkheidsservices kunnen zijn gedempt."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumeknoppen van %s worden weergegeven. Veeg omhoog om te sluiten."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumeknoppen verborgen"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Systeem-UI-tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Algemene berichten"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Opslag"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant-apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant-apps hoeven niet te worden geïnstalleerd."</string>
<string name="app_info" msgid="6856026610594615344">"App-info"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobiele data"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 9b28995..992f8aa 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ਡੈਟਾ ਸੇਵਰ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ਡੈਟਾ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ਡਿਸਪਲੇ ਚਮਕ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"ਸੈਲਿਊਲਰ ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s। ਅਣਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s। ਥਰਥਰਾਹਟ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ ਵਿਖਾਏ ਗਏ ਹਨ। ਬਰਖ਼ਾਸਤ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ ਲੁਕਾਏ ਗਏ ਹਨ"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI ਟਿਊਨਰ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"ਆਮ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ਸਟੋਰੇਜ"</string>
<string name="instant_apps" msgid="6647570248119804907">"ਤਤਕਾਲ ਐਪਾਂ"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ਤਤਕਾਲ ਐਪਾਂ ਨੂੰ ਸਥਾਪਨਾ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"</string>
<string name="app_info" msgid="6856026610594615344">"ਐਪ ਜਾਣਕਾਰੀ"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ਮੋਬਾਈਲ ਡੈਟਾ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index b6e8252..a176a81 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Oszczędzanie danych jest wyłączone."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Oszczędzanie danych jest włączone."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Jasność wyświetlacza"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Transmisja danych 2G-3G została wstrzymana"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Transmisja danych 4G została wstrzymana"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Komórkowa transmisja danych została wstrzymana"</string>
@@ -470,6 +472,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Kliknij, by wyłączyć wyciszenie."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Kliknij, by włączyć wibracje. Ułatwienia dostępu mogą być wyciszone."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Wyświetlane są elementy sterowania głośnością aplikacji %s. Przesuń palcem, by odrzucić."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Elementy sterowania głośnością ukryte"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Kalibrator System UI"</string>
@@ -699,8 +705,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Wiadomości"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Miejsce"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikacje błyskawiczne"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacji błyskawicznych nie trzeba instalować."</string>
<string name="app_info" msgid="6856026610594615344">"O aplikacji"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Komórkowa transmisja danych"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 5279bea..8e290e3 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economia de dados desativada."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economia de dados ativada."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Os dados da rede celular foram pausados"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 83801d3..a20f9db 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Poupança de dados desativada."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Poupança de dados ativada."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brilho do visor"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dados 2G-3G em pausa"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dados 4G em pausa"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Dados de redes móveis em pausa"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para reativar o som."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para ativar a vibração. Os serviços de acessibilidade podem ser silenciados."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Controlos de volume %s apresentados. Deslize rapidamente para cima para ignorar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultados"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador da interface do sistema"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicações instantâneas"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"As Aplicações instantâneas não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações da aplicação"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 5279bea..8e290e3 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economia de dados desativada."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economia de dados ativada."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Brilho da tela"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Os dados 2G e 3G foram pausados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Os dados 4G foram pausados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Os dados da rede celular foram pausados"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintonizador System UI"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Os Instant Apps não requerem instalação."</string>
<string name="app_info" msgid="6856026610594615344">"Informações do app"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dados móveis"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 1812a75..0fda167 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -239,6 +239,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economizorul de date a fost dezactivat."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economizorul de date a fost activat."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Luminozitatea ecranului"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Conexiunea de date 2G – 3G este întreruptă"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Conexiunea de date 4G este întreruptă"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Conexiunea de date mobile este întreruptă"</string>
@@ -470,6 +472,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Atingeți pentru a activa sunetul."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Atingeți pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Comenzile de volum pentru %s sunt afișate. Glisați pentru a închide."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comenzile de volum sunt ascunse"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -698,8 +704,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mesaje generale"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Stocare"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplicații instantanee"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Aplicațiile instantanee nu necesită instalare."</string>
<string name="app_info" msgid="6856026610594615344">"Informații despre aplicație"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Date mobile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index e2302d8..f64047a 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Режим экономии трафика отключен."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Режим экономии трафика включен."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Яркость экрана"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Передача данных 2G и 3G приостановлена"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передача данных 4G приостановлена"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Передача мобильных данных приостановлена"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Нажмите, чтобы включить звук."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Нажмите, чтобы включить вибрацию. Специальные возможности могут прекратить работу."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показаны регуляторы громкости: %s. Проведите вверх, чтобы скрыть."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регуляторы громкости скрыты"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Сообщения"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string>
<string name="instant_apps" msgid="6647570248119804907">"Приложения с мгновенным запуском"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Приложения с мгновенным запуском не требуется устанавливать."</string>
<string name="app_info" msgid="6856026610594615344">"О приложении"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Моб. Интернет"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 4962d4f..d7e66f6 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -236,6 +236,7 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"දත්ත සුරැකුම ක්රියාවිරහිත කරන ලදී."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"දත්ත සුරැකුම ක්රියාත්මක කරන ලදී."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"සංදර්ශක දීප්තිය"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"ආරෝපණය වෙමින්"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G දත්ත විරාම කර ඇත"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G දත්ත විරාම කර ඇත"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"සෙලියුලර් දත්ත විරාම කර ඇත"</string>
@@ -466,6 +467,8 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. නිහඬ කිරීම ඉවත් කිරීමට තට්ටු කරන්න."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. කම්පනය කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string>
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. කම්පනය කිරීමට සකස් කිරීමට තට්ටු කරන්න."</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න."</string>
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s හඬ පරිමා පාලන පෙන්වයි. ඉවත දැමීමට ස්වයිප් කරන්න."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"හඩ පරිමා පාලන සඟවා ඇත"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"පද්ධති UI සුසරකය"</string>
@@ -693,8 +696,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"පොදු පණිවිඩ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"ගබඩාව"</string>
<string name="instant_apps" msgid="6647570248119804907">"ක්ෂණික යෙදුම්"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"ක්ෂණික යෙදුම් ස්ථාපනය කිරීම අවශ්ය නොවේ."</string>
<string name="app_info" msgid="6856026610594615344">"යෙදුම් තොරතුරු"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ජංගම දත්ත"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 716b22b..2f61987 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Šetrič dát bol vypnutý."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Šetrič dát bol zapnutý."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Jas displeja"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Dátové prenosy 2G a 3G sú pozastavené"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Dátové prenosy 4G sú pozastavené"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobilné dáta sú pozastavené"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnite zvuk."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujte režim vibrovania. Služby dostupnosti je možné stlmiť."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Zobrazujú sa ovládacie prvky hlasitosti zariadenia %s. Prejdením prstom nahor to odmietnete."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládacie prvky hlasitosti sú skryté"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Tuner používateľského rozhrania systému"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Všeobecné správy"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Úložisko"</string>
<string name="instant_apps" msgid="6647570248119804907">"Okamžité aplikácie"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Okamžité aplikácie nevyžadujú inštaláciu."</string>
<string name="app_info" msgid="6856026610594615344">"Info o aplikácii"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilné dátové prenosy"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 12592a8..e66a4b9 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Varčevanje s podatki je izklopljeno."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Varčevanje s podatki je vklopljeno."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Svetlost zaslona"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Prenos podatkov v omrežju 2G/3G je zaustavljen"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Prenos podatkov v omrežju 4G je zaustavljen"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Prenos mobilnih podatkov je zaustavljen"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dotaknite se, če želite vklopiti zvok."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazani so ti kontrolniki za glasnost: %s. Povlecite navzgor za opustitev."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrolniki za glasnost so skriti."</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Uglaševalnik uporabniškega vmesnika sistema"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Splošna sporočila"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Shramba"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikacije brez nameščanja"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacij brez nameščanja ni treba namestiti."</string>
<string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobilni podatki"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 44e371e..a7c7038 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Kursyesi i të dhënave është çaktivizuar."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Kursyesi i të dhënave është aktivizuar."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ndriçimi i ekranit"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Të dhënat 2G-3G janë ndërprerë"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Të dhënat 4G janë ndërprerë"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Të dhënat celulare janë ndërprerë"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trokit për të aktivizuar."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tregohen %s kontrolle volumi. Rrëshqit lart për ta larguar."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrollet e volumit janë fshehur"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mesazhe të përgjithshme"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Hapësira ruajtëse"</string>
<string name="instant_apps" msgid="6647570248119804907">"Aplikacionet e çastit"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Aplikacionet e çastit nuk kërkojnë instalim."</string>
<string name="app_info" msgid="6856026610594615344">"Informacioni mbi aplikacionin"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Të dhënat celulare"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 22953c1..f2a77f6 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -237,6 +237,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Уштеда података је искључена."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Уштеда података је укључена."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Осветљеност екрана"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G–3G подаци су паузирани"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G подаци су паузирани"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Мобилни подаци су паузирани"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Додирните да бисте укључили звук."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Додирните да бисте подесили на вибрацију. Звук услуга приступачности ће можда бити искључен."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Контроле за јачину звука (%s) су приказане. Превуците нагоре да бисте их одбацили."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контроле за јачину звука су сакривене"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Тјунер за кориснички интерфејс система"</string>
@@ -696,8 +702,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Опште поруке"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Меморијски простор"</string>
<string name="instant_apps" msgid="6647570248119804907">"Инстант апликације"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Инстант апликације не захтевају инсталацију."</string>
<string name="app_info" msgid="6856026610594615344">"Информације о апликацији"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобилни подаци"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1c70e54..942714c 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Databesparing har inaktiverats."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Databesparing har aktiverats."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Skärmens ljusstyrka"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G- och 3G-data har pausats"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G-data har pausats"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobildata har pausats"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryck här om du vill slå på ljudet."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryck här om du vill sätta på vibrationen. Tillgänglighetstjänster kanske inaktiveras."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volymkontrollerna för %s visas. Svep uppåt för att ignorera."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volymkontrollerna är dolda"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Inställningar för systemgränssnitt"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Allmänna meddelanden"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobildata"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index d129771..4bdcfb8 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Kiokoa Data kimezimwa."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Kiokoa Data kimewashwa."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ung\'aavu wa skrini"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Data ya 2G-3G imesitishwa"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Data ya 4G imesitishwa"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Data ya simu ya mkononi imesitishwa"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Gonga ili urejeshe."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Gonga ili uweke mtetemo. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Gonga ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Inaonyesha %s ya vidhibiti vya sauti. Telezesha kidole juu ili uondoe."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Imeficha vidhibiti vya sauti"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Kirekebishi cha kiolesura cha mfumo"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Ujumbe wa Jumla"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Hifadhi"</string>
<string name="instant_apps" msgid="6647570248119804907">"Programu Zinazofunguka Papo Hapo"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Huhitaji kusakinisha programu zinazofunguka papo hapo."</string>
<string name="app_info" msgid="6856026610594615344">"Maelezo ya programu"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Data ya simu"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e4c4528..d3b1bea 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"தரவுச் சேமிப்பான் முடக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"தரவுச் சேமிப்பான் இயக்கப்பட்டது."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"திரை பிரகாசம்"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G டேட்டா இடைநிறுத்தப்பட்டது"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G டேட்டா இடைநிறுத்தப்பட்டது"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"செல்லுலார் தரவு இடைநிறுத்தப்பட்டது"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ஒலி இயக்க, தட்டவும்."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ஒலிக் கட்டுப்பாடுகள் காட்டப்பட்டன. நிராகரிக்க, மேலே ஸ்வைப் செய்யவும்."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ஒலிக் கட்டுப்பாடுகள் மறைக்கப்பட்டன"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"பொதுச் செய்திகள்"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"சேமிப்பிடம்"</string>
<string name="instant_apps" msgid="6647570248119804907">"இன்ஸ்டண்ட் பயன்பாடுகள்"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"இன்ஸ்டண்ட் பயன்பாடுகளுக்கு நிறுவல் தேவையில்லை."</string>
<string name="app_info" msgid="6856026610594615344">"பயன்பாட்டுத் தகவல்"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"மொபைல் தரவு"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 3d625e1..6f8a7c8 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"డేటా సేవర్ ఆఫ్ చేయబడింది."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"డేటా సేవర్ ఆన్ చేయబడింది."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ప్రదర్శన ప్రకాశం"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G డేటా పాజ్ చేయబడింది"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G డేటా పాజ్ చేయబడింది"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"సెల్యులార్ డేటా పాజ్ చేయబడింది"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. అన్మ్యూట్ చేయడానికి నొక్కండి."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. వైబ్రేషన్కు సెట్ చేయడానికి నొక్కండి. ప్రాప్యత సేవలు మ్యూట్ చేయబడవచ్చు."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. ప్రాప్యత సేవలు మ్యూట్ చేయబడవచ్చు."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s వాల్యూమ్ నియంత్రణలు చూపబడ్డాయి. తీసివేయడానికి పైకి స్వైప్ చేయండి."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"వాల్యూమ్ నియంత్రణలు దాచబడ్డాయి"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"సిస్టమ్ UI ట్యూనర్"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"సాధారణ సందేశాలు"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"నిల్వ"</string>
<string name="instant_apps" msgid="6647570248119804907">"తక్షణ అనువర్తనాలు"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"తక్షణ అనువర్తనాలకు ఇన్స్టాలేషన్ అవసరం లేదు."</string>
<string name="app_info" msgid="6856026610594615344">"అనువర్తన సమాచారం"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"మొబైల్ డేటా"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8cc9388..9fbba0c 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ปิดโปรแกรมประหยัดอินเทอร์เน็ตแล้ว"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"เปิดโปรแกรมประหยัดอินเทอร์เน็ตแล้ว"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ความสว่างของหน้าจอ"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"หยุดการใช้ข้อมูล 2G-3G ชั่วคราวแล้ว"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"หยุดการใช้ข้อมูล 4G ชั่วคราวแล้ว"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"หยุดการใช้ข้อมูลมือถือชั่วคราวแล้ว"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s แตะเพื่อเปิดเสียง"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s แตะเพื่อตั้งค่าให้สั่น อาจมีการปิดเสียงบริการการเข้าถึง"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ตัวควบคุมระดับเสียงแสดงอยู่ เลื่อนขึ้นเพื่อปิด"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ตัวควบคุมระดับเสียงซ่อนอยู่"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"ตัวรับสัญญาณ UI ระบบ"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"ข้อความทั่วไป"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"พื้นที่เก็บข้อมูล"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant App"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Instant Apps ไม่ต้องใช้การติดตั้ง"</string>
<string name="app_info" msgid="6856026610594615344">"ข้อมูลแอป"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ข้อมูลมือถือ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index c2d5c74..95150bd 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Na-off ang Data Saver."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Na-on ang Data Saver."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Liwanag ng display"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Naka-pause ang 2G-3G data"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Naka-pause ang 4G data"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Naka-pause ang cellular data"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. I-tap upang i-unmute."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. I-tap upang itakda na mag-vibrate. Maaaring i-mute ang mga serbisyo sa Accessibility."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ipinapakita ang mga kontrol ng volume ng %s. Mag-swipe pataas upang i-dismiss."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Nakatago ang mga kontrol ng volume"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Tuner ng System UI"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Mga Pangkalahatang Mensahe"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string>
<string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Hindi kailangang i-install ang mga instant na app."</string>
<string name="app_info" msgid="6856026610594615344">"Impormasyon ng app"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Data ng mobile"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index f7bdcc1..17f1d28 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Veri Tasarrufu kapatıldı."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Veri Tasarrufu açıldı."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ekran parlaklığı"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G veri kullanımı duraklatıldı"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G veri kullanımı duraklatıldı"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Hücresel veri kullanımı duraklatıldı"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sesi açmak için hafifçe dokunun."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Titreşime ayarlamak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için hafifçe dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ses denetimleri gösteriliyor. Kapatmak için hızlıca yukarı kaydırın."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ses denetimleri gizlendi"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Sistem Arayüzü Ayarlayıcısı"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Genel Mesajlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Depolama alanı"</string>
<string name="instant_apps" msgid="6647570248119804907">"Hazır Uygulamalar"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Hazır uygulamaların yüklenmesi gerekmez."</string>
<string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobil veriler"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 47eb6ce..22ff3c0 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -240,6 +240,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Заощадження трафіку вимкнено."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Заощадження трафіку ввімкнено."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Яскравість дисплея"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Передавання даних 2G–3G призупинено"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Передавання даних 4G призупинено"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Передавання мобільних даних призупинено"</string>
@@ -472,6 +474,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Торкніться, щоб увімкнути звук."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Торкніться, щоб налаштувати вібросигнал. Спеціальні можливості може бути вимкнено."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показано регуляторів гучності: %s. Проведіть пальцем угору, щоб закрити."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регулятори гучності сховано"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"System UI Tuner"</string>
@@ -701,8 +707,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Загальні повідомлення"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Пам’ять"</string>
<string name="instant_apps" msgid="6647570248119804907">"Додатки з миттєвим запуском"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Додатки з миттєвим запуском не потрібно встановлювати."</string>
<string name="app_info" msgid="6856026610594615344">"Про додаток"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Мобільний трафік"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index ab96322..bc3fcca 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"ڈیٹا سیور آف ہو گیا۔"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"ڈیٹا سرور آن ہو گیا۔"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"ڈسپلے کی چمک"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ڈیٹا موقوف کر دیا گیا"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ڈیٹا موقوف کر دیا گیا"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"سیلولر ڈیٹا موقوف کر دیا گیا"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s۔ آواز چالو کرنے کیلئے تھپتھپائیں۔"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s والیوم کے کنٹرولز دکھائے جا رہے ہیں۔ برخاست کرنے کیلئے سوائپ کریں۔"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"والیوم کے کنٹرولز مخفی ہیں"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"سسٹم UI ٹیونر"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"عمومی پیغامات"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"اسٹوریج"</string>
<string name="instant_apps" msgid="6647570248119804907">"فوری ایپس"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"فوری ایپس کو انسٹالیشن کی ضرورت نہیں ہے۔"</string>
<string name="app_info" msgid="6856026610594615344">"ایپ کی معلومات"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"موبائل ڈیٹا"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 3460961..cd396ea 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Trafik tejash rejimi o‘chirib qo‘yildi."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Trafik tejash rejimi yoqildi."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Ekran yorqinligi"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G internet to‘xtatib qo‘yildi"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G internet to‘xtatib qo‘yildi"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Mobil internetdan foydalanish to‘xtatib qo‘yildi"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ovozini yoqish uchun ustiga bosing."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tebranishni yoqish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovoz balandligini boshqarish tugmalari ko‘rsatilgan: %s. Yopish uchun tepaga suring."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovoz balandligini boshqarish tugmalari yashirilgan"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"SystemUI Tuner"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Umumiy xabarlar"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Xotira"</string>
<string name="instant_apps" msgid="6647570248119804907">"Darhol ochiladigan ilovalar"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Darhol ochiladigan ilovalarni o‘rnatish shart emas."</string>
<string name="app_info" msgid="6856026610594615344">"Ilova haqida"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Mobil internet"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 8e7b7b0..43447ba 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Đã tắt Trình tiết kiệm dữ liệu."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Đã bật Trình tiết kiệm dữ liệu."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Độ sáng màn hình"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Đã tạm dừng dữ liệu 2G-3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Đã tạm dừng dữ liệu 4G"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Đã tạm dừng dữ liệu di động"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Nhấn để bật tiếng."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Nhấn để đặt chế độ rung. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) -->
<skip />
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Thông báo chung"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Bộ nhớ"</string>
<string name="instant_apps" msgid="6647570248119804907">"Ứng dụng tức thì"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Ứng dụng tức thì không yêu cầu cài đặt."</string>
<string name="app_info" msgid="6856026610594615344">"Thông tin ứng dụng"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Dữ liệu di động"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index be297be..12a1460 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"流量节省程序已关闭。"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"流量节省程序已开启。"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"屏幕亮度"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G 数据网络已暂停使用"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G 数据网络已暂停使用"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"移动数据网络已暂停使用"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。点按即可取消静音。"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。点按即可设为振动,但可能会同时将无障碍服务设为静音。"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已显示%s音量控件。向上滑动即可关闭。"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隐藏音量控件"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"系统界面调节工具"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"常规消息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"存储空间"</string>
<string name="instant_apps" msgid="6647570248119804907">"免安装应用"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"免安装应用无需安装就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"应用信息"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"移动数据"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 6906ead..5b73bbf 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -238,6 +238,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"已關閉數據節省模式。"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"已開啟數據節省模式。"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"顯示光暗度"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"已暫停流動數據"</string>
@@ -468,6 +470,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。輕按即可取消靜音。"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。輕按即可設為震動。無障礙功能服務可能已經設為靜音。"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 音量控制項。向上快速滑動即可關閉。"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調諧器"</string>
@@ -695,8 +701,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
<string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"即時應用程式無需安裝即可使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資料"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"流動數據"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 9aae1ad..c8c2c74 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Data Saver 已關閉。"</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Data Saver 已開啟。"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"螢幕亮度"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"已暫停 2G-3G 數據連線"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"已暫停 4G 數據連線"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"已暫停行動數據連線"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。輕觸即可取消靜音。"</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。輕觸即可設為震動,但系統可能會將無障礙服務一併設為靜音。"</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 個音量控制項。向上滑動即可關閉。"</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制項"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"系統使用者介面調整精靈"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
<string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"免安裝應用程式不必安裝就能使用。"</string>
<string name="app_info" msgid="6856026610594615344">"應用程式資訊"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"行動數據"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index c4a448f..6672c93 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -236,6 +236,8 @@
<string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Iseva yedatha ivaliwe."</string>
<string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Iseva yedatha ivuliwe."</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"Bonisa ukukhanya"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
<string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G idatha imisiwe"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G idatha imisiwe"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="4651001290947318931">"Idatha yeselula imisiwe"</string>
@@ -466,6 +468,10 @@
<string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Thepha ukuze ususe ukuthula."</string>
<string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Thepha ukuze usethe ukudlidliza. Amasevisi okufinyelela angathuliswa."</string>
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string>
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
<string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s izilawuli zevolumu ziyaboniswa. Swayiphela phezulu ukuze ulahle."</string>
<string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Izilawuli zevolumi zifihliwe"</string>
<string name="system_ui_tuner" msgid="708224127392452018">"Isishuni se-UI yesistimu"</string>
@@ -693,8 +699,9 @@
<string name="notification_channel_general" msgid="4525309436693914482">"Imilayezo ejwayelekile"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Isitoreji"</string>
<string name="instant_apps" msgid="6647570248119804907">"Izinhlelo zokusebenza ezisheshayo"</string>
+ <!-- no translation found for pip_menu_title (3328510504196964712) -->
+ <skip />
<string name="instant_apps_message" msgid="8116608994995104836">"Izinhlelo zokusebenza ezisheshayo azidingi ukufakwa."</string>
<string name="app_info" msgid="6856026610594615344">"Ulwazi lohlelo lokusebenza"</string>
- <!-- no translation found for mobile_data (7094582042819250762) -->
- <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"Idatha yeselula"</string>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index f331d87..ffaa7ba 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -738,6 +738,16 @@
the configuration of the device, so we can't use -land resources. -->
<dimen name="pip_between_action_padding_land">8dp</dimen>
+ <!-- The height of the PiP actions container in which the actions are vertically centered. -->
+ <dimen name="pip_action_size">48dp</dimen>
+
+ <!-- The padding around a PiP actions. -->
+ <dimen name="pip_action_padding">12dp</dimen>
+
+ <!-- The bottom margin of the expand container when there are actions.
+ Equal to pip_action_size - pip_action_padding. -->
+ <dimen name="pip_expand_container_edge_margin">36dp</dimen>
+
<dimen name="default_gear_space">18dp</dimen>
<dimen name="cell_overlay_padding">18dp</dimen>
diff --git a/packages/SystemUI/res/values/dimens_tv.xml b/packages/SystemUI/res/values/dimens_tv.xml
index 2319229..30355d4 100644
--- a/packages/SystemUI/res/values/dimens_tv.xml
+++ b/packages/SystemUI/res/values/dimens_tv.xml
@@ -17,44 +17,6 @@
*/
-->
<resources>
- <!-- Dimens for recents card in the recents view on tv -->
- <dimen name="recents_tv_card_width">240dip</dimen>
- <dimen name="recents_tv_screenshot_height">135dip</dimen>
- <dimen name="recents_tv_card_extra_badge_size">20dip</dimen>
- <dimen name="recents_tv_banner_width">130dip</dimen>
- <dimen name="recents_tv_banner_height">72dip</dimen>
- <dimen name="recents_tv_fallback_icon_width">40dip</dimen>
- <dimen name="recents_tv_fallback_icon_height">40dip</dimen>
- <dimen name="recents_tv_banner_margin_top">16dip</dimen>
- <dimen name="recents_tv_icon_padding_bottom">8dip</dimen>
- <dimen name="recents_tv_text_padding_start">12dip</dimen>
- <dimen name="recents_tv_text_padding_bottom">12dip</dimen>
- <dimen name="recents_tv_card_corner_radius">2dip</dimen>
-
- <!-- Padding for grid view in recents view on tv -->
- <dimen name="recents_tv_gird_row_top_margin">215dip</dimen>
- <dimen name="recents_tv_grid_max_row_height">268dip</dimen>
- <dimen name="recents_tv_gird_card_spacing">8dip</dimen>
- <dimen name="recents_tv_gird_focused_card_delta">44dip</dimen>
-
- <!-- Values for focus animation -->
- <dimen name="recents_tv_unselected_item_z">6dp</dimen>
- <dimen name="recents_tv_selected_item_z_delta">10dp</dimen>
-
- <!-- Values for text on recents cards on tv -->
- <dimen name="recents_tv_title_text_size">12sp</dimen>
-
- <!-- Values for card dismiss state -->
- <dimen name="recents_tv_dismiss_shift_down">48dip</dimen>
- <dimen name="recents_tv_dismiss_top_margin">356dip</dimen>
- <dimen name="recents_tv_dismiss_icon_size">19dip</dimen>
- <dimen name="recents_tv_dismiss_icon_top_margin">38dip</dimen>
- <dimen name="recents_tv_dismiss_icon_bottom_margin">1dip</dimen>
- <dimen name="recents_tv_dismiss_text_size">12sp</dimen>
-
<!-- Extra space around the PIP and its outline in PIP onboarding activity -->
<dimen name="tv_pip_bounds_space">3dp</dimen>
-
- <!-- Values for entering Recents and exiting Recents -->
- <dimen name="recents_tv_home_recents_shift">125dip</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/integers_tv.xml b/packages/SystemUI/res/values/integers_tv.xml
index 3b62938..09547da 100644
--- a/packages/SystemUI/res/values/integers_tv.xml
+++ b/packages/SystemUI/res/values/integers_tv.xml
@@ -14,17 +14,6 @@
limitations under the License.
-->
<resources>
- <integer name="item_scale_anim_duration">150</integer>
- <integer name="dismiss_short_duration">200</integer>
- <integer name="dismiss_long_duration">400</integer>
-
- <integer name="recents_tv_pip_focus_anim_duration">200</integer>
-
- <!-- Duration for how long it takes cards to slide in or out when going to and from recents. -->
- <integer name="recents_home_duration">400</integer>
- <!-- Delay between the start of slide in animation for each card. -->
- <integer name="recents_home_delay">40</integer>
-
<!-- Delay of the onboarding animation start after it launches -->
<integer name="tv_pip_onboarding_anim_start_delay">1000</integer>
<!-- Duration of the onboarding animation duration -->
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 93ae763..c9e7e57 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -565,6 +565,9 @@
<!-- Content description of the display brightness slider (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_brightness">Display brightness</string>
+ <!-- Content description of the charging indicator on Ambient Display (lower-power version of the lock screen). [CHAR LIMIT=NONE] -->
+ <string name="accessibility_ambient_display_charging">Charging</string>
+
<!-- Title of dialog shown when 2G-3G data usage has exceeded limit and has been disabled. [CHAR LIMIT=48] -->
<string name="data_usage_disabled_dialog_3g_title">2G-3G data is paused</string>
<!-- Title of dialog shown when 4G data usage has exceeded limit and has been disabled. [CHAR LIMIT=48] -->
@@ -857,7 +860,7 @@
<string name="keyguard_unlock">Swipe up to unlock</string>
<!-- Text on keyguard screen and in Quick Settings footer indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=60] -->
- <string name="do_disclosure_generic">This device is managed</string>
+ <string name="do_disclosure_generic">This device is managed by your organization</string>
<!-- Text on keyguard screen and in Quick Settings footer indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=40] -->
<string name="do_disclosure_with_name">This device is managed by <xliff:g id="organization_name" example="Foo, Inc.">%s</xliff:g></string>
@@ -1815,6 +1818,9 @@
<!-- App label of the instant apps notification [CHAR LIMIT=60] -->
<string name="instant_apps">Instant Apps</string>
+ <!-- Title of menu shown over picture-in-picture. Used for accessibility. -->
+ <string name="pip_menu_title">Picture in picture menu</string>
+
<!-- Message of the instant apps notification indicating they don't need install [CHAR LIMIT=NONE] -->
<string name="instant_apps_message">Instant apps don\'t require installation.</string>
diff --git a/packages/SystemUI/res/values/strings_tv.xml b/packages/SystemUI/res/values/strings_tv.xml
index f49d201..fb9e1f2 100644
--- a/packages/SystemUI/res/values/strings_tv.xml
+++ b/packages/SystemUI/res/values/strings_tv.xml
@@ -37,15 +37,4 @@
<string name="pip_onboarding_description">This keeps your video in view until you play another one. Press and hold <b>HOME</b> to control it.</string>
<!-- Button to close picture-in-picture (PIP) onboarding screen. -->
<string name="pip_onboarding_button">Got it</string>
- <!-- Dismiss icon description -->
- <string name="recents_tv_dismiss">Dismiss</string>
- <!-- Font for Recents -->
- <!-- DO NOT TRANSLATE -->
- <string name="font_roboto_regular" translatable="false">sans-serif</string>
- <!-- DO NOT TRANSLATE -->
- <string name="font_roboto_light" translatable="false">sans-serif-light</string>
- <!-- Package names to be blacklisted in Recents, add package names into overlay as needed -->
- <string-array name="recents_tv_blacklist_array">
- </string-array>
-
</resources>
diff --git a/packages/SystemUI/res/values/styles_tv.xml b/packages/SystemUI/res/values/styles_tv.xml
index 263e1a4..3f0caab 100644
--- a/packages/SystemUI/res/values/styles_tv.xml
+++ b/packages/SystemUI/res/values/styles_tv.xml
@@ -22,11 +22,4 @@
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
-
- <style name="RecentsTvTheme.Wallpaper" parent="@android:style/Theme.Material.NoActionBar.Overscan">
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:backgroundDimEnabled">false</item>
- <item name="android:colorBackgroundCacheHint">@null</item>
- <item name="android:windowIsTranslucent">true</item>
- </style>
</resources>
diff --git a/packages/SystemUI/res/values/values_tv.xml b/packages/SystemUI/res/values/values_tv.xml
deleted file mode 100644
index 9259415..0000000
--- a/packages/SystemUI/res/values/values_tv.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <item format="float" type="integer" name="unselected_scale">1.0</item>
- <item format="float" type="integer" name="selected_scale">1.259</item>
- <item format="float" type="integer" name="dismiss_unselected_alpha">0.3</item>
-</resources>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index f8f4f2a..2655837 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -35,6 +35,7 @@
import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.ChargingView;
import java.util.Locale;
@@ -50,6 +51,7 @@
private TextClock mClockView;
private TextView mOwnerInfo;
private ViewGroup mClockContainer;
+ private ChargingView mBatteryDoze;
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
@@ -114,6 +116,7 @@
mDateView.setShowCurrentUserTime(true);
mClockView.setShowCurrentUserTime(true);
mOwnerInfo = (TextView) findViewById(R.id.owner_info);
+ mBatteryDoze = (ChargingView) findViewById(R.id.battery_doze);
boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
setEnableMarquee(shouldMarquee);
@@ -273,10 +276,11 @@
final int N = mClockContainer.getChildCount();
for (int i = 0; i < N; i++) {
View child = mClockContainer.getChildAt(i);
- if (child == mClockView) {
+ if (child == mClockView || child == mBatteryDoze) {
continue;
}
child.setAlpha(dark ? 0 : 1);
}
+ mBatteryDoze.setDark(dark);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index ee8641b..14f2c4a 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -15,6 +15,8 @@
*/
package com.android.systemui;
+import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
+
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
@@ -50,8 +52,6 @@
public class BatteryMeterView extends LinearLayout implements
BatteryStateChangeCallback, Tunable, DarkReceiver, ConfigurationListener {
- public static final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent";
-
private final BatteryMeterDrawableBase mDrawable;
private final String mSlotBattery;
private final ImageView mBatteryIconView;
@@ -129,7 +129,7 @@
mBatteryController = Dependency.get(BatteryController.class);
mBatteryController.addCallback(this);
getContext().getContentResolver().registerContentObserver(
- Settings.System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
+ Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver);
updateShowPercent();
Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
Dependency.get(ConfigurationController.class).addCallback(this);
@@ -175,7 +175,7 @@
private void updateShowPercent() {
final boolean showing = mBatteryPercentView != null;
if (0 != Settings.System.getInt(getContext().getContentResolver(),
- BatteryMeterView.SHOW_PERCENT_SETTING, 0) || mForceShowPercent) {
+ SHOW_BATTERY_PERCENT, 0) || mForceShowPercent) {
if (!showing) {
mBatteryPercentView = loadPercentView();
if (mTextColor != 0) mBatteryPercentView.setTextColor(mTextColor);
diff --git a/packages/SystemUI/src/com/android/systemui/ChargingView.java b/packages/SystemUI/src/com/android/systemui/ChargingView.java
new file mode 100644
index 0000000..555cc74
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/ChargingView.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+
+/**
+ * A view that only shows its drawable while the phone is charging.
+ *
+ * Also reloads its drawable upon density changes.
+ */
+public class ChargingView extends ImageView implements
+ BatteryController.BatteryStateChangeCallback,
+ ConfigurationController.ConfigurationListener {
+
+ private BatteryController mBatteryController;
+ private int mImageResource;
+ private boolean mCharging;
+ private boolean mDark;
+
+ public ChargingView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.src});
+ int srcResId = a.getResourceId(0, 0);
+
+ if (srcResId != 0) {
+ mImageResource = srcResId;
+ }
+
+ a.recycle();
+
+ updateVisibility();
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mBatteryController = Dependency.get(BatteryController.class);
+ mBatteryController.addCallback(this);
+ Dependency.get(ConfigurationController.class).addCallback(this);
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mBatteryController.removeCallback(this);
+ Dependency.get(ConfigurationController.class).removeCallback(this);
+ }
+
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+ mCharging = charging;
+ updateVisibility();
+ }
+
+ @Override
+ public void onDensityOrFontScaleChanged() {
+ setImageResource(mImageResource);
+ }
+
+ public void setDark(boolean dark) {
+ mDark = dark;
+ updateVisibility();
+ }
+
+ private void updateVisibility() {
+ setVisibility(mCharging && mDark ? VISIBLE : INVISIBLE);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 5d57daa..ba8e54a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -22,12 +22,12 @@
import android.content.Context;
import android.hardware.SensorManager;
import android.os.Handler;
-import android.os.PowerManager;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.plugins.doze.DozeProvider;
import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.wakelock.WakeLock;
public class DozeFactory {
@@ -41,19 +41,17 @@
public DozeMachine assembleMachine(DozeService dozeService) {
Context context = dozeService;
SensorManager sensorManager = context.getSystemService(SensorManager.class);
- PowerManager powerManager = context.getSystemService(PowerManager.class);
AlarmManager alarmManager = context.getSystemService(AlarmManager.class);
DozeHost host = getHost(dozeService);
AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context);
DozeParameters params = new DozeParameters(context);
Handler handler = new Handler();
- DozeFactory.WakeLock wakeLock = new DozeFactory.WakeLock(powerManager.newWakeLock(
- PowerManager.PARTIAL_WAKE_LOCK, "Doze"));
+ WakeLock wakeLock = WakeLock.createPartial(context, "Doze");
DozeMachine machine = new DozeMachine(
DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params),
- params,
+ config,
wakeLock);
machine.setParts(new DozeMachine.Part[]{
createDozeTriggers(context, sensorManager, host, config, params, handler, wakeLock,
@@ -157,28 +155,4 @@
final SystemUIApplication app = (SystemUIApplication) appCandidate;
return app.getComponent(DozeHost.class);
}
-
- /** A wrapper around {@link PowerManager.WakeLock} for testability. */
- public static class WakeLock implements DozeProvider.WakeLock {
- private final PowerManager.WakeLock mInner;
-
- public WakeLock(PowerManager.WakeLock inner) {
- mInner = inner;
- }
-
- /** @see PowerManager.WakeLock#acquire() */
- public void acquire() {
- mInner.acquire();
- }
-
- /** @see PowerManager.WakeLock#release() */
- public void release() {
- mInner.release();
- }
-
- /** @see PowerManager.WakeLock#wrap(Runnable) */
- public Runnable wrap(Runnable runnable) {
- return mInner.wrap(runnable);
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index c9eb790..f27521e 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -17,12 +17,14 @@
package com.android.systemui.doze;
import android.annotation.MainThread;
+import android.os.UserHandle;
import android.util.Log;
import android.view.Display;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.util.Preconditions;
-import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
+import com.android.systemui.util.wakelock.WakeLock;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -94,17 +96,18 @@
}
private final Service mDozeService;
- private final DozeFactory.WakeLock mWakeLock;
- private final DozeParameters mParams;
+ private final WakeLock mWakeLock;
+ private final AmbientDisplayConfiguration mConfig;
private Part[] mParts;
private final ArrayList<State> mQueuedRequests = new ArrayList<>();
private State mState = State.UNINITIALIZED;
private boolean mWakeLockHeldForCurrentState = false;
- public DozeMachine(Service service, DozeParameters params, DozeFactory.WakeLock wakeLock) {
+ public DozeMachine(Service service, AmbientDisplayConfiguration config,
+ WakeLock wakeLock) {
mDozeService = service;
- mParams = params;
+ mConfig = config;
mWakeLock = wakeLock;
}
@@ -267,7 +270,7 @@
switch (state) {
case INITIALIZED:
case DOZE_PULSE_DONE:
- transitionTo(mParams.getAlwaysOn()
+ transitionTo(mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)
? DozeMachine.State.DOZE_AOD : DozeMachine.State.DOZE);
break;
default:
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 9cc927d..2ac0657 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -36,6 +36,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.wakelock.WakeLock;
import java.io.PrintWriter;
import java.util.List;
@@ -53,14 +54,14 @@
private final TriggerSensor mPickupSensor;
private final DozeParameters mDozeParameters;
private final AmbientDisplayConfiguration mConfig;
- private final DozeFactory.WakeLock mWakeLock;
+ private final WakeLock mWakeLock;
private final Callback mCallback;
private final Handler mHandler = new Handler();
public DozeSensors(Context context, SensorManager sensorManager, DozeParameters dozeParameters,
- AmbientDisplayConfiguration config, DozeFactory.WakeLock wakeLock, Callback callback) {
+ AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback) {
mContext = context;
mSensorManager = sensorManager;
mDozeParameters = dozeParameters;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index b5c7dd3..1b9bf73 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -36,6 +36,7 @@
import com.android.internal.util.Preconditions;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
+import com.android.systemui.util.wakelock.WakeLock;
import java.io.PrintWriter;
@@ -57,7 +58,7 @@
private final DozeParameters mDozeParameters;
private final SensorManager mSensorManager;
private final Handler mHandler;
- private final DozeFactory.WakeLock mWakeLock;
+ private final WakeLock mWakeLock;
private final boolean mAllowPulseTriggers;
private final UiModeManager mUiModeManager;
private final TriggerReceiver mBroadcastReceiver = new TriggerReceiver();
@@ -69,7 +70,7 @@
public DozeTriggers(Context context, DozeMachine machine, DozeHost dozeHost,
AmbientDisplayConfiguration config,
DozeParameters dozeParameters, SensorManager sensorManager, Handler handler,
- DozeFactory.WakeLock wakeLock, boolean allowPulseTriggers) {
+ WakeLock wakeLock, boolean allowPulseTriggers) {
mContext = context;
mMachine = machine;
mDozeHost = dozeHost;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 76e0283..f577654 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -21,6 +21,8 @@
import android.os.Handler;
import android.os.SystemClock;
+import com.android.systemui.util.wakelock.WakeLock;
+
import java.util.Calendar;
import java.util.GregorianCalendar;
@@ -33,14 +35,14 @@
private final AlarmManager mAlarmManager;
private final DozeHost mHost;
private final Handler mHandler;
- private final DozeFactory.WakeLock mWakeLock;
+ private final WakeLock mWakeLock;
private final DozeMachine mMachine;
private final AlarmManager.OnAlarmListener mTimeTick;
private boolean mTimeTickScheduled = false;
public DozeUi(Context context, AlarmManager alarmManager, DozeMachine machine,
- DozeFactory.WakeLock wakeLock, DozeHost host, Handler handler) {
+ WakeLock wakeLock, DozeHost host, Handler handler) {
mContext = context;
mAlarmManager = alarmManager;
mMachine = machine;
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/InputConsumerController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/InputConsumerController.java
index 7a1849e..867c15c 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/InputConsumerController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/InputConsumerController.java
@@ -44,6 +44,14 @@
}
/**
+ * Listener interface for callers to learn when this class is registered or unregistered with
+ * window manager
+ */
+ public interface RegistrationListener {
+ void onRegistrationChanged(boolean isRegistered);
+ }
+
+ /**
* Input handler used for the PiP input consumer.
*/
private final class PipInputEventReceiver extends InputEventReceiver {
@@ -71,6 +79,7 @@
private PipInputEventReceiver mInputEventReceiver;
private TouchListener mListener;
+ private RegistrationListener mRegistrationListener;
public InputConsumerController(IWindowManager windowManager) {
mWindowManager = windowManager;
@@ -85,6 +94,25 @@
}
/**
+ * Sets the registration listener.
+ */
+ public void setRegistrationListener(RegistrationListener listener) {
+ mRegistrationListener = listener;
+ if (mRegistrationListener != null) {
+ mRegistrationListener.onRegistrationChanged(mInputEventReceiver != null);
+ }
+ }
+
+ /**
+ * Check if the InputConsumer is currently registered with WindowManager
+ *
+ * @return {@code true} if registered, {@code false} if not.
+ */
+ public boolean isRegistered() {
+ return mInputEventReceiver != null;
+ }
+
+ /**
* Registers the input consumer.
*/
public void registerInputConsumer() {
@@ -97,6 +125,9 @@
Log.e(TAG, "Failed to create PIP input consumer", e);
}
mInputEventReceiver = new PipInputEventReceiver(inputChannel, Looper.myLooper());
+ if (mRegistrationListener != null) {
+ mRegistrationListener.onRegistrationChanged(true /* isRegistered */);
+ }
}
}
@@ -112,6 +143,9 @@
}
mInputEventReceiver.dispose();
mInputEventReceiver = null;
+ if (mRegistrationListener != null) {
+ mRegistrationListener.onRegistrationChanged(false /* isRegistered */);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
new file mode 100644
index 0000000..968bd28
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.pip.phone;
+
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.view.MagnificationSpec;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityWindowInfo;
+import android.view.accessibility.IAccessibilityInteractionConnection;
+import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Expose the touch actions to accessibility as if this object were a window with a single view.
+ * That pseudo-view exposes all of the actions this object can perform.
+ */
+public class PipAccessibilityInteractionConnection
+ extends IAccessibilityInteractionConnection.Stub {
+
+ public interface AccessibilityCallbacks {
+ void onAccessibilityShowMenu();
+ }
+
+ private static final long ACCESSIBILITY_NODE_ID = 1;
+ private List<AccessibilityNodeInfo> mAccessibilityNodeInfoList;
+
+ private Handler mHandler;
+ private PipMotionHelper mMotionHelper;
+ private AccessibilityCallbacks mCallbacks;
+
+ private Rect mTmpBounds = new Rect();
+
+ public PipAccessibilityInteractionConnection(PipMotionHelper motionHelper,
+ AccessibilityCallbacks callbacks, Handler handler) {
+ mHandler = handler;
+ mMotionHelper = motionHelper;
+ mCallbacks = callbacks;
+ }
+
+ @Override
+ public void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId,
+ Region interactiveRegion, int interactionId,
+ IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid, MagnificationSpec spec, Bundle args) {
+ try {
+ callback.setFindAccessibilityNodeInfosResult(
+ (accessibilityNodeId == AccessibilityNodeInfo.ROOT_NODE_ID)
+ ? getNodeList() : null, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ @Override
+ public void performAccessibilityAction(long accessibilityNodeId, int action,
+ Bundle arguments, int interactionId,
+ IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid) {
+ // We only support one view. A request for anything else is invalid
+ boolean result = false;
+ if (accessibilityNodeId == AccessibilityNodeInfo.ROOT_NODE_ID) {
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_CLICK:
+ mHandler.post(() -> {
+ mCallbacks.onAccessibilityShowMenu();
+ });
+ result = true;
+ break;
+ case AccessibilityNodeInfo.ACTION_DISMISS:
+ mMotionHelper.dismissPip();
+ result = true;
+ break;
+ case com.android.internal.R.id.accessibilityActionMoveWindow:
+ int newX = arguments.getInt(
+ AccessibilityNodeInfo.ACTION_ARGUMENT_MOVE_WINDOW_X);
+ int newY = arguments.getInt(
+ AccessibilityNodeInfo.ACTION_ARGUMENT_MOVE_WINDOW_Y);
+ Rect pipBounds = new Rect();
+ pipBounds.set(mMotionHelper.getBounds());
+ mTmpBounds.offsetTo(newX, newY);
+ mMotionHelper.movePip(mTmpBounds);
+ result = true;
+ break;
+ case AccessibilityNodeInfo.ACTION_EXPAND:
+ mMotionHelper.expandPip();
+ result = true;
+ break;
+ default:
+ // Leave result as false
+ }
+ }
+ try {
+ callback.setPerformAccessibilityActionResult(result, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ @Override
+ public void findAccessibilityNodeInfosByViewId(long accessibilityNodeId,
+ String viewId, Region interactiveRegion, int interactionId,
+ IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
+ // We have no view with a proper ID
+ try {
+ callback.setFindAccessibilityNodeInfoResult(null, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ @Override
+ public void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text,
+ Region interactiveRegion, int interactionId,
+ IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
+ // We have no view with text
+ try {
+ callback.setFindAccessibilityNodeInfoResult(null, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ @Override
+ public void findFocus(long accessibilityNodeId, int focusType, Region interactiveRegion,
+ int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
+ // We have no view that can take focus
+ try {
+ callback.setFindAccessibilityNodeInfoResult(null, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ @Override
+ public void focusSearch(long accessibilityNodeId, int direction, Region interactiveRegion,
+ int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
+ int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
+ // We have no view that can take focus
+ try {
+ callback.setFindAccessibilityNodeInfoResult(null, interactionId);
+ } catch (RemoteException re) {
+ /* best effort - ignore */
+ }
+ }
+
+ public static AccessibilityNodeInfo obtainRootAccessibilityNodeInfo() {
+ AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain();
+ info.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID,
+ AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_MOVE_WINDOW);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND);
+ info.setImportantForAccessibility(true);
+ info.setClickable(true);
+ info.setVisibleToUser(true);
+ return info;
+ }
+
+ private List<AccessibilityNodeInfo> getNodeList() {
+ if (mAccessibilityNodeInfoList == null) {
+ mAccessibilityNodeInfoList = new ArrayList<>(1);
+ }
+ AccessibilityNodeInfo info = obtainRootAccessibilityNodeInfo();
+ mAccessibilityNodeInfoList.clear();
+ mAccessibilityNodeInfoList.add(info);
+ return mAccessibilityNodeInfoList;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index 65de22e..86e2c49 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -16,6 +16,11 @@
package com.android.systemui.pip.phone;
+import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_ACTIONS;
+import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_CONTROLLER_MESSENGER;
+import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_MOVEMENT_BOUNDS;
+import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_STACK_BOUNDS;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -26,20 +31,25 @@
import android.app.RemoteAction;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
+import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PointF;
+import android.graphics.Rect;
+import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
+import android.util.Pair;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
+import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -71,6 +81,7 @@
private View mMenuContainer;
private LinearLayout mActionsGroup;
private View mDismissButton;
+ private ImageView mExpandButton;
private int mBetweenActionPaddingLand;
private ObjectAnimator mMenuContainerAnimator;
@@ -85,7 +96,8 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_SHOW_MENU:
- showMenu();
+ Pair<Rect, Rect> bounds = (Pair<Rect, Rect>) msg.obj;
+ showMenu(bounds.first, bounds.second);
break;
case MESSAGE_POKE_MENU:
cancelDelayedFinish();
@@ -94,7 +106,8 @@
hideMenu();
break;
case MESSAGE_UPDATE_ACTIONS:
- setActions(((ParceledListSlice) msg.obj).getList());
+ Pair<Rect, ParceledListSlice> data = (Pair<Rect, ParceledListSlice>) msg.obj;
+ setActions(data.first, data.second.getList());
break;
}
}
@@ -117,15 +130,6 @@
super.onCreate(savedInstanceState);
setContentView(R.layout.pip_menu_activity);
- Intent startingIntent = getIntent();
- mToControllerMessenger = startingIntent.getParcelableExtra(
- PipMenuActivityController.EXTRA_CONTROLLER_MESSENGER);
- ParceledListSlice actions = startingIntent.getParcelableExtra(
- PipMenuActivityController.EXTRA_ACTIONS);
- if (actions != null) {
- setActions(actions.getList());
- }
-
mMenuContainer = findViewById(R.id.menu);
mMenuContainer.setOnClickListener((v) -> {
expandPip();
@@ -137,15 +141,17 @@
mActionsGroup = (LinearLayout) findViewById(R.id.actions_group);
mBetweenActionPaddingLand = getResources().getDimensionPixelSize(
R.dimen.pip_between_action_padding_land);
+ mExpandButton = (ImageView) findViewById(R.id.expand_button);
+ updateFromIntent(getIntent());
+ setTitle(R.string.pip_menu_title);
notifyActivityCallback(mMessenger);
- showMenu();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
- showMenu();
+ updateFromIntent(intent);
}
@Override
@@ -214,13 +220,14 @@
// Do nothing
}
- private void showMenu() {
+ private void showMenu(Rect stackBounds, Rect movementBounds) {
if (!mMenuVisible) {
if (mMenuContainerAnimator != null) {
mMenuContainerAnimator.cancel();
}
notifyMenuVisibility(true);
+ updateExpandButtonFromBounds(stackBounds, movementBounds);
mMenuContainerAnimator = ObjectAnimator.ofFloat(mMenuContainer, View.ALPHA,
mMenuContainer.getAlpha(), 1f);
mMenuContainerAnimator.setInterpolator(Interpolators.ALPHA_IN);
@@ -257,19 +264,52 @@
if (animationFinishedRunnable != null) {
animationFinishedRunnable.run();
}
+ if (getSystemService(AccessibilityManager.class).isEnabled()) {
+ finish();
+ }
}
});
mMenuContainerAnimator.start();
}
}
- private void setActions(List<RemoteAction> actions) {
- mActions.clear();
- mActions.addAll(actions);
- updateActionViews();
+ private void updateFromIntent(Intent intent) {
+ Rect stackBounds = Rect.unflattenFromString(intent.getStringExtra(EXTRA_STACK_BOUNDS));
+ Rect movementBounds = Rect.unflattenFromString(intent.getStringExtra(
+ EXTRA_MOVEMENT_BOUNDS));
+ mToControllerMessenger = intent.getParcelableExtra(EXTRA_CONTROLLER_MESSENGER);
+ ParceledListSlice actions = intent.getParcelableExtra(EXTRA_ACTIONS);
+ if (actions != null) {
+ setActions(stackBounds, actions.getList());
+ }
+ showMenu(stackBounds, movementBounds);
}
- private void updateActionViews() {
+ private void updateExpandButtonFromBounds(Rect stackBounds, Rect movementBounds) {
+ if (stackBounds == null) {
+ return;
+ }
+
+ boolean isLandscapePip = stackBounds.width() > stackBounds.height();
+ boolean left = stackBounds.left < movementBounds.centerX();
+ boolean top = stackBounds.top < movementBounds.centerY();
+ boolean expandL = (left && top) || (!left && !top);
+ int iconResId;
+ if (isLandscapePip) {
+ iconResId = expandL ? R.drawable.pip_expand_ll : R.drawable.pip_expand_lr;
+ } else {
+ iconResId = expandL ? R.drawable.pip_expand_pl : R.drawable.pip_expand_pr;
+ }
+ mExpandButton.setImageResource(iconResId);
+ }
+
+ private void setActions(Rect stackBounds, List<RemoteAction> actions) {
+ mActions.clear();
+ mActions.addAll(actions);
+ updateActionViews(stackBounds);
+ }
+
+ private void updateActionViews(Rect stackBounds) {
ViewGroup expandContainer = (ViewGroup) findViewById(R.id.expand_container);
ViewGroup actionsContainer = (ViewGroup) findViewById(R.id.actions_container);
actionsContainer.setOnTouchListener((v, ev) -> {
@@ -277,7 +317,6 @@
return true;
});
- int actionsContainerHeight = 0;
if (mActions.isEmpty()) {
actionsContainer.setVisibility(View.INVISIBLE);
} else {
@@ -286,9 +325,8 @@
mActionsGroup.removeAllViews();
// Recreate the layout
- final View decorView = getWindow().getDecorView();
- final boolean isLandscapePip = decorView.getMeasuredWidth()
- > decorView.getMeasuredHeight();
+ final boolean isLandscapePip = stackBounds != null &&
+ (stackBounds.width() > stackBounds.height());
final LayoutInflater inflater = LayoutInflater.from(this);
for (int i = 0; i < mActions.size(); i++) {
final RemoteAction action = mActions.get(i);
@@ -314,13 +352,17 @@
mActionsGroup.addView(actionView);
}
}
- actionsContainerHeight = actionsContainer.getLayoutParams().height;
- }
- // Update the expand container margin to account for the existence of the action container
- ((FrameLayout.LayoutParams) expandContainer.getLayoutParams()).bottomMargin =
- actionsContainerHeight;
- expandContainer.requestLayout();
+ // Update the expand container margin to adjust the center of the expand button to
+ // account for the existence of the action container
+ FrameLayout.LayoutParams expandedLp =
+ (FrameLayout.LayoutParams) expandContainer.getLayoutParams();
+ expandedLp.topMargin = getResources().getDimensionPixelSize(
+ R.dimen.pip_action_padding);
+ expandedLp.bottomMargin = getResources().getDimensionPixelSize(
+ R.dimen.pip_expand_container_edge_margin);
+ expandContainer.requestLayout();
+ }
}
private void notifyRegisterInputConsumer() {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index 0b1c3ec..badf64b 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -25,12 +25,14 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
+import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
+import android.util.Pair;
import android.view.IWindowManager;
import com.android.systemui.pip.phone.PipMediaController.ActionListener;
@@ -51,6 +53,8 @@
public static final String EXTRA_CONTROLLER_MESSENGER = "messenger";
public static final String EXTRA_ACTIONS = "actions";
+ public static final String EXTRA_STACK_BOUNDS = "stack_bounds";
+ public static final String EXTRA_MOVEMENT_BOUNDS = "movement_bounds";
public static final int MESSAGE_MENU_VISIBILITY_CHANGED = 100;
public static final int MESSAGE_EXPAND_PIP = 101;
@@ -177,10 +181,11 @@
/**
* Shows the menu activity.
*/
- public void showMenu() {
+ public void showMenu(Rect stackBounds, Rect movementBounds) {
if (mToActivityMessenger != null) {
Message m = Message.obtain();
m.what = PipMenuActivity.MESSAGE_SHOW_MENU;
+ m.obj = new Pair<>(stackBounds, movementBounds);
try {
mToActivityMessenger.send(m);
} catch (RemoteException e) {
@@ -195,6 +200,8 @@
Intent intent = new Intent(mContext, PipMenuActivity.class);
intent.putExtra(EXTRA_CONTROLLER_MESSENGER, mMessenger);
intent.putExtra(EXTRA_ACTIONS, resolveMenuActions());
+ intent.putExtra(EXTRA_STACK_BOUNDS, stackBounds.flattenToString());
+ intent.putExtra(EXTRA_MOVEMENT_BOUNDS, movementBounds.flattenToString());
ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0);
options.setLaunchTaskId(
pinnedStackInfo.taskIds[pinnedStackInfo.taskIds.length - 1]);
@@ -269,9 +276,20 @@
*/
private void updateMenuActions() {
if (mToActivityMessenger != null) {
+ // Fetch the pinned stack bounds
+ Rect stackBounds = null;
+ try {
+ StackInfo pinnedStackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
+ if (pinnedStackInfo != null) {
+ stackBounds = pinnedStackInfo.bounds;
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error showing PIP menu activity", e);
+ }
+
Message m = Message.obtain();
m.what = PipMenuActivity.MESSAGE_UPDATE_ACTIONS;
- m.obj = resolveMenuActions();
+ m.obj = new Pair<>(stackBounds, resolveMenuActions());
try {
mToActivityMessenger.send(m);
} catch (RemoteException e) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index 20c1136..49d89a2 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -56,7 +56,8 @@
private static final int DEFAULT_MOVE_STACK_DURATION = 225;
private static final int SNAP_STACK_DURATION = 225;
- private static final int DISMISS_STACK_DURATION = 375;
+ private static final int DRAG_TO_TARGET_DISMISS_STACK_DURATION = 375;
+ private static final int DRAG_TO_DISMISS_STACK_DURATION = 175;
private static final int SHRINK_STACK_FROM_MENU_DURATION = 250;
private static final int EXPAND_STACK_TO_MENU_DURATION = 250;
private static final int EXPAND_STACK_TO_FULLSCREEN_DURATION = 300;
@@ -65,6 +66,8 @@
// The fraction of the stack width that the user has to drag offscreen to minimize the PiP
private static final float MINIMIZE_OFFSCREEN_FRACTION = 0.2f;
+ // The fraction of the stack height that the user has to drag offscreen to minimize the PiP
+ private static final float DISMISS_OFFSCREEN_FRACTION = 0.35f;
private Context mContext;
private IActivityManager mActivityManager;
@@ -194,6 +197,19 @@
}
/**
+ * @return whether the PiP at the current bounds should be dismissed.
+ */
+ boolean shouldDismissPip() {
+ Point displaySize = new Point();
+ mContext.getDisplay().getRealSize(displaySize);
+ if (mBounds.bottom > displaySize.y) {
+ float offscreenFraction = (float) (mBounds.bottom - displaySize.y) / mBounds.height();
+ return offscreenFraction >= DISMISS_OFFSCREEN_FRACTION;
+ }
+ return false;
+ }
+
+ /**
* Flings the minimized PiP to the closest minimized snap target.
*/
Rect flingToMinimizedState(float velocityY, Rect movementBounds) {
@@ -298,15 +314,37 @@
}
/**
+ * Animates the dismissal of the PiP off the edge of the screen.
+ */
+ Rect animateDragToEdgeDismiss(Rect pipBounds) {
+ cancelAnimations();
+ Point displaySize = new Point();
+ mContext.getDisplay().getRealSize(displaySize);
+ Rect toBounds = new Rect(pipBounds);
+ toBounds.offset(0, displaySize.y - pipBounds.top);
+ mBoundsAnimator = createAnimationToBounds(mBounds, toBounds, DRAG_TO_DISMISS_STACK_DURATION,
+ FAST_OUT_LINEAR_IN, mUpdateBoundsListener);
+ mBoundsAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ dismissPip();
+ }
+ });
+ mBoundsAnimator.start();
+ return toBounds;
+ }
+
+ /**
* Animates the dismissal of the PiP over the dismiss target bounds.
*/
- Rect animateDismissFromDrag(Rect dismissBounds) {
+ Rect animateDragToTargetDismiss(Rect dismissBounds) {
cancelAnimations();
Rect toBounds = new Rect(dismissBounds.centerX(),
dismissBounds.centerY(),
dismissBounds.centerX() + 1,
dismissBounds.centerY() + 1);
- mBoundsAnimator = createAnimationToBounds(mBounds, toBounds, DISMISS_STACK_DURATION,
+ mBoundsAnimator = createAnimationToBounds(mBounds, toBounds,
+ DRAG_TO_TARGET_DISMISS_STACK_DURATION,
FAST_OUT_LINEAR_IN, mUpdateBoundsListener);
mBoundsAnimator.addListener(new AnimatorListenerAdapter() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 010522d..80231a9 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -26,9 +26,11 @@
import android.util.Log;
import android.util.Size;
import android.view.IPinnedStackController;
-import android.view.IWindowManager;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -52,7 +54,8 @@
private static final int SHOW_DISMISS_AFFORDANCE_DELAY = 200;
// Allow dragging the PIP to a location to close it
- private static final boolean ENABLE_DRAG_TO_DISMISS = false;
+ private static final boolean ENABLE_DISMISS_DRAG_TO_TARGET = false;
+ private static final boolean ENABLE_DISMISS_DRAG_TO_EDGE = false;
private final Context mContext;
private final IActivityManager mActivityManager;
@@ -63,6 +66,7 @@
private final PipMenuActivityController mMenuController;
private final PipDismissViewController mDismissViewController;
private final PipSnapAlgorithm mSnapAlgorithm;
+ private final AccessibilityManager mAccessibilityManager;
// The current movement bounds
private Rect mMovementBounds = new Rect();
@@ -78,7 +82,7 @@
private Runnable mShowDismissAffordance = new Runnable() {
@Override
public void run() {
- if (ENABLE_DRAG_TO_DISMISS) {
+ if (ENABLE_DISMISS_DRAG_TO_TARGET) {
mDismissViewController.showDismissTarget(mMotionHelper.getBounds());
}
}
@@ -90,6 +94,7 @@
private boolean mIsImeShowing;
private int mImeHeight;
private float mSavedSnapFraction = -1f;
+ private boolean mSendingHoverAccessibilityEvents;
// Touch state
private final PipTouchState mTouchState;
@@ -137,6 +142,7 @@
// Initialize the Pip input consumer
mContext = context;
mActivityManager = activityManager;
+ mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
mViewConfig = ViewConfiguration.get(context);
mMenuController = menuController;
mMenuController.addListener(mMenuListener);
@@ -154,6 +160,8 @@
// Register the listener for input consumer touch events
inputConsumerController.setTouchListener(this::handleTouchEvent);
+ inputConsumerController.setRegistrationListener(this::onRegistrationChanged);
+ onRegistrationChanged(inputConsumerController.isRegistered());
}
public void setTouchEnabled(boolean enabled) {
@@ -238,6 +246,16 @@
updateMovementBounds(mIsMenuVisible);
}
+ private void onRegistrationChanged(boolean isRegistered) {
+ mAccessibilityManager.setPictureInPictureActionReplacingConnection(isRegistered
+ ? new PipAccessibilityInteractionConnection(mMotionHelper,
+ this::onAccessibilityShowMenu, mHandler) : null);
+ }
+
+ private void onAccessibilityShowMenu() {
+ mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
+ }
+
private boolean handleTouchEvent(MotionEvent ev) {
// Skip touch handling until we are bound to the controller
if (mPinnedStackController == null) {
@@ -281,6 +299,33 @@
mTouchState.reset();
break;
}
+ case MotionEvent.ACTION_HOVER_ENTER:
+ case MotionEvent.ACTION_HOVER_MOVE: {
+ if (!mSendingHoverAccessibilityEvents) {
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
+ AccessibilityNodeInfo info =
+ PipAccessibilityInteractionConnection.obtainRootAccessibilityNodeInfo();
+ event.setSource(info);
+ info.recycle();
+ mAccessibilityManager.sendAccessibilityEvent(event);
+ mSendingHoverAccessibilityEvents = true;
+ }
+ break;
+ }
+ case MotionEvent.ACTION_HOVER_EXIT: {
+ if (mSendingHoverAccessibilityEvents) {
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
+ AccessibilityNodeInfo info =
+ PipAccessibilityInteractionConnection.obtainRootAccessibilityNodeInfo();
+ event.setSource(info);
+ info.recycle();
+ mAccessibilityManager.sendAccessibilityEvent(event);
+ mSendingHoverAccessibilityEvents = false;
+ }
+ break;
+ }
}
return !mIsMenuVisible;
}
@@ -378,7 +423,7 @@
mMenuController.pokeMenu();
}
- if (ENABLE_DRAG_TO_DISMISS) {
+ if (ENABLE_DISMISS_DRAG_TO_TARGET) {
mDismissViewController.createDismissTarget();
mHandler.postDelayed(mShowDismissAffordance, SHOW_DISMISS_AFFORDANCE_DELAY);
}
@@ -394,7 +439,7 @@
mSavedSnapFraction = -1f;
}
- if (touchState.startedDragging() && ENABLE_DRAG_TO_DISMISS) {
+ if (touchState.startedDragging() && ENABLE_DISMISS_DRAG_TO_TARGET) {
mHandler.removeCallbacks(mShowDismissAffordance);
mDismissViewController.showDismissTarget(mMotionHelper.getBounds());
}
@@ -408,11 +453,16 @@
if (!touchState.allowDraggingOffscreen()) {
left = Math.max(mMovementBounds.left, Math.min(mMovementBounds.right, left));
}
- top = Math.max(mMovementBounds.top, Math.min(mMovementBounds.bottom, top));
+ if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ // Allow pip to move past bottom bounds
+ top = Math.max(mMovementBounds.top, top);
+ } else {
+ top = Math.max(mMovementBounds.top, Math.min(mMovementBounds.bottom, top));
+ }
mTmpBounds.offsetTo((int) left, (int) top);
mMotionHelper.movePip(mTmpBounds);
- if (ENABLE_DRAG_TO_DISMISS) {
+ if (ENABLE_DISMISS_DRAG_TO_TARGET) {
mDismissViewController.updateDismissTarget(mTmpBounds);
}
return true;
@@ -427,7 +477,7 @@
}
try {
- if (ENABLE_DRAG_TO_DISMISS) {
+ if (ENABLE_DISMISS_DRAG_TO_TARGET) {
mHandler.removeCallbacks(mShowDismissAffordance);
PointF vel = mTouchState.getVelocity();
final float velocity = PointF.length(vel.x, vel.y);
@@ -435,7 +485,7 @@
&& velocity < mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
if (mDismissViewController.shouldDismiss(mMotionHelper.getBounds())) {
Rect dismissBounds = mDismissViewController.getDismissBounds();
- mMotionHelper.animateDismissFromDrag(dismissBounds);
+ mMotionHelper.animateDragToTargetDismiss(dismissBounds);
MetricsLogger.action(mContext,
MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
METRIC_VALUE_DISMISSED_BY_DRAG);
@@ -448,9 +498,17 @@
}
if (touchState.isDragging()) {
- PointF vel = mTouchState.getVelocity();
- if (!mIsMinimized && (mMotionHelper.shouldMinimizePip()
- || isHorizontalFlingTowardsCurrentEdge(vel))) {
+ final boolean onLeft = mMotionHelper.getBounds().left < mMovementBounds.centerX();
+ boolean isFlingToBot = isFlingTowardsEdge(touchState, 4 /* bottom */);
+ if (ENABLE_DISMISS_DRAG_TO_EDGE
+ && (mMotionHelper.shouldDismissPip() || isFlingToBot)) {
+ mMotionHelper.animateDragToEdgeDismiss(mMotionHelper.getBounds());
+ MetricsLogger.action(mContext,
+ MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
+ METRIC_VALUE_DISMISSED_BY_DRAG);
+ return true;
+ } else if (!mIsMinimized && (mMotionHelper.shouldMinimizePip()
+ || isFlingTowardsEdge(touchState, onLeft ? 2 : 3))) {
// Pip should be minimized
setMinimizedStateInternal(true);
if (mMenuController.isMenuVisible()) {
@@ -472,9 +530,10 @@
// If the menu is still visible, and we aren't minimized, then just poke the menu
// so that it will timeout after the user stops touching it
if (mMenuController.isMenuVisible()) {
- mMenuController.showMenu();
+ mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
}
+ final PointF vel = mTouchState.getVelocity();
final float velocity = PointF.length(vel.x, vel.y);
if (velocity > mFlingAnimationUtils.getMinVelocityPxPerSecond()) {
mMotionHelper.flingToSnapTarget(velocity, vel.x, vel.y, mMovementBounds);
@@ -486,7 +545,7 @@
mMotionHelper.animateToClosestSnapTarget(mMovementBounds);
setMinimizedStateInternal(false);
} else if (!mIsMenuVisible) {
- mMenuController.showMenu();
+ mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
} else {
mMotionHelper.expandPip();
}
@@ -495,29 +554,39 @@
};
/**
- * @return whether the gesture ending in the {@param vel} is fast enough to be a fling towards
- * the same edge the PIP is on. Used to identify a minimize gesture.
+ * @return whether the gesture ending in {@param vel} is fast enough to be a fling and towards
+ * the provided {@param edge} where:
+ *
+ * 1 = top
+ * 2 = left
+ * 3 = right
+ * 4 = bottom
*/
- private boolean isHorizontalFlingTowardsCurrentEdge(PointF vel) {
- final boolean isHorizontal = Math.abs(vel.x) > Math.abs(vel.y);
- final boolean isFling = PointF.length(vel.x, vel.y) > mFlingAnimationUtils
- .getMinVelocityPxPerSecond();
- final boolean towardsCurrentEdge = isOverEdge(true /* left */) && vel.x < 0
- || isOverEdge(false /* right */) && vel.x > 0;
- return towardsCurrentEdge && isHorizontal && isFling;
- }
-
- /**
- * @return whether the given bounds are on the left or right edge (depending on
- * {@param checkLeft})
- */
- private boolean isOverEdge(boolean checkLeft) {
+ private boolean isFlingTowardsEdge(PipTouchState touchState, int edge) {
+ final PointF vel = touchState.getVelocity();
+ final PointF downPos = touchState.getDownTouchPosition();
final Rect bounds = mMotionHelper.getBounds();
- if (checkLeft) {
- return bounds.left <= mMovementBounds.left;
- } else {
- return bounds.right >= mMovementBounds.right + bounds.width();
+ final boolean isHorizontal = Math.abs(vel.x) > Math.abs(vel.y);
+ final boolean isFling =
+ PointF.length(vel.x, vel.y) > mFlingAnimationUtils.getMinVelocityPxPerSecond();
+ if (!isFling) {
+ return false;
}
+ switch (edge) {
+ case 1: // top
+ return !isHorizontal && vel.y < 0
+ && downPos.y <= mMovementBounds.top + bounds.height();
+ case 2: // left
+ return isHorizontal && vel.x < 0
+ && downPos.x <= mMovementBounds.left + bounds.width();
+ case 3: // right
+ return isHorizontal && vel.x > 0
+ && downPos.x >= mMovementBounds.right;
+ case 4: // bottom
+ return !isHorizontal && vel.y > 0
+ && downPos.y >= mMovementBounds.bottom;
+ }
+ return false;
}
/**
@@ -542,9 +611,10 @@
pw.println(innerPrefix + "mIsImeShowing=" + mIsImeShowing);
pw.println(innerPrefix + "mImeHeight=" + mImeHeight);
pw.println(innerPrefix + "mSavedSnapFraction=" + mSavedSnapFraction);
- pw.println(innerPrefix + "mEnableDragToDismiss=" + ENABLE_DRAG_TO_DISMISS);
+ pw.println(innerPrefix + "mEnableDragToDismiss=" + ENABLE_DISMISS_DRAG_TO_TARGET);
mSnapAlgorithm.dump(pw, innerPrefix);
mTouchState.dump(pw, innerPrefix);
mMotionHelper.dump(pw, innerPrefix);
}
+
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
index a317dc3..b34a07d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java
@@ -170,6 +170,13 @@
}
/**
+ * @return the down touch position.
+ */
+ public PointF getDownTouchPosition() {
+ return mDownTouch;
+ }
+
+ /**
* @return the movement delta between the last handled touch event and the down touch
* position.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 9a8974d..b71c87d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -86,14 +86,6 @@
* State when PIP menu dialog is shown.
*/
public static final int STATE_PIP_MENU = 2;
- /**
- * State when PIP is shown in Recents.
- */
- public static final int STATE_PIP_RECENTS = 3;
- /**
- * State when PIP is shown in Recents and it's focused to allow an user to control.
- */
- public static final int STATE_PIP_RECENTS_FOCUSED = 4;
private static final int TASK_ID_NO_PIP = -1;
private static final int INVALID_RESOURCE_TYPE = -1;
@@ -119,7 +111,6 @@
private int mSuspendPipResizingReason;
private Context mContext;
- private PipRecentsOverlayManager mPipRecentsOverlayManager;
private IActivityManager mActivityManager;
private IWindowManager mWindowManager;
private MediaSessionManager mMediaSessionManager;
@@ -132,9 +123,6 @@
private Rect mDefaultPipBounds = new Rect();
private Rect mSettingsPipBounds;
private Rect mMenuModePipBounds;
- private Rect mRecentsPipBounds;
- private Rect mRecentsFocusedPipBounds;
- private int mRecentsFocusChangedAnimationDurationMs;
private boolean mInitialized;
private int mPipTaskId = TASK_ID_NO_PIP;
private ComponentName mPipComponentName;
@@ -259,7 +247,6 @@
}
loadConfigurationsAndApply();
- mPipRecentsOverlayManager = new PipRecentsOverlayManager(context);
mMediaSessionManager =
(MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
@@ -276,12 +263,6 @@
R.string.pip_settings_bounds));
mMenuModePipBounds = Rect.unflattenFromString(res.getString(
R.string.pip_menu_bounds));
- mRecentsPipBounds = Rect.unflattenFromString(res.getString(
- R.string.pip_recents_bounds));
- mRecentsFocusedPipBounds = Rect.unflattenFromString(res.getString(
- R.string.pip_recents_focused_bounds));
- mRecentsFocusChangedAnimationDurationMs = res.getInteger(
- R.integer.recents_tv_pip_focus_anim_duration);
// Reset the PIP bounds and apply. PIP bounds can be changed by two reasons.
// 1. Configuration changed due to the language change (RTL <-> RTL)
@@ -295,7 +276,6 @@
*/
public void onConfigurationChanged() {
loadConfigurationsAndApply();
- mPipRecentsOverlayManager.onConfigurationChanged(mContext);
}
/**
@@ -385,8 +365,6 @@
*/
void resizePinnedStack(int state) {
if (DEBUG) Log.d(TAG, "resizePinnedStack() state=" + state);
- boolean wasRecentsShown =
- (mState == STATE_PIP_RECENTS || mState == STATE_PIP_RECENTS_FOCUSED);
boolean wasStateNoPip = (mState == STATE_NO_PIP);
mState = state;
for (int i = mListeners.size() - 1; i >= 0; --i) {
@@ -413,22 +391,12 @@
case STATE_PIP_OVERLAY:
mCurrentPipBounds = mPipBounds;
break;
- case STATE_PIP_RECENTS:
- mCurrentPipBounds = mRecentsPipBounds;
- break;
- case STATE_PIP_RECENTS_FOCUSED:
- mCurrentPipBounds = mRecentsFocusedPipBounds;
- break;
default:
mCurrentPipBounds = mPipBounds;
break;
}
try {
int animationDurationMs = -1;
- if (wasRecentsShown
- && (mState == STATE_PIP_RECENTS || mState == STATE_PIP_RECENTS_FOCUSED)) {
- animationDurationMs = mRecentsFocusChangedAnimationDurationMs;
- }
mActivityManager.resizeStack(PINNED_STACK_ID, mCurrentPipBounds,
true, true, true, animationDurationMs);
} catch (RemoteException e) {
@@ -444,23 +412,11 @@
}
/**
- * Returns the focused PIP bound while Recents is shown.
- * This is used to place PIP controls in Recents.
- */
- public Rect getRecentsFocusedPipBounds() {
- return mRecentsFocusedPipBounds;
- }
-
- /**
* Shows PIP menu UI by launching {@link PipMenuActivity}. It also locates the pinned
* stack to the centered PIP bound {@link R.config_centeredPictureInPictureBounds}.
*/
private void showPipMenu() {
if (DEBUG) Log.d(TAG, "showPipMenu()");
- if (mPipRecentsOverlayManager.isRecentsShown()) {
- if (DEBUG) Log.d(TAG, "Ignore showing PIP menu");
- return;
- }
mState = STATE_PIP_MENU;
for (int i = mListeners.size() - 1; i >= 0; --i) {
mListeners.get(i).onShowPipMenu();
@@ -692,11 +648,6 @@
mMediaSessionManager.addOnActiveSessionsChangedListener(
mActiveMediaSessionListener, null);
updateMediaController(mMediaSessionManager.getActiveSessions(null));
- if (mPipRecentsOverlayManager.isRecentsShown()) {
- // If an activity becomes PIPed again after the fullscreen, the Recents is shown
- // behind so we need to resize the pinned stack and show the correct overlay.
- resizePinnedStack(STATE_PIP_RECENTS);
- }
for (int i = mListeners.size() - 1; i >= 0; i--) {
mListeners.get(i).onPipEntered();
}
@@ -721,18 +672,7 @@
}
switch (mState) {
case STATE_PIP_OVERLAY:
- if (!mPipRecentsOverlayManager.isRecentsShown()) {
- showPipOverlay();
- break;
- } else {
- // This happens only if an activity is PIPed after the Recents is shown.
- // See {@link PipRecentsOverlayManager.requestFocus} for more details.
- resizePinnedStack(mState);
- break;
- }
- case STATE_PIP_RECENTS:
- case STATE_PIP_RECENTS_FOCUSED:
- mPipRecentsOverlayManager.addPipRecentsOverlayView();
+ showPipOverlay();
break;
case STATE_PIP_MENU:
showPipMenu();
@@ -780,13 +720,6 @@
return sPipManager;
}
- /**
- * Gets an instance of {@link PipRecentsOverlayManager}.
- */
- public PipRecentsOverlayManager getPipRecentsOverlayManager() {
- return mPipRecentsOverlayManager;
- }
-
private void updatePipVisibility(final boolean visible) {
SystemServicesProxy.getInstance(mContext).setTvPipVisibility(visible);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsControlsView.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsControlsView.java
deleted file mode 100644
index a891d12..0000000
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsControlsView.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.pip.tv;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorSet;
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import com.android.systemui.R;
-
-/**
- * An FrameLayout that contains {@link PipControlsView} with its scrim.
- */
-public class PipRecentsControlsView extends FrameLayout {
- /**
- * An interface to listen user action.
- */
- public interface Listener extends PipControlsView.Listener {
- /**
- * Called when an user presses BACK key and up.
- */
- abstract void onBackPressed();
- }
-
- private final PipManager mPipManager = PipManager.getInstance();
- private PipControlsView mPipControlsView;
- private View mScrim;
- private Animator mFocusGainAnimator;
- private AnimatorSet mFocusLossAnimatorSet;
-
- public PipRecentsControlsView(Context context) {
- this(context, null, 0, 0);
- }
-
- public PipRecentsControlsView(Context context, AttributeSet attrs) {
- this(context, attrs, 0, 0);
- }
-
- public PipRecentsControlsView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public PipRecentsControlsView(
- Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- public void onFinishInflate() {
- super.onFinishInflate();
-
- mPipControlsView = (PipControlsView) findViewById(R.id.pip_control_contents);
- mScrim = findViewById(R.id.scrim);
-
- mFocusGainAnimator = loadAnimator(mPipControlsView,
- R.anim.tv_pip_controls_in_recents_focus_gain_animation);
-
- mFocusLossAnimatorSet = new AnimatorSet();
- mFocusLossAnimatorSet.playSequentially(
- loadAnimator(mPipControlsView,
- R.anim.tv_pip_controls_in_recents_focus_loss_animation),
- loadAnimator(mScrim, R.anim.tv_pip_controls_in_recents_scrim_fade_in_animation));
-
- Rect pipBounds = mPipManager.getRecentsFocusedPipBounds();
- setPadding(0, pipBounds.bottom, 0, 0);
- }
-
- private Animator loadAnimator(View view, int animatorResId) {
- Animator animator = AnimatorInflater.loadAnimator(getContext(), animatorResId);
- animator.setTarget(view);
- return animator;
- }
-
- /**
- * Starts focus gain animation.
- */
- public void startFocusGainAnimation() {
- // Hides the scrim view as soon as possible, before the PIP resize animation starts.
- // If we don't, PIP will be moved down a bit and a gap between the scrim and PIP will be
- // shown at the bottom of the PIP.
- mScrim.setAlpha(0);
- PipControlButtonView focus = mPipControlsView.getFocusedButton();
- if (focus != null) {
- focus.startFocusGainAnimation();
- }
- startAnimator(mFocusGainAnimator, mFocusLossAnimatorSet);
- }
-
- /**
- * Starts focus loss animation.
- */
- public void startFocusLossAnimation() {
- PipControlButtonView focus = mPipControlsView.getFocusedButton();
- if (focus != null) {
- focus.startFocusLossAnimation();
- }
- startAnimator(mFocusLossAnimatorSet, mFocusGainAnimator);
- }
-
- /**
- * Resets the view to the initial state. (i.e. end of the focus gain)
- */
- public void reset() {
- cancelAnimator(mFocusGainAnimator);
- cancelAnimator(mFocusLossAnimatorSet);
-
- // Reset to initial state (i.e. end of focused)
- mScrim.setAlpha(0);
- mPipControlsView.setTranslationY(0);
- mPipControlsView.setScaleX(1);
- mPipControlsView.setScaleY(1);
- mPipControlsView.reset();
- }
-
- private static void startAnimator(Animator animator, Animator previousAnimator) {
- cancelAnimator(previousAnimator);
- if (!animator.isStarted()) {
- animator.start();
- }
- }
-
- private static void cancelAnimator(Animator animator) {
- if (animator.isStarted()) {
- animator.cancel();
- }
- }
-
- /**
- * Sets listeners.
- */
- public void setListener(Listener listener) {
- mPipControlsView.setListener(listener);
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (!event.isCanceled()) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
- && event.getAction() == KeyEvent.ACTION_UP) {
- if (mPipControlsView.mListener != null) {
- ((PipRecentsControlsView.Listener) mPipControlsView.mListener).onBackPressed();
- }
- return true;
- } else if (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- mPipManager.getPipRecentsOverlayManager().clearFocus();
- }
- // Consume the down event always to prevent warning logs from ViewRootImpl.
- return true;
- }
- }
- return super.dispatchKeyEvent(event);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsOverlayManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsOverlayManager.java
deleted file mode 100644
index 835bcbc..0000000
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipRecentsOverlayManager.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.pip.tv;
-
-import android.content.Context;
-import android.graphics.PixelFormat;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.accessibility.AccessibilityEvent;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-
-import static android.view.Gravity.CENTER_HORIZONTAL;
-import static android.view.Gravity.TOP;
-import static android.view.View.MeasureSpec.UNSPECIFIED;
-
-public class PipRecentsOverlayManager {
- private static final String TAG = "PipRecentsOverlayManager";
-
- public interface Callback {
- void onClosed();
- void onBackPressed();
- void onRecentsFocused();
- }
-
- private final PipManager mPipManager = PipManager.getInstance();
- private final WindowManager mWindowManager;
- private final SystemServicesProxy mSystemServicesProxy;
- private View mOverlayView;
- private PipRecentsControlsView mPipControlsView;
- private View mRecentsView;
- private boolean mTalkBackEnabled;
-
- private LayoutParams mPipRecentsControlsViewLayoutParams;
- private LayoutParams mPipRecentsControlsViewFocusedLayoutParams;
-
- private boolean mHasFocusableInRecents;
- private boolean mIsPipRecentsOverlayShown;
- private boolean mIsRecentsShown;
- private boolean mIsPipFocusedInRecent;
- private Callback mCallback;
- private PipRecentsControlsView.Listener mPipControlsViewListener =
- new PipRecentsControlsView.Listener() {
- @Override
- public void onClosed() {
- if (mCallback != null) {
- mCallback.onClosed();
- }
- }
-
- @Override
- public void onBackPressed() {
- if (mCallback != null) {
- mCallback.onBackPressed();
- }
- }
- };
-
- PipRecentsOverlayManager(Context context) {
- mWindowManager = (WindowManager) context.getSystemService(WindowManager.class);
- mSystemServicesProxy = SystemServicesProxy.getInstance(context);
- initViews(context);
- }
-
- private void initViews(Context context) {
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mOverlayView = inflater.inflate(R.layout.tv_pip_recents_overlay, null);
- mPipControlsView = (PipRecentsControlsView) mOverlayView.findViewById(R.id.pip_controls);
- mRecentsView = mOverlayView.findViewById(R.id.recents);
- mRecentsView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- clearFocus();
- }
- }
- });
-
- mOverlayView.measure(UNSPECIFIED, UNSPECIFIED);
- mPipRecentsControlsViewLayoutParams = new WindowManager.LayoutParams(
- mOverlayView.getMeasuredWidth(), mOverlayView.getMeasuredHeight(),
- LayoutParams.TYPE_SYSTEM_DIALOG,
- LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE,
- PixelFormat.TRANSLUCENT);
- mPipRecentsControlsViewLayoutParams.gravity = TOP | CENTER_HORIZONTAL;
- mPipRecentsControlsViewFocusedLayoutParams = new WindowManager.LayoutParams(
- mOverlayView.getMeasuredWidth(), mOverlayView.getMeasuredHeight(),
- LayoutParams.TYPE_SYSTEM_DIALOG,
- 0,
- PixelFormat.TRANSLUCENT);
- mPipRecentsControlsViewFocusedLayoutParams.gravity = TOP | CENTER_HORIZONTAL;
- }
-
- /**
- * Add Recents overlay view.
- * This is expected to be called after the PIP animation is over.
- */
- void addPipRecentsOverlayView() {
- if (mIsPipRecentsOverlayShown) {
- return;
- }
- mTalkBackEnabled = mSystemServicesProxy.isTouchExplorationEnabled();
- mRecentsView.setVisibility(mTalkBackEnabled ? View.VISIBLE : View.GONE);
- mIsPipRecentsOverlayShown = true;
- mIsPipFocusedInRecent = true;
- mWindowManager.addView(mOverlayView, mPipRecentsControlsViewFocusedLayoutParams);
- }
-
- /**
- * Remove Recents overlay view.
- * This should be called when Recents or PIP is closed.
- */
- public void removePipRecentsOverlayView() {
- if (!mIsPipRecentsOverlayShown) {
- return;
- }
- mWindowManager.removeView(mOverlayView);
- // Resets the controls view when its removed.
- // If not, changing focus in reset will be show animation when Recents is resumed.
- mPipControlsView.reset();
- mIsPipRecentsOverlayShown = false;
- }
-
- /**
- * Request focus to the PIP Recents overlay.
- * This should be called only by {@link com.android.systemui.recents.tv.RecentsTvActivity}.
- * @param hasFocusableInRecents {@code true} if Recents can have focus. (i.e. Has a recent task)
- */
- public void requestFocus(boolean hasFocusableInRecents) {
- mHasFocusableInRecents = hasFocusableInRecents;
- if (!mIsPipRecentsOverlayShown || !mIsRecentsShown || mIsPipFocusedInRecent
- || !mPipManager.isPipShown()) {
- return;
- }
- mIsPipFocusedInRecent = true;
- mPipControlsView.startFocusGainAnimation();
- mWindowManager.updateViewLayout(mOverlayView, mPipRecentsControlsViewFocusedLayoutParams);
- mPipManager.resizePinnedStack(PipManager.STATE_PIP_RECENTS_FOCUSED);
- if (mTalkBackEnabled) {
- mPipControlsView.requestFocus();
- mPipControlsView.sendAccessibilityEvent(
- AccessibilityEvent.TYPE_VIEW_FOCUSED);
- }
- }
-
- /**
- * Request focus to the PIP Recents overlay.
- */
- public void clearFocus() {
- if (!mIsPipRecentsOverlayShown || !mIsRecentsShown || !mIsPipFocusedInRecent
- || !mPipManager.isPipShown() || !mHasFocusableInRecents) {
- return;
- }
- mIsPipFocusedInRecent = false;
- mPipControlsView.startFocusLossAnimation();
- mWindowManager.updateViewLayout(mOverlayView, mPipRecentsControlsViewLayoutParams);
- mPipManager.resizePinnedStack(PipManager.STATE_PIP_RECENTS);
- if (mCallback != null) {
- mCallback.onRecentsFocused();
- }
- }
-
- public void setCallback(Callback listener) {
- mCallback = listener;
- mPipControlsView.setListener(mCallback != null ? mPipControlsViewListener : null);
- }
-
- /**
- * Called when Recents is resumed.
- * PIPed activity will be resized accordingly and overlay will show available buttons.
- */
- public void onRecentsResumed() {
- if (!mPipManager.isPipShown()) {
- return;
- }
- mIsRecentsShown = true;
- mIsPipFocusedInRecent = true;
- mPipManager.resizePinnedStack(PipManager.STATE_PIP_RECENTS_FOCUSED);
- // Overlay view will be added after the resize animation ends, if any.
- }
-
- /**
- * Called when Recents is paused.
- * PIPed activity will be resized accordingly and overlay will hide available buttons.
- */
- public void onRecentsPaused() {
- mIsRecentsShown = false;
- mIsPipFocusedInRecent = false;
- removePipRecentsOverlayView();
-
- if (mPipManager.isPipShown()) {
- mPipManager.resizePinnedStack(PipManager.STATE_PIP_OVERLAY);
- }
- }
-
- /**
- * Returns {@code true} if recents is shown.
- */
- boolean isRecentsShown() {
- return mIsRecentsShown;
- }
-
- /**
- * Updates the PIP per configuration changed.
- */
- void onConfigurationChanged(Context context) {
- if (mIsRecentsShown) {
- Log.w(TAG, "Configuration is changed while Recents is shown");
- }
- initViews(context);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index e635162..d3e939f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -60,7 +60,6 @@
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.tv.RecentsTvImpl;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue;
@@ -86,7 +85,6 @@
public final static Set<String> RECENTS_ACTIVITIES = new HashSet<>();
static {
RECENTS_ACTIVITIES.add(RecentsImpl.RECENTS_ACTIVITY);
- RECENTS_ACTIVITIES.add(RecentsTvImpl.RECENTS_TV_ACTIVITY);
}
// Purely for experimentation
@@ -205,13 +203,7 @@
sTaskLoader = new RecentsTaskLoader(mContext);
sConfiguration = new RecentsConfiguration(mContext);
mHandler = new Handler();
- UiModeManager uiModeManager = (UiModeManager) mContext.
- getSystemService(Context.UI_MODE_SERVICE);
- if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
- mImpl = new RecentsTvImpl(mContext);
- } else {
- mImpl = new RecentsImpl(mContext);
- }
+ mImpl = new RecentsImpl(mContext);
// Check if there is a recents override package
if ("userdebug".equals(Build.TYPE) || "eng".equals(Build.TYPE)) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskEvent.java
deleted file mode 100644
index 04ca68f..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskEvent.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.events.activity;
-
-
-import android.graphics.Rect;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.tv.views.TaskCardView;
-
-public class LaunchTvTaskEvent extends EventBus.Event {
-
- public final TaskCardView taskView;
- public final Task task;
- public final Rect targetTaskBounds;
- public final int targetTaskStack;
-
- public LaunchTvTaskEvent(TaskCardView taskView, Task task, Rect targetTaskBounds,
- int targetTaskStack) {
- this.taskView = taskView;
- this.task = task;
- this.targetTaskBounds = targetTaskBounds;
- this.targetTaskStack = targetTaskStack;
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskStartedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskStartedEvent.java
deleted file mode 100644
index 75d3efa..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchTvTaskStartedEvent.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recents.events.activity;
-
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.tv.views.TaskCardView;
-
-/**
- * This event is sent following {@link LaunchTvTaskEvent} after the call to the system is made to
- * start the task, only used on TV.
- */
-public class LaunchTvTaskStartedEvent extends EventBus.AnimatedEvent {
-
- public final TaskCardView taskView;
-
- public LaunchTvTaskStartedEvent(TaskCardView taskView) {
- this.taskView = taskView;
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 31f9ba4..47468ae 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -22,6 +22,7 @@
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
+import static android.app.ActivityManager.StackId.RECENTS_STACK_ID;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
import android.annotation.NonNull;
@@ -519,7 +520,7 @@
try {
return mIam.moveTaskToDockedStack(taskId, createMode, true /* onTop */,
- false /* animate */, initialBounds, true /* moveHomeStackFront */ );
+ false /* animate */, initialBounds);
} catch (RemoteException e) {
e.printStackTrace();
}
@@ -1057,15 +1058,18 @@
}
/**
- * Returns the window rect for the RecentsActivity, based on the dimensions of the home stack.
+ * Returns the window rect for the RecentsActivity, based on the dimensions of the recents stack
*/
public Rect getWindowRect() {
Rect windowRect = new Rect();
if (mIam == null) return windowRect;
try {
- // Use the home stack bounds
- ActivityManager.StackInfo stackInfo = mIam.getStackInfo(HOME_STACK_ID);
+ // Use the recents stack bounds, fallback to fullscreen stack if it is null
+ ActivityManager.StackInfo stackInfo = mIam.getStackInfo(RECENTS_STACK_ID);
+ if (stackInfo == null) {
+ stackInfo = mIam.getStackInfo(FULLSCREEN_WORKSPACE_STACK_ID);
+ }
if (stackInfo != null) {
windowRect.set(stackInfo.bounds);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java
deleted file mode 100644
index a691a424..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv;
-
-import android.app.Activity;
-import android.app.ActivityOptions;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewTreeObserver.OnPreDrawListener;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.FrameLayout.LayoutParams;
-
-import com.android.systemui.R;
-import com.android.systemui.pip.tv.PipManager;
-import com.android.systemui.pip.tv.PipRecentsOverlayManager;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsActivityLaunchState;
-import com.android.systemui.recents.RecentsConfiguration;
-import com.android.systemui.recents.RecentsImpl;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
-import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
-import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent;
-import com.android.systemui.recents.events.activity.HideRecentsEvent;
-import com.android.systemui.recents.events.activity.LaunchTaskFailedEvent;
-import com.android.systemui.recents.events.activity.ToggleRecentsEvent;
-import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
-import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent;
-import com.android.systemui.recents.events.ui.DeleteTaskDataEvent;
-import com.android.systemui.recents.events.ui.UserInteractionEvent;
-import com.android.systemui.recents.events.ui.focus.DismissFocusedTaskViewEvent;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.RecentsPackageMonitor;
-import com.android.systemui.recents.model.RecentsTaskLoadPlan;
-import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.model.TaskStack;
-import com.android.systemui.recents.tv.animations.HomeRecentsEnterExitAnimationHolder;
-import com.android.systemui.recents.tv.views.RecentsTvView;
-import com.android.systemui.recents.tv.views.TaskCardView;
-import com.android.systemui.recents.tv.views.TaskStackHorizontalGridView;
-import com.android.systemui.recents.tv.views.TaskStackHorizontalViewAdapter;
-import com.android.systemui.statusbar.phone.StatusBar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * The main TV recents activity started by the RecentsImpl.
- */
-public class RecentsTvActivity extends Activity implements OnPreDrawListener {
- private final static String TAG = "RecentsTvActivity";
- private final static boolean DEBUG = false;
-
- public final static int EVENT_BUS_PRIORITY = Recents.EVENT_BUS_PRIORITY + 1;
- private final static String RECENTS_HOME_INTENT_EXTRA =
- "com.android.systemui.recents.tv.RecentsTvActivity.RECENTS_HOME_INTENT_EXTRA";
-
- private boolean mFinishedOnStartup;
- private RecentsPackageMonitor mPackageMonitor;
- private long mLastTabKeyEventTime;
- private boolean mIgnoreAltTabRelease;
- private boolean mLaunchedFromHome;
- private boolean mTalkBackEnabled;
-
- private RecentsTvView mRecentsView;
- private View mPipView;
- private TaskStackHorizontalViewAdapter mTaskStackViewAdapter;
- private TaskStackHorizontalGridView mTaskStackHorizontalGridView;
- private FinishRecentsRunnable mFinishLaunchHomeRunnable;
- private HomeRecentsEnterExitAnimationHolder mHomeRecentsEnterExitAnimationHolder;
-
- private final PipManager mPipManager = PipManager.getInstance();
- private final PipManager.Listener mPipListener = new PipManager.Listener() {
- @Override
- public void onPipEntered() {
- updatePipUI();
- }
-
- @Override
- public void onPipActivityClosed() {
- updatePipUI();
- }
-
- @Override
- public void onShowPipMenu() {
- updatePipUI();
- }
-
- @Override
- public void onMoveToFullscreen() {
- // Recents should be dismissed when PIP moves to fullscreen. If not, Recents will
- // be unnecessarily shown in the scenario: PIP->Fullscreen->PIP.
- // Do not show Recents close animation because PIP->Fullscreen animation will be shown
- // instead.
- dismissRecentsToLaunchTargetTaskOrHome(false);
- }
-
- @Override
- public void onPipResizeAboutToStart() { }
- };
- private PipRecentsOverlayManager mPipRecentsOverlayManager;
- private final PipRecentsOverlayManager.Callback mPipRecentsOverlayManagerCallback =
- new PipRecentsOverlayManager.Callback() {
- @Override
- public void onClosed() {
- dismissRecentsToLaunchTargetTaskOrHome(true);
- }
-
- @Override
- public void onBackPressed() {
- RecentsTvActivity.this.onBackPressed();
- }
-
- @Override
- public void onRecentsFocused() {
- if (mTalkBackEnabled) {
- mTaskStackHorizontalGridView.requestFocus();
- mTaskStackHorizontalGridView.sendAccessibilityEvent(
- AccessibilityEvent.TYPE_VIEW_FOCUSED);
- }
- mTaskStackHorizontalGridView.startFocusGainAnimation();
- }
- };
-
- private final View.OnFocusChangeListener mPipViewFocusChangeListener =
- new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- requestPipControlsFocus();
- }
- }
- };
-
- /**
- * A common Runnable to finish Recents by launching Home with an animation depending on the
- * last activity launch state. Generally we always launch home when we exit Recents rather than
- * just finishing the activity since we don't know what is behind Recents in the task stack.
- */
- class FinishRecentsRunnable implements Runnable {
- Intent mLaunchIntent;
-
- /**
- * Creates a finish runnable that starts the specified intent.
- */
- public FinishRecentsRunnable(Intent launchIntent) {
- mLaunchIntent = launchIntent;
- }
-
- @Override
- public void run() {
- try {
- ActivityOptions opts = ActivityOptions.makeCustomAnimation(RecentsTvActivity.this,
- R.anim.recents_to_launcher_enter, R.anim.recents_to_launcher_exit);
- startActivityAsUser(mLaunchIntent, opts.toBundle(), UserHandle.CURRENT);
- } catch (Exception e) {
- Log.e(TAG, getString(R.string.recents_launch_error_message, "Home"), e);
- }
- }
- }
-
- private void updateRecentsTasks() {
- RecentsTaskLoader loader = Recents.getTaskLoader();
- RecentsTaskLoadPlan plan = RecentsImpl.consumeInstanceLoadPlan();
- if (plan == null) {
- plan = loader.createLoadPlan(this);
- }
-
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- if (!plan.hasTasks()) {
- loader.preloadTasks(plan, -1, !launchState.launchedFromHome);
- }
-
- int numVisibleTasks = TaskCardView.getNumberOfVisibleTasks(getApplicationContext());
- mLaunchedFromHome = launchState.launchedFromHome;
- TaskStack stack = plan.getTaskStack();
- RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
- loadOpts.runningTaskId = launchState.launchedToTaskId;
- loadOpts.numVisibleTasks = numVisibleTasks;
- loadOpts.numVisibleTaskThumbnails = numVisibleTasks;
- loader.loadTasks(this, plan, loadOpts);
-
- List stackTasks = stack.getStackTasks();
- Collections.reverse(stackTasks);
- if (mTaskStackViewAdapter == null) {
- mTaskStackViewAdapter = new TaskStackHorizontalViewAdapter(stackTasks);
- mTaskStackHorizontalGridView = mRecentsView
- .setTaskStackViewAdapter(mTaskStackViewAdapter);
- mHomeRecentsEnterExitAnimationHolder = new HomeRecentsEnterExitAnimationHolder(
- getApplicationContext(), mTaskStackHorizontalGridView);
- } else {
- mTaskStackViewAdapter.setNewStackTasks(stackTasks);
- }
- mRecentsView.init(stack);
-
- if (launchState.launchedToTaskId != -1) {
- ArrayList<Task> tasks = stack.getStackTasks();
- int taskCount = tasks.size();
- for (int i = 0; i < taskCount; i++) {
- Task t = tasks.get(i);
- if (t.key.id == launchState.launchedToTaskId) {
- t.isLaunchTarget = true;
- break;
- }
- }
- }
- }
-
- boolean dismissRecentsToLaunchTargetTaskOrHome(boolean animate) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp.isRecentsActivityVisible()) {
- // If we have a focused Task, launch that Task now
- if (mRecentsView.launchPreviousTask(animate)) {
- return true;
- }
- // If none of the other cases apply, then just go Home
- dismissRecentsToHome(animate /* animateTaskViews */);
- }
- return false;
- }
-
- boolean dismissRecentsToFocusedTaskOrHome() {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp.isRecentsActivityVisible()) {
- // If we have a focused Task, launch that Task now
- if (mRecentsView.launchFocusedTask()) return true;
- // If none of the other cases apply, then just go Home
- dismissRecentsToHome(true /* animateTaskViews */);
- return true;
- }
- return false;
- }
-
- void dismissRecentsToHome(boolean animateTaskViews) {
- Runnable closeSystemWindows = new Runnable() {
- @Override
- public void run() {
- Recents.getSystemServices().sendCloseSystemWindows(
- StatusBar.SYSTEM_DIALOG_REASON_HOME_KEY);
- }
- };
- DismissRecentsToHomeAnimationStarted dismissEvent =
- new DismissRecentsToHomeAnimationStarted(animateTaskViews);
- dismissEvent.addPostAnimationCallback(mFinishLaunchHomeRunnable);
- dismissEvent.addPostAnimationCallback(closeSystemWindows);
-
- if (mTaskStackHorizontalGridView.getChildCount() > 0 && animateTaskViews) {
- mHomeRecentsEnterExitAnimationHolder.startExitAnimation(dismissEvent);
- } else {
- closeSystemWindows.run();
- mFinishLaunchHomeRunnable.run();
- }
- }
-
- boolean dismissRecentsToHomeIfVisible(boolean animated) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp.isRecentsActivityVisible()) {
- // Return to Home
- dismissRecentsToHome(animated);
- return true;
- }
- return false;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mFinishedOnStartup = false;
-
- // In the case that the activity starts up before the Recents component has initialized
- // (usually when debugging/pushing the SysUI apk), just finish this activity.
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp == null) {
- mFinishedOnStartup = true;
- finish();
- return;
- }
- mPipRecentsOverlayManager = PipManager.getInstance().getPipRecentsOverlayManager();
-
- // Register this activity with the event bus
- EventBus.getDefault().register(this, EVENT_BUS_PRIORITY);
-
- mPackageMonitor = new RecentsPackageMonitor();
- mPackageMonitor.register(this);
-
- // Set the Recents layout
- setContentView(R.layout.recents_on_tv);
-
- mRecentsView = (RecentsTvView) findViewById(R.id.recents_view);
- mRecentsView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
-
- mPipView = findViewById(R.id.pip);
- mPipView.setOnFocusChangeListener(mPipViewFocusChangeListener);
- // Place mPipView at the PIP bounds for fine tuned focus handling.
- Rect pipBounds = mPipManager.getRecentsFocusedPipBounds();
- LayoutParams lp = (LayoutParams) mPipView.getLayoutParams();
- lp.width = pipBounds.width();
- lp.height = pipBounds.height();
- lp.leftMargin = pipBounds.left;
- lp.topMargin = pipBounds.top;
- mPipView.setLayoutParams(lp);
-
- mPipRecentsOverlayManager.setCallback(mPipRecentsOverlayManagerCallback);
-
- getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
-
- // Create the home intent runnable
- Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
- homeIntent.addCategory(Intent.CATEGORY_HOME);
- homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- homeIntent.putExtra(RECENTS_HOME_INTENT_EXTRA, true);
- mFinishLaunchHomeRunnable = new FinishRecentsRunnable(homeIntent);
-
- mPipManager.addListener(mPipListener);
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- }
-
- @Override
- public void onEnterAnimationComplete() {
- super.onEnterAnimationComplete();
- if(mLaunchedFromHome) {
- mHomeRecentsEnterExitAnimationHolder.startEnterAnimation(mPipManager.isPipShown());
- }
- EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent());
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mPipRecentsOverlayManager.onRecentsResumed();
- // Update the recent tasks
- updateRecentsTasks();
-
- // If this is a new instance from a configuration change, then we have to manually trigger
- // the enter animation state, or if recents was relaunched by AM, without going through
- // the normal mechanisms
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- boolean wasLaunchedByAm = !launchState.launchedFromHome &&
- !launchState.launchedFromApp;
- if (wasLaunchedByAm) {
- EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent());
- }
-
- // Notify that recents is now visible
- SystemServicesProxy ssp = Recents.getSystemServices();
- EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, true));
- if(mTaskStackHorizontalGridView.getStack().getTaskCount() > 1 && !mLaunchedFromHome) {
- // If there are 2 or more tasks, and we are not launching from home
- // set the selected position to the 2nd task to allow for faster app switching
- mTaskStackHorizontalGridView.setSelectedPosition(1);
- } else {
- mTaskStackHorizontalGridView.setSelectedPosition(0);
- }
- mRecentsView.getViewTreeObserver().addOnPreDrawListener(this);
-
- View dismissPlaceholder = findViewById(R.id.dismiss_placeholder);
- mTalkBackEnabled = ssp.isTouchExplorationEnabled();
- if (mTalkBackEnabled) {
- dismissPlaceholder.setAccessibilityTraversalBefore(R.id.task_list);
- dismissPlaceholder.setAccessibilityTraversalAfter(R.id.dismiss_placeholder);
- mTaskStackHorizontalGridView.setAccessibilityTraversalAfter(R.id.dismiss_placeholder);
- mTaskStackHorizontalGridView.setAccessibilityTraversalBefore(R.id.pip);
- dismissPlaceholder.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mTaskStackHorizontalGridView.requestFocus();
- mTaskStackHorizontalGridView.
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
- Task focusedTask = mTaskStackHorizontalGridView.getFocusedTask();
- if (focusedTask != null) {
- mTaskStackViewAdapter.removeTask(focusedTask);
- EventBus.getDefault().send(new DeleteTaskDataEvent(focusedTask));
- }
- }
- });
- }
-
- // Initialize PIP UI
- if (mPipManager.isPipShown()) {
- if (mTalkBackEnabled) {
- // If talkback is on, use the mPipView to handle focus changes
- // between recents row and PIP controls.
- mPipView.setVisibility(View.VISIBLE);
- } else {
- mPipView.setVisibility(View.GONE);
- }
- // When PIP view has focus, recents overlay view will takes the focus
- // as if it's the part of the Recents UI.
- mPipRecentsOverlayManager.requestFocus(mTaskStackViewAdapter.getItemCount() > 0);
- } else {
- mPipView.setVisibility(View.GONE);
- mPipRecentsOverlayManager.removePipRecentsOverlayView();
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mPipRecentsOverlayManager.onRecentsPaused();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
-
- mIgnoreAltTabRelease = false;
- // Notify that recents is now hidden
- EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, false));
-
- // Workaround for b/22542869, if the RecentsActivity is started again, but without going
- // through SystemUI, we need to reset the config launch flags to ensure that we do not
- // wait on the system to send a signal that was never queued.
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- launchState.reset();
-
- // Workaround for b/28333917.
- finish();
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- mPipManager.removeListener(mPipListener);
- // In the case that the activity finished on startup, just skip the unregistration below
- if (mFinishedOnStartup) {
- return;
- }
-
- // Unregister any broadcast receivers for the task loader
- mPackageMonitor.unregister();
-
- EventBus.getDefault().unregister(this);
- }
-
- @Override
- public void onTrimMemory(int level) {
- RecentsTaskLoader loader = Recents.getTaskLoader();
- if (loader != null) {
- loader.onTrimMemory(level);
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_DEL:
- case KeyEvent.KEYCODE_FORWARD_DEL: {
- EventBus.getDefault().send(new DismissFocusedTaskViewEvent());
- return true;
- }
- default:
- break;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public void onUserInteraction() {
- EventBus.getDefault().send(new UserInteractionEvent());
- }
-
- @Override
- public void onBackPressed() {
- // Back behaves like the recents button so just trigger a toggle event
- EventBus.getDefault().send(new ToggleRecentsEvent());
- }
-
- /**** EventBus events ****/
-
- public final void onBusEvent(ToggleRecentsEvent event) {
- RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
- if (launchState.launchedFromHome) {
- dismissRecentsToHome(true /* animateTaskViews */);
- } else {
- dismissRecentsToLaunchTargetTaskOrHome(true);
- }
- }
-
- public final void onBusEvent(HideRecentsEvent event) {
- if (event.triggeredFromAltTab) {
- // If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app
- if (!mIgnoreAltTabRelease) {
- dismissRecentsToFocusedTaskOrHome();
- }
- } else if (event.triggeredFromHomeKey) {
- dismissRecentsToHome(true /* animateTaskViews */);
- } else {
- // Do nothing
- }
- }
-
- public final void onBusEvent(CancelEnterRecentsWindowAnimationEvent event) {
- RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
- int launchToTaskId = launchState.launchedToTaskId;
- if (launchToTaskId != -1 &&
- (event.launchTask == null || launchToTaskId != event.launchTask.key.id)) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.cancelWindowTransition(launchState.launchedToTaskId);
- ssp.cancelThumbnailTransition(getTaskId());
- }
- }
-
- public final void onBusEvent(DeleteTaskDataEvent event) {
- // Remove any stored data from the loader
- RecentsTaskLoader loader = Recents.getTaskLoader();
- loader.deleteTaskData(event.task, false);
-
- // Remove the task from activity manager
- SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.removeTask(event.task.key.id);
- }
-
- public final void onBusEvent(AllTaskViewsDismissedEvent event) {
- if (mPipManager.isPipShown()) {
- mRecentsView.showEmptyView();
- mPipRecentsOverlayManager.requestFocus(false);
- } else {
- dismissRecentsToHome(false);
- }
- }
-
- public final void onBusEvent(LaunchTaskFailedEvent event) {
- // Return to Home
- dismissRecentsToHome(true /* animateTaskViews */);
- }
-
- @Override
- public boolean onPreDraw() {
- mRecentsView.getViewTreeObserver().removeOnPreDrawListener(this);
- // Sets the initial values for enter animation.
- // Animation will be started in {@link #onEnterAnimationComplete()}
- if (mLaunchedFromHome) {
- mHomeRecentsEnterExitAnimationHolder
- .setEnterFromHomeStartingAnimationValues(mPipManager.isPipShown());
- } else {
- mHomeRecentsEnterExitAnimationHolder
- .setEnterFromAppStartingAnimationValues(mPipManager.isPipShown());
- }
- // We post to make sure that this information is delivered after this traversals is
- // finished.
- mRecentsView.post(new Runnable() {
- @Override
- public void run() {
- Recents.getSystemServices().endProlongedAnimations();
- }
- });
- return true;
- }
-
- private void updatePipUI() {
- if (!mPipManager.isPipShown()) {
- mPipRecentsOverlayManager.removePipRecentsOverlayView();
- mTaskStackHorizontalGridView.startFocusLossAnimation();
- } else {
- Log.w(TAG, "An activity entered PIP mode while Recents is shown");
- }
- }
-
- /**
- * Requests the focus to the PIP controls.
- * This starts the relevant recents row animation
- * and give focus to the recents overlay if needed.
- */
- public void requestPipControlsFocus() {
- if (!mPipManager.isPipShown()) {
- return;
- }
-
- mTaskStackHorizontalGridView.startFocusLossAnimation();
- mPipRecentsOverlayManager.requestFocus(mTaskStackViewAdapter.getItemCount() > 0);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java
deleted file mode 100644
index ac9a217..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recents.tv;
-
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.os.SystemClock;
-import android.os.UserHandle;
-
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsActivityLaunchState;
-import com.android.systemui.recents.RecentsConfiguration;
-import com.android.systemui.recents.RecentsImpl;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.model.TaskStack;
-import com.android.systemui.recents.model.ThumbnailData;
-import com.android.systemui.recents.tv.views.TaskCardView;
-import com.android.systemui.pip.tv.PipManager;
-
-public class RecentsTvImpl extends RecentsImpl{
- public final static String RECENTS_TV_ACTIVITY =
- "com.android.systemui.recents.tv.RecentsTvActivity";
-
- private static final PipManager mPipManager = PipManager.getInstance();
-
- public RecentsTvImpl(Context context) {
- super(context);
- }
-
- @Override
- protected void startRecentsActivity(ActivityManager.RunningTaskInfo runningTask,
- boolean isHomeStackVisible, boolean animate, int growTarget) {
- RecentsTaskLoader loader = Recents.getTaskLoader();
-
- // In the case where alt-tab is triggered, we never get a preloadRecents() call, so we
- // should always preload the tasks now. If we are dragging in recents, reload them as
- // the stacks might have changed.
- if (mTriggeredFromAltTab || sInstanceLoadPlan == null) {
- // Create a new load plan if preloadRecents() was never triggered
- sInstanceLoadPlan = loader.createLoadPlan(mContext);
- }
- if (mTriggeredFromAltTab || !sInstanceLoadPlan.hasTasks()) {
- loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible);
- }
- TaskStack stack = sInstanceLoadPlan.getTaskStack();
-
- if (!animate) {
- ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, -1, -1);
- startRecentsActivity(runningTask, opts, false /* fromHome */, false /* fromThumbnail*/);
- return;
- }
-
- boolean hasRecentTasks = stack.getTaskCount() > 0;
- boolean useThumbnailTransition = (runningTask != null) && !isHomeStackVisible && hasRecentTasks;
-
- if (useThumbnailTransition) {
- // Try starting with a thumbnail transition
- ActivityOptions opts = getThumbnailTransitionActivityOptionsForTV(runningTask,
- stack.getTaskCount());
- if (opts != null) {
- startRecentsActivity(runningTask, opts, false /* fromHome */, true /* fromThumbnail */);
- } else {
- // Fall through below to the non-thumbnail transition
- useThumbnailTransition = false;
- }
- }
-
- if (!useThumbnailTransition) {
- startRecentsActivity(runningTask, null, true /* fromHome */, false /* fromThumbnail */);
- }
- mLastToggleTime = SystemClock.elapsedRealtime();
- }
-
- protected void startRecentsActivity(ActivityManager.RunningTaskInfo runningTask,
- ActivityOptions opts, boolean fromHome, boolean fromThumbnail) {
- // Update the configuration based on the launch options
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- launchState.launchedFromHome = fromHome;
- launchState.launchedFromApp = fromThumbnail;
- launchState.launchedToTaskId = (runningTask != null) ? runningTask.id : -1;
- launchState.launchedWithAltTab = mTriggeredFromAltTab;
-
- Intent intent = new Intent();
- intent.setClassName(RECENTS_PACKAGE, RECENTS_TV_ACTIVITY);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
-
- if (opts != null) {
- mContext.startActivityAsUser(intent, opts.toBundle(), UserHandle.CURRENT);
- } else {
- mContext.startActivityAsUser(intent, UserHandle.CURRENT);
- }
- EventBus.getDefault().send(new RecentsActivityStartingEvent());
- }
-
- /**
- * Creates the activity options for an app->recents transition on TV.
- */
- private ActivityOptions getThumbnailTransitionActivityOptionsForTV(
- ActivityManager.RunningTaskInfo runningTask, int numTasks) {
- Rect rect = TaskCardView.getStartingCardThumbnailRect(
- mContext, !mPipManager.isPipShown(), numTasks);
- SystemServicesProxy ssp = Recents.getSystemServices();
- ThumbnailData thumbnailData = ssp.getTaskThumbnail(runningTask.id);
- if (thumbnailData.thumbnail != null) {
- Bitmap thumbnail = Bitmap.createScaledBitmap(thumbnailData.thumbnail, rect.width(),
- rect.height(), false);
- return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView,
- thumbnail, (int) rect.left, (int) rect.top, (int) rect.width(),
- (int) rect.height(), mHandler, null);
- }
- // If both the screenshot and thumbnail fails, then just fall back to the default transition
- return getUnknownTransitionActivityOptions();
- }
-
- @Override
- public void onVisibilityChanged(Context context, boolean visible) {
- Recents.getSystemServices().setRecentsVisibility(visible);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java
deleted file mode 100644
index 65f5fff..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.animations;
-
-import android.animation.Animator.AnimatorListener;
-import android.content.res.Resources;
-import android.graphics.drawable.TransitionDrawable;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.android.systemui.Interpolators;
-import com.android.systemui.recents.tv.views.TaskCardView;
-
-import com.android.systemui.R;
-
-public class DismissAnimationsHolder {
- private LinearLayout mInfoField;
- private View mThumbnailView;
-
- private int mDismissEnterYDelta;
- private int mDismissStartYDelta;
-
- private ImageView mCardDismissIcon;
- private TransitionDrawable mDismissDrawable;
- private TextView mDismissText;
-
- private float mDismissIconNotInDismissStateAlpha;
- private long mShortDuration;
- private long mLongDuration;
-
- public DismissAnimationsHolder(TaskCardView taskCardView) {
-
- mInfoField = (LinearLayout) taskCardView.findViewById(R.id.card_info_field);
- mThumbnailView = taskCardView.findViewById(R.id.card_view_thumbnail);
- mCardDismissIcon = (ImageView) taskCardView.findViewById(R.id.dismiss_icon);
- mDismissDrawable = (TransitionDrawable) mCardDismissIcon.getDrawable();
- mDismissDrawable.setCrossFadeEnabled(true);
- mDismissText = (TextView) taskCardView.findViewById(R.id.card_dismiss_text);
-
- Resources res = taskCardView.getResources();
- mDismissEnterYDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_shift_down);
- mDismissStartYDelta = mDismissEnterYDelta * 2;
- mShortDuration = res.getInteger(R.integer.dismiss_short_duration);
- mLongDuration = res.getInteger(R.integer.dismiss_long_duration);
- mDismissIconNotInDismissStateAlpha = res.getFloat(R.integer.dismiss_unselected_alpha);
- }
-
- public void startEnterAnimation() {
- mCardDismissIcon.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(1.0f)
- .withStartAction(new Runnable() {
- @Override
- public void run() {
- mDismissDrawable.startTransition(0);
- }
- });
-
- mDismissText.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(1.0f);
-
- mInfoField.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(mDismissEnterYDelta)
- .alpha(0.5f);
-
- mThumbnailView.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(mDismissEnterYDelta)
- .alpha(0.5f);
- }
-
- public void startExitAnimation() {
- mCardDismissIcon.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(mDismissIconNotInDismissStateAlpha)
- .withEndAction(new Runnable() {
- @Override
- public void run() {
- mDismissDrawable.reverseTransition(0);
- }
- });
-
- mDismissText.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(0.0f);
-
- mInfoField.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(0)
- .alpha(1.0f);
-
- mThumbnailView.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(0)
- .alpha(1.0f);
- }
-
- public void startDismissAnimation(AnimatorListener listener) {
- mCardDismissIcon.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(0.0f)
- .withEndAction(new Runnable() {
- @Override
- public void run() {
- mDismissDrawable.reverseTransition(0);
- }
- });
-
- mDismissText.animate()
- .setDuration(mShortDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .alpha(0.0f);
-
- mInfoField.animate()
- .setDuration(mLongDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(mDismissStartYDelta)
- .alpha(0.0f)
- .setListener(listener);
-
- mThumbnailView.animate()
- .setDuration(mLongDuration)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .translationY(mDismissStartYDelta)
- .alpha(0.0f);
- }
-
- public void reset() {
- mInfoField.setAlpha(1.0f);
- mInfoField.setTranslationY(0);
- mInfoField.animate().setListener(null);
- mThumbnailView.setAlpha(1.0f);
- mThumbnailView.setTranslationY(0);
- mCardDismissIcon.setAlpha(0.0f);
- mDismissText.setAlpha(0.0f);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java
deleted file mode 100644
index a673c8c..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recents.tv.animations;
-
-import android.content.Context;
-import com.android.systemui.Interpolators;
-import com.android.systemui.R;
-import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
-import com.android.systemui.recents.tv.views.TaskCardView;
-import com.android.systemui.recents.tv.views.TaskStackHorizontalGridView;
-
-
-public class HomeRecentsEnterExitAnimationHolder {
-
- private Context mContext;
- private TaskStackHorizontalGridView mGridView;
- private float mDimAlpha;
- private long mDelay;
- private int mDuration;
- private int mTranslationX;
-
- public HomeRecentsEnterExitAnimationHolder(Context context,
- TaskStackHorizontalGridView gridView) {
- mContext = context;
- mGridView = gridView;
- mDimAlpha = mContext.getResources().getFloat(R.dimen.recents_recents_row_dim_alpha);
- mTranslationX = mContext.getResources()
- .getDimensionPixelSize(R.dimen.recents_tv_home_recents_shift);
- mDelay = mContext.getResources().getInteger(R.integer.recents_home_delay);
- mDuration = mContext.getResources().getInteger(R.integer.recents_home_duration);
- }
-
- public void startEnterAnimation(boolean isPipShown) {
- for(int i = 0; i < mGridView.getChildCount(); i++) {
- TaskCardView view = (TaskCardView) mGridView.getChildAt(i);
- long delay = Math.max(mDelay * i, 0);
- view.setTranslationX(-mTranslationX);
- view.animate()
- .alpha(isPipShown ? mDimAlpha : 1.0f)
- .translationX(0)
- .setDuration(mDuration)
- .setStartDelay(delay)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- }
- }
-
- public void startExitAnimation(DismissRecentsToHomeAnimationStarted dismissEvent) {
- for(int i = mGridView.getChildCount() - 1; i >= 0; i--) {
- TaskCardView view = (TaskCardView) mGridView.getChildAt(i);
- long delay = Math.max(mDelay * (mGridView.getChildCount() - 1 - i), 0);
- view.animate()
- .alpha(0.0f)
- .translationXBy(-mTranslationX)
- .setDuration(mDuration)
- .setStartDelay(delay)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- if(i == 0) {
- view.animate().setListener(dismissEvent.getAnimationTrigger()
- .decrementOnAnimationEnd());
- dismissEvent.getAnimationTrigger().increment();
- }
- }
- }
-
- /**
- * Sets the initial values Recents enter animation
- * when Recents is started from the Launcher.
- */
- public void setEnterFromHomeStartingAnimationValues(boolean isPipShown) {
- for(int i = 0; i < mGridView.getChildCount(); i++) {
- TaskCardView view = (TaskCardView) mGridView.getChildAt(i);
- view.setTranslationX(0);
- view.setAlpha(0.0f);
- view.getInfoFieldView().setAlpha(isPipShown ? 0 : 1f);
- if (isPipShown && view.hasFocus()) {
- view.getViewFocusAnimator().changeSize(false);
- }
- }
- }
-
- /**
- * Sets the initial values Recents enter animation
- * when Recents is started from an app.
- */
- public void setEnterFromAppStartingAnimationValues(boolean isPipShown) {
- for(int i = 0; i < mGridView.getChildCount(); i++) {
- TaskCardView view = (TaskCardView) mGridView.getChildAt(i);
- view.setTranslationX(0);
- view.setAlpha(isPipShown ? mDimAlpha : 1f);
- view.getInfoFieldView().setAlpha(isPipShown ? 0 : 1f);
- if (isPipShown && view.hasFocus()) {
- view.getViewFocusAnimator().changeSize(false);
- }
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java
deleted file mode 100644
index 8a4cf399..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.animations;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.content.res.Resources;
-import android.view.View;
-
-import com.android.systemui.Interpolators;
-import com.android.systemui.R;
-import com.android.systemui.recents.tv.views.TaskCardView;
-
-/**
- * Recents row's focus animation with PIP controls.
- */
-public class RecentsRowFocusAnimationHolder {
- private final View mView;
- private final View mTitleView;
-
- private AnimatorSet mFocusGainAnimatorSet;
- private AnimatorSet mFocusLossAnimatorSet;
-
- public RecentsRowFocusAnimationHolder(View view, View titleView) {
- mView = view;
- mTitleView = titleView;
-
- Resources res = view.getResources();
- int duration = res.getInteger(R.integer.recents_tv_pip_focus_anim_duration);
- float dimAlpha = res.getFloat(R.dimen.recents_recents_row_dim_alpha);
-
- mFocusGainAnimatorSet = new AnimatorSet();
- mFocusGainAnimatorSet.playTogether(
- ObjectAnimator.ofFloat(mView, "alpha", 1f),
- ObjectAnimator.ofFloat(mTitleView, "alpha", 1f));
- mFocusGainAnimatorSet.setDuration(duration);
- mFocusGainAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
-
- mFocusLossAnimatorSet = new AnimatorSet();
- mFocusLossAnimatorSet.playTogether(
- // Animation doesn't start from the current value (1f) sometimes,
- // so specify the desired initial value here.
- ObjectAnimator.ofFloat(mView, "alpha", 1f, dimAlpha),
- ObjectAnimator.ofFloat(mTitleView, "alpha", 0f));
- mFocusLossAnimatorSet.setDuration(duration);
- mFocusLossAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- }
-
- /**
- * Starts the Recents row's focus gain animation.
- */
- public void startFocusGainAnimation() {
- cancelAnimator(mFocusLossAnimatorSet);
- mFocusGainAnimatorSet.start();
- }
-
- /**
- * Starts the Recents row's focus loss animation.
- */
- public void startFocusLossAnimation() {
- cancelAnimator(mFocusGainAnimatorSet);
- mFocusLossAnimatorSet.start();
- }
-
- /**
- * Resets the views immediately and ends the animations.
- */
- public void reset() {
- cancelAnimator(mFocusLossAnimatorSet);
- cancelAnimator(mFocusGainAnimatorSet);
- mView.setAlpha(1f);
- mTitleView.setAlpha(1f);
- }
-
- private static void cancelAnimator(Animator animator) {
- if (animator.isStarted()) {
- animator.cancel();
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java
deleted file mode 100644
index 72fd7a4..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.animations;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.res.Resources;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.Interpolator;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.tv.views.TaskCardView;
-
-public class ViewFocusAnimator implements View.OnFocusChangeListener {
- private final float mUnselectedScale;
- private final float mSelectedScale;
- private final float mSelectedScaleDelta;
- private final float mUnselectedZ;
- private final float mSelectedZDelta;
- private final float mUnselectedSpacing;
- private final float mSelectedSpacingDelta;
- private final float mDismissIconAlpha;
- private final int mAnimDuration;
- private final Interpolator mFocusInterpolator;
-
- protected TaskCardView mTargetView;
- private float mFocusProgress;
-
- ObjectAnimator mFocusAnimation;
-
- public ViewFocusAnimator(TaskCardView view) {
- mTargetView = view;
- final Resources res = view.getResources();
-
- mTargetView.setOnFocusChangeListener(this);
-
- TypedValue out = new TypedValue();
- res.getValue(R.integer.unselected_scale, out, true);
- mUnselectedScale = out.getFloat();
- res.getValue(R.integer.selected_scale, out, true);
- mSelectedScale = out.getFloat();
- mSelectedScaleDelta = mSelectedScale - mUnselectedScale;
-
- mUnselectedZ = res.getDimensionPixelOffset(R.dimen.recents_tv_unselected_item_z);
- mSelectedZDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_selected_item_z_delta);
-
- mUnselectedSpacing = res.getDimensionPixelOffset(R.dimen.recents_tv_gird_card_spacing);
- mSelectedSpacingDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_gird_focused_card_delta);
-
- mAnimDuration = res.getInteger(R.integer.item_scale_anim_duration);
-
- mFocusInterpolator = new AccelerateDecelerateInterpolator();
-
- mFocusAnimation = ObjectAnimator.ofFloat(this, "focusProgress", 0.0f);
- mFocusAnimation.setDuration(mAnimDuration);
- mFocusAnimation.setInterpolator(mFocusInterpolator);
-
- mDismissIconAlpha = res.getFloat(R.integer.dismiss_unselected_alpha);
-
- setFocusProgress(0.0f);
-
- mFocusAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mTargetView.setHasTransientState(true);
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- mTargetView.setHasTransientState(false);
- }
- });
- }
-
- private void setFocusProgress(float level) {
- mFocusProgress = level;
-
- float scale = mUnselectedScale + (level * mSelectedScaleDelta);
- float z = mUnselectedZ + (level * mSelectedZDelta);
- float spacing = mUnselectedSpacing + (level * mSelectedSpacingDelta);
-
- mTargetView.setScaleX(scale);
- mTargetView.setScaleY(scale);
-
- mTargetView.setPadding((int) spacing, mTargetView.getPaddingTop(),
- (int) spacing, mTargetView.getPaddingBottom());
-
- mTargetView.getDismissIconView().setAlpha(mDismissIconAlpha * level);
- mTargetView.getThumbnailView().setZ(z);
- mTargetView.getDismissIconView().setZ(z);
- }
-
- private void animateFocus(boolean focused) {
- if (mFocusAnimation.isStarted()) {
- mFocusAnimation.cancel();
- }
-
- float target = focused ? 1.0f : 0.0f;
-
- if (mFocusProgress != target) {
- mFocusAnimation.setFloatValues(mFocusProgress, target);
- mFocusAnimation.start();
- }
- }
-
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (v != mTargetView) {
- return;
- }
- changeSize(hasFocus);
- }
-
- /**
- * Changes the size of the {@link TaskCardView} to show its focused state.
- */
- public void changeSize(boolean hasFocus) {
- ViewGroup.LayoutParams lp = mTargetView.getLayoutParams();
- int width = lp.width;
- int height = lp.height;
-
- if (width < 0 && height < 0) {
- mTargetView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
- }
-
- if (mTargetView.isAttachedToWindow() && mTargetView.hasWindowFocus() &&
- mTargetView.getVisibility() == View.VISIBLE) {
- animateFocus(hasFocus);
- } else {
- // Set focus immediately.
- if (mFocusAnimation.isStarted()) {
- mFocusAnimation.cancel();
- }
- setFocusProgress(hasFocus ? 1.0f : 0.0f);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java
deleted file mode 100644
index 2894cd8..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.views;
-
-import android.annotation.Nullable;
-import android.app.ActivityOptions;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IRemoteCallback;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.WindowManagerGlobal;
-import com.android.internal.annotations.GuardedBy;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.*;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.model.TaskStack;
-
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
-
-public class RecentsTvTransitionHelper {
- private static final String TAG = "RecentsTvTransitionHelper";
-
- private Context mContext;
- private Handler mHandler;
-
- public RecentsTvTransitionHelper(Context context, Handler handler) {
- mContext = context;
- mHandler = handler;
- }
-
- public void launchTaskFromRecents(final TaskStack stack, @Nullable final Task task,
- final TaskStackHorizontalGridView stackView, final TaskCardView taskView,
- final Rect bounds, int destinationStack) {
- final ActivityOptions opts = ActivityOptions.makeBasic();
- if (bounds != null) {
- opts.setLaunchBounds(bounds.isEmpty() ? null : bounds);
- }
-
- final ActivityOptions.OnAnimationStartedListener animStartedListener;
- if (task.thumbnail != null && task.thumbnail.getWidth() > 0 &&
- task.thumbnail.getHeight() > 0) {
- animStartedListener = new ActivityOptions.OnAnimationStartedListener() {
- @Override
- public void onAnimationStarted() {
- // If we are launching into another task, cancel the previous task's
- // window transition
- EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(task));
- EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
- }
- };
- } else {
- // This is only the case if the task is not on screen (scrolled offscreen for example)
- animStartedListener = new ActivityOptions.OnAnimationStartedListener() {
- @Override
- public void onAnimationStarted() {
- EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
- }
- };
- }
-
- if (taskView == null) {
- // If there is no task view, then we do not need to worry about animating out occluding
- // task views, and we can launch immediately
- startTaskActivity(stack, task, taskView, opts, animStartedListener);
- } else {
- LaunchTvTaskStartedEvent launchStartedEvent = new LaunchTvTaskStartedEvent(taskView);
- EventBus.getDefault().send(launchStartedEvent);
- startTaskActivity(stack, task, taskView, opts, animStartedListener);
- }
- }
-
- private void startTaskActivity(TaskStack stack, Task task, @Nullable TaskCardView taskView,
- ActivityOptions opts,final ActivityOptions.OnAnimationStartedListener animStartedListener) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- if (ssp.startActivityFromRecents(mContext, task.key, task.title, opts, INVALID_STACK_ID)) {
- // Keep track of the index of the task launch
- int taskIndexFromFront = 0;
- int taskIndex = stack.indexOfStackTask(task);
- if (taskIndex > -1) {
- taskIndexFromFront = stack.getTaskCount() - taskIndex - 1;
- }
- EventBus.getDefault().send(new LaunchTaskSucceededEvent(taskIndexFromFront));
- } else {
- // Keep track of failed launches
- EventBus.getDefault().send(new LaunchTaskFailedEvent());
- }
-
- Rect taskRect = taskView.getFocusedThumbnailRect();
- // Check both the rect and the thumbnail for null. The rect can be null if the user
- // decides to disallow animations, so automatic scrolling does not happen properly.
-
- // The thumbnail can be null if the app was partially launched on TV. In this case
- // we do not override the transition.
- if (taskRect == null || task.thumbnail == null) {
- return;
- }
-
- IRemoteCallback.Stub callback = null;
- if (animStartedListener != null) {
- callback = new IRemoteCallback.Stub() {
- @Override
- public void sendResult(Bundle data) throws RemoteException {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if (animStartedListener != null) {
- animStartedListener.onAnimationStarted();
- }
- }
- });
- }
- };
- }
- try {
- Bitmap thumbnail = Bitmap.createScaledBitmap(task.thumbnail, taskRect.width(),
- taskRect.height(), false);
- WindowManagerGlobal.getWindowManagerService()
- .overridePendingAppTransitionAspectScaledThumb(thumbnail, taskRect.left,
- taskRect.top, taskRect.width(), taskRect.height(), callback, true);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to override transition: " + e);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java
deleted file mode 100644
index 9db8071..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.views;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.support.v7.widget.RecyclerView;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowInsets;
-import android.widget.FrameLayout;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsActivity;
-import com.android.systemui.recents.RecentsActivityLaunchState;
-import com.android.systemui.recents.RecentsConfiguration;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
-import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
-import com.android.systemui.recents.events.activity.LaunchTvTaskEvent;
-import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.model.TaskStack;
-import com.android.systemui.recents.tv.animations.RecentsRowFocusAnimationHolder;
-import android.support.v7.widget.RecyclerView.OnScrollListener;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
-/**
- * Top level layout of recents for TV. This will show the TaskStacks using a HorizontalGridView.
- */
-public class RecentsTvView extends FrameLayout {
-
- private static final String TAG = "RecentsTvView";
- private static final boolean DEBUG = false;
-
- private TaskStack mStack;
- private TaskStackHorizontalGridView mTaskStackHorizontalView;
- private View mEmptyView;
- private View mDismissPlaceholder;
- private RecentsRowFocusAnimationHolder mEmptyViewFocusAnimationHolder;
- private boolean mAwaitingFirstLayout = true;
- private Rect mSystemInsets = new Rect();
- private RecentsTvTransitionHelper mTransitionHelper;
- private final Handler mHandler = new Handler();
- private OnScrollListener mScrollListener;
- public RecentsTvView(Context context) {
- this(context, null);
- }
-
- public RecentsTvView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public RecentsTvView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
-
- setWillNotDraw(false);
-
- LayoutInflater inflater = LayoutInflater.from(context);
- mEmptyView = inflater.inflate(R.layout.recents_tv_empty, this, false);
- addView(mEmptyView);
-
- mTransitionHelper = new RecentsTvTransitionHelper(mContext, mHandler);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mDismissPlaceholder = findViewById(R.id.dismiss_placeholder);
- mTaskStackHorizontalView = (TaskStackHorizontalGridView) findViewById(R.id.task_list);
- }
-
- /**
- * Initialize the view.
- */
- public void init(TaskStack stack) {
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- mStack = stack;
-
- mTaskStackHorizontalView.init(stack);
-
- if (stack.getStackTaskCount() > 0) {
- hideEmptyView();
- } else {
- showEmptyView();
- }
-
- // Layout with the new stack
- requestLayout();
- }
-
- public boolean launchFocusedTask() {
- if (mTaskStackHorizontalView != null) {
- Task task = mTaskStackHorizontalView.getFocusedTask();
- if (task != null) {
- launchTaskFomRecents(task, true);
- return true;
- }
- }
- return false;
- }
-
- /** Launches the task that recents was launched from if possible */
- public boolean launchPreviousTask(boolean animate) {
- if (mTaskStackHorizontalView != null) {
- TaskStack stack = mTaskStackHorizontalView.getStack();
- Task task = stack.getLaunchTarget();
- if (task != null) {
- launchTaskFomRecents(task, animate);
- return true;
- }
- }
- return false;
- }
-
- /**
- * Launch the given task from recents with animation. If the task is not focused, this will
- * attempt to scroll to focus the task before launching.
- * @param task
- */
- private void launchTaskFomRecents(final Task task, boolean animate) {
- if (!animate) {
- SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.startActivityFromRecents(getContext(), task.key, task.title, null,
- INVALID_STACK_ID);
- return;
- }
- mTaskStackHorizontalView.requestFocus();
- Task focusedTask = mTaskStackHorizontalView.getFocusedTask();
- if (focusedTask != null && task != focusedTask) {
- if (mScrollListener != null) {
- mTaskStackHorizontalView.removeOnScrollListener(mScrollListener);
- }
- mScrollListener = new OnScrollListener() {
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- if (newState == RecyclerView.SCROLL_STATE_IDLE) {
- TaskCardView cardView = mTaskStackHorizontalView.getChildViewForTask(task);
- if (cardView != null) {
- mTransitionHelper.launchTaskFromRecents(mStack, task,
- mTaskStackHorizontalView, cardView, null, INVALID_STACK_ID);
- } else {
- // This should not happen normally. If this happens then the data in
- // the grid view was altered during the scroll. Log error and launch
- // task with no animation.
- Log.e(TAG, "Card view for task : " + task + ", returned null.");
- SystemServicesProxy ssp = Recents.getSystemServices();
- ssp.startActivityFromRecents(getContext(), task.key, task.title, null,
- INVALID_STACK_ID);
- }
- mTaskStackHorizontalView.removeOnScrollListener(mScrollListener);
- }
- }
- };
- mTaskStackHorizontalView.addOnScrollListener(mScrollListener);
- mTaskStackHorizontalView.setSelectedPositionSmooth(
- ((TaskStackHorizontalViewAdapter) mTaskStackHorizontalView.getAdapter())
- .getPositionOfTask(task));
- } else {
- mTransitionHelper.launchTaskFromRecents(mStack, task, mTaskStackHorizontalView,
- mTaskStackHorizontalView.getChildViewForTask(task), null,
- INVALID_STACK_ID);
- }
- }
-
- /**
- * Hides the task stack and shows the empty view.
- */
- public void showEmptyView() {
- mEmptyView.setVisibility(View.VISIBLE);
- mTaskStackHorizontalView.setVisibility(View.GONE);
- if (Recents.getSystemServices().isTouchExplorationEnabled()) {
- mDismissPlaceholder.setVisibility(View.GONE);
- }
- }
-
- /**
- * Shows the task stack and hides the empty view.
- */
- public void hideEmptyView() {
- mEmptyView.setVisibility(View.GONE);
- mTaskStackHorizontalView.setVisibility(View.VISIBLE);
- if (Recents.getSystemServices().isTouchExplorationEnabled()) {
- mDismissPlaceholder.setVisibility(View.VISIBLE);
- }
- }
-
- /**
- * Returns the last known system insets.
- */
- public Rect getSystemInsets() {
- return mSystemInsets;
- }
-
- @Override
- protected void onAttachedToWindow() {
- EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1);
- super.onAttachedToWindow();
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- EventBus.getDefault().unregister(this);
- }
-
- @Override
- public WindowInsets onApplyWindowInsets(WindowInsets insets) {
- mSystemInsets.set(insets.getSystemWindowInsets());
- requestLayout();
- return insets;
- }
-
- /**** EventBus Events ****/
-
- public final void onBusEvent(LaunchTvTaskEvent event) {
- mTransitionHelper.launchTaskFromRecents(mStack, event.task, mTaskStackHorizontalView,
- event.taskView, event.targetTaskBounds, event.targetTaskStack);
- }
-
- public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) {
- // If we are going home, cancel the previous task's window transition
- EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(null));
- }
-
- public final void onBusEvent(RecentsVisibilityChangedEvent event) {
- if (!event.visible) {
- // Reset the view state
- mAwaitingFirstLayout = true;
- }
- }
-
- public TaskStackHorizontalGridView setTaskStackViewAdapter(
- TaskStackHorizontalViewAdapter taskStackViewAdapter) {
- if (mTaskStackHorizontalView != null) {
- mTaskStackHorizontalView.setAdapter(taskStackViewAdapter);
- taskStackViewAdapter.setTaskStackHorizontalGridView(mTaskStackHorizontalView);
- }
- return mTaskStackHorizontalView;
- }
-
- public TaskStackHorizontalGridView getGridView() {
- return mTaskStackHorizontalView;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java
deleted file mode 100644
index e757560..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.views;
-
-import android.animation.Animator;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Outline;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Display;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewOutlineProvider;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.tv.RecentsTvActivity;
-import com.android.systemui.recents.tv.animations.DismissAnimationsHolder;
-import com.android.systemui.recents.tv.animations.RecentsRowFocusAnimationHolder;
-import com.android.systemui.recents.tv.animations.ViewFocusAnimator;
-
-public class TaskCardView extends LinearLayout {
-
- private static final String TAG = "TaskCardView";
- private View mThumbnailView;
- private View mDismissIconView;
- private View mInfoFieldView;
- private TextView mTitleTextView;
- private ImageView mBadgeView;
- private Task mTask;
- private boolean mDismissState;
- private boolean mTouchExplorationEnabled;
- private int mCornerRadius;
-
- private ViewFocusAnimator mViewFocusAnimator;
- private DismissAnimationsHolder mDismissAnimationsHolder;
- private RecentsRowFocusAnimationHolder mRecentsRowFocusAnimationHolder;
-
- public TaskCardView(Context context) {
- this(context, null);
- }
-
- public TaskCardView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public TaskCardView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mDismissState = false;
- Configuration config = getResources().getConfiguration();
- setLayoutDirection(config.getLayoutDirection());
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mThumbnailView = findViewById(R.id.card_view_thumbnail);
- mInfoFieldView = findViewById(R.id.card_info_field);
- mTitleTextView = (TextView) findViewById(R.id.card_title_text);
- mBadgeView = (ImageView) findViewById(R.id.card_extra_badge);
- mDismissIconView = findViewById(R.id.dismiss_icon);
- mDismissAnimationsHolder = new DismissAnimationsHolder(this);
- mCornerRadius = getResources().getDimensionPixelSize(
- R.dimen.recents_task_view_rounded_corners_radius);
- mRecentsRowFocusAnimationHolder = new RecentsRowFocusAnimationHolder(this, mInfoFieldView);
- SystemServicesProxy ssp = Recents.getSystemServices();
- mTouchExplorationEnabled = ssp.isTouchExplorationEnabled();
- if (!mTouchExplorationEnabled) {
- mDismissIconView.setVisibility(VISIBLE);
- } else {
- mDismissIconView.setVisibility(GONE);
- }
- mViewFocusAnimator = new ViewFocusAnimator(this);
- }
-
- public void init(Task task) {
- mTask = task;
- mTitleTextView.setText(task.title);
- mBadgeView.setImageDrawable(task.icon);
- setThumbnailView();
- setContentDescription(task.titleDescription);
- mDismissState = false;
- mDismissAnimationsHolder.reset();
- mRecentsRowFocusAnimationHolder.reset();
- }
-
- public Task getTask() {
- return mTask;
- }
-
- @Override
- public void getFocusedRect(Rect r) {
- mThumbnailView.getFocusedRect(r);
- }
-
- public Rect getFocusedThumbnailRect() {
- Rect r = new Rect();
- mThumbnailView.getGlobalVisibleRect(r);
- return r;
- }
-
- public static Rect getStartingCardThumbnailRect(
- Context context, boolean hasFocus, int numberOfTasks) {
- if(numberOfTasks > 1) {
- return getStartingCardThumbnailRectForStartPosition(context, hasFocus);
- } else {
- return getStartingCardThumbnailRectForFocusedPosition(context, hasFocus);
- }
- }
-
- private static Rect getStartingCardThumbnailRectForStartPosition(
- Context context, boolean hasFocus) {
- Resources res = context.getResources();
-
- int width = res.getDimensionPixelOffset(R.dimen.recents_tv_card_width);
- int totalSpacing = res.getDimensionPixelOffset(R.dimen.recents_tv_gird_card_spacing) * 2;
- if (hasFocus) {
- totalSpacing += res.getDimensionPixelOffset(R.dimen.recents_tv_gird_focused_card_delta);
- }
- int height = res.getDimensionPixelOffset(R.dimen.recents_tv_screenshot_height);
- int topMargin = res.getDimensionPixelOffset(R.dimen.recents_tv_gird_row_top_margin);
- int headerHeight = res.getDimensionPixelOffset(R.dimen.recents_tv_card_extra_badge_size) +
- res.getDimensionPixelOffset(R.dimen.recents_tv_icon_padding_bottom);
-
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- Point size = new Point();
- display.getSize(size);
- int screenWidth = size.x;
-
- return new Rect(screenWidth / 2 + width / 2 + totalSpacing,
- topMargin + headerHeight,
- screenWidth / 2 + width / 2 + totalSpacing + width,
- topMargin + headerHeight + height);
- }
-
- private static Rect getStartingCardThumbnailRectForFocusedPosition(
- Context context, boolean hasFocus) {
- Resources res = context.getResources();
-
- TypedValue out = new TypedValue();
- res.getValue(R.integer.selected_scale, out, true);
- float scale = hasFocus ? out.getFloat() : 1;
-
- int width = res.getDimensionPixelOffset(R.dimen.recents_tv_card_width);
- int widthDelta = (int) (width * scale - width);
- int height = res.getDimensionPixelOffset(R.dimen.recents_tv_screenshot_height);
- int heightDelta = (int) (height * scale - height);
- int topMargin = res.getDimensionPixelOffset(R.dimen.recents_tv_gird_row_top_margin);
-
- int headerHeight = res.getDimensionPixelOffset(R.dimen.recents_tv_card_extra_badge_size) +
- res.getDimensionPixelOffset(R.dimen.recents_tv_icon_padding_bottom);
- int headerHeightDelta = (int) (headerHeight * scale - headerHeight);
-
- int dismissAreaHeight =
- res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_icon_top_margin) +
- res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_icon_bottom_margin) +
- res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_icon_size) +
- res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_text_size);
-
- int dismissAreaHeightDelta = (int) (dismissAreaHeight * scale - dismissAreaHeight);
-
- int totalHeightDelta = heightDelta + headerHeightDelta + dismissAreaHeightDelta;
-
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- Point size = new Point();
- display.getSize(size);
- int screenWidth = size.x;
-
- return new Rect(screenWidth / 2 - width / 2 - widthDelta / 2,
- topMargin - totalHeightDelta / 2 + (int) (headerHeight * scale),
- screenWidth / 2 + width / 2 + widthDelta / 2,
- topMargin - totalHeightDelta / 2 + (int) (headerHeight * scale) +
- (int) (height * scale));
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- // Override dispatchKeyEvent() instead of onKeyDown() to prevent warning from ViewRootImpl.
- switch (event.getKeyCode()) {
- case KeyEvent.KEYCODE_DPAD_DOWN : {
- if (!isInDismissState() && event.getAction() == KeyEvent.ACTION_DOWN) {
- setDismissState(true);
- return true;
- }
- break;
- }
- case KeyEvent.KEYCODE_DPAD_UP : {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- if (isInDismissState()) {
- setDismissState(false);
- } else {
- ((RecentsTvActivity) getContext()).requestPipControlsFocus();
- }
- }
- return true;
- }
-
- // Eat right and left key presses when we are in dismiss state
- case KeyEvent.KEYCODE_DPAD_LEFT :
- case KeyEvent.KEYCODE_DPAD_RIGHT : {
- if (isInDismissState()) {
- return true;
- }
- break;
- }
- }
- return super.dispatchKeyEvent(event);
- }
-
- private void setDismissState(boolean dismissState) {
- if (mDismissState != dismissState) {
- mDismissState = dismissState;
- // Check for touch exploration to ensure dismiss icon/text do not
- // get animated. This should be removed based on decision from
- // b/29208918
- if (!mTouchExplorationEnabled) {
- if (dismissState) {
- mDismissAnimationsHolder.startEnterAnimation();
- } else {
- mDismissAnimationsHolder.startExitAnimation();
- }
- }
- }
- }
-
- public boolean isInDismissState() {
- return mDismissState;
- }
-
- public void startDismissTaskAnimation(Animator.AnimatorListener listener) {
- mDismissState = false;
- mDismissAnimationsHolder.startDismissAnimation(listener);
- }
-
- public ViewFocusAnimator getViewFocusAnimator() {
- return mViewFocusAnimator;
- }
-
- public RecentsRowFocusAnimationHolder getRecentsRowFocusAnimationHolder() {
- return mRecentsRowFocusAnimationHolder;
- }
-
- private void setThumbnailView() {
- ImageView screenshotView = (ImageView) findViewById(R.id.card_view_banner_icon);
- PackageManager pm = getContext().getPackageManager();
- if (mTask.thumbnail != null) {
- setAsScreenShotView(mTask.thumbnail, screenshotView);
- } else {
- try {
- Drawable banner = null;
- if (mTask.key != null) {
- banner = pm.getActivityBanner(mTask.key.baseIntent);
- }
- if (banner != null) {
- setAsBannerView(banner, screenshotView);
- } else {
- setAsIconView(mTask.icon, screenshotView);
- }
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Package not found : " + e);
- setAsIconView(mTask.icon, screenshotView);
- }
- }
- }
-
- private void setAsScreenShotView(Bitmap screenshot, ImageView screenshotView) {
- LayoutParams lp = (LayoutParams) screenshotView.getLayoutParams();
- lp.width = LayoutParams.MATCH_PARENT;
- lp.height = LayoutParams.MATCH_PARENT;
-
- screenshotView.setLayoutParams(lp);
- screenshotView.setClipToOutline(true);
- screenshotView.setOutlineProvider(new ViewOutlineProvider() {
- @Override
- public void getOutline(View view, Outline outline) {
- outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), mCornerRadius);
- }
- });
- screenshotView.setImageBitmap(screenshot);
- }
-
- private void setAsBannerView(Drawable banner, ImageView bannerView) {
- LayoutParams lp = (LayoutParams) bannerView.getLayoutParams();
- lp.width = getResources()
- .getDimensionPixelSize(R.dimen.recents_tv_banner_width);
- lp.height = getResources()
- .getDimensionPixelSize(R.dimen.recents_tv_banner_height);
- bannerView.setLayoutParams(lp);
- bannerView.setImageDrawable(banner);
- }
-
- private void setAsIconView(Drawable icon, ImageView iconView) {
- LayoutParams lp = (LayoutParams) iconView.getLayoutParams();
- lp.width = getResources()
- .getDimensionPixelSize(R.dimen.recents_tv_fallback_icon_width);
- lp.height = getResources()
- .getDimensionPixelSize(R.dimen.recents_tv_fallback_icon_height);
-
- iconView.setLayoutParams(lp);
- iconView.setImageDrawable(icon);
- }
-
- public View getThumbnailView() {
- return mThumbnailView;
- }
-
- public View getInfoFieldView() {
- return mInfoFieldView;
- }
-
- public View getDismissIconView() {
- return mDismissIconView;
- }
-
- public static int getNumberOfVisibleTasks(Context context) {
- Resources res = context.getResources();
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- Point size = new Point();
- display.getSize(size);
- int screenWidth = size.x;
- int cardWidth = res.getDimensionPixelSize(R.dimen.recents_tv_card_width);
- int spacing = res.getDimensionPixelSize(R.dimen.recents_tv_gird_card_spacing);
- return (int) (1.0 + Math.ceil(screenWidth / (cardWidth + spacing * 2.0)));
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java
deleted file mode 100644
index f9b8700..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.views;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.content.Context;
-import android.support.v17.leanback.widget.HorizontalGridView;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.RecentsActivity;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.model.TaskStack;
-import com.android.systemui.recents.model.TaskStack.TaskStackCallbacks;
-import com.android.systemui.recents.views.AnimationProps;
-
-/**
- * Horizontal Grid View Implementation to show the Task Stack for TV.
- */
-public class TaskStackHorizontalGridView extends HorizontalGridView implements TaskStackCallbacks {
- private static final int ANIMATION_DELAY_MS = 50;
- private static final int MSG_START_RECENT_ROW_FOCUS_ANIMATION = 100;
- private TaskStack mStack;
- private Task mFocusedTask;
- private AnimatorSet mRecentsRowFocusAnimation;
-
- public TaskStackHorizontalGridView(Context context) {
- this(context, null);
- }
-
- public TaskStackHorizontalGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onAttachedToWindow() {
- EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1);
- setWindowAlignment(WINDOW_ALIGN_NO_EDGE);
- setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
- super.onAttachedToWindow();
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- EventBus.getDefault().unregister(this);
- }
-
- /**
- * Initializes the grid view.
- * @param stack
- */
- public void init(TaskStack stack) {
- // Set new stack
- mStack = stack;
- if (mStack != null) {
- mStack.setCallbacks(this);
- }
- }
-
- /**
- * @return Returns the task stack.
- */
- public TaskStack getStack() {
- return mStack;
- }
-
- /**
- * @return - The focused task.
- */
- public Task getFocusedTask() {
- if (findFocus() != null) {
- mFocusedTask = ((TaskCardView)findFocus()).getTask();
- }
- return mFocusedTask;
- }
-
- /**
- * @param task
- * @return Child view for given task
- */
- public TaskCardView getChildViewForTask(Task task) {
- for (int i = 0; i < getChildCount(); i++) {
- TaskCardView tv = (TaskCardView) getChildAt(i);
- if (tv.getTask() == task) {
- return tv;
- }
- }
- return null;
- }
-
-
- /**
- * Starts the Recents row's focus gain animation.
- */
- public void startFocusGainAnimation() {
- for (int i = 0; i < getChildCount(); i++) {
- TaskCardView v = (TaskCardView) getChildAt(i);
- if (v.hasFocus()) {
- v.getViewFocusAnimator().changeSize(true);
- }
- v.getRecentsRowFocusAnimationHolder().startFocusGainAnimation();
- }
- }
-
- /**
- * Starts the Recents row's focus loss animation.
- */
- public void startFocusLossAnimation() {
- for (int i = 0; i < getChildCount(); i++) {
- TaskCardView v = (TaskCardView) getChildAt(i);
- if (v.hasFocus()) {
- v.getViewFocusAnimator().changeSize(false);
- }
- v.getRecentsRowFocusAnimationHolder().startFocusLossAnimation();
- }
- }
-
- @Override
- public void onStackTaskAdded(TaskStack stack, Task newTask) {
- ((TaskStackHorizontalViewAdapter) getAdapter()).addTaskAt(newTask,
- stack.indexOfStackTask(newTask));
- }
-
- @Override
- public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask,
- AnimationProps animation, boolean fromDockGesture) {
- ((TaskStackHorizontalViewAdapter) getAdapter()).removeTask(removedTask);
- if (mFocusedTask == removedTask) {
- mFocusedTask = null;
- }
- // If there are no remaining tasks, then just close recents
- if (mStack.getStackTaskCount() == 0) {
- boolean shouldFinishActivity = (mStack.getStackTaskCount() == 0);
- if (shouldFinishActivity) {
- EventBus.getDefault().send(new AllTaskViewsDismissedEvent(fromDockGesture
- ? R.string.recents_empty_message
- : R.string.recents_empty_message_dismissed_all));
- }
- }
- }
-
- @Override
- public void onStackTasksRemoved(TaskStack stack) {
- // Do nothing
- }
-
- @Override
- public void onStackTasksUpdated(TaskStack stack) {
- // Do nothing
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java
deleted file mode 100644
index 236d077..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.recents.tv.views;
-
-import android.animation.Animator;
-import android.support.v7.widget.RecyclerView;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.events.EventBus;
-import com.android.systemui.recents.events.activity.LaunchTvTaskEvent;
-import com.android.systemui.recents.events.ui.DeleteTaskDataEvent;
-import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.views.AnimationProps;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
-public class TaskStackHorizontalViewAdapter extends
- RecyclerView.Adapter<TaskStackHorizontalViewAdapter.ViewHolder> {
-
- //Full class name is 30 characters
- private static final String TAG = "TaskStackViewAdapter";
- private List<Task> mTaskList;
- private TaskStackHorizontalGridView mGridView;
-
- public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
- private TaskCardView mTaskCardView;
- private Task mTask;
- public ViewHolder(View v) {
- super(v);
- mTaskCardView = (TaskCardView) v;
- }
-
- public void init(Task task) {
- mTaskCardView.init(task);
- mTask = task;
- mTaskCardView.setOnClickListener(this);
- }
-
- @Override
- public void onClick(View v) {
- try {
- if (mTaskCardView.isInDismissState()) {
- mTaskCardView.startDismissTaskAnimation(
- getRemoveAtListener(getAdapterPosition(), mTaskCardView.getTask()));
- } else {
- EventBus.getDefault().send(new LaunchTvTaskEvent(mTaskCardView, mTask,
- null, INVALID_STACK_ID));
- }
- } catch (Exception e) {
- Log.e(TAG, v.getContext()
- .getString(R.string.recents_launch_error_message, mTask.title), e);
- }
-
- }
-
- private Animator.AnimatorListener getRemoveAtListener(final int position,
- final Task task) {
- return new Animator.AnimatorListener() {
-
- @Override
- public void onAnimationStart(Animator animation) { }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- removeTask(task);
- EventBus.getDefault().send(new DeleteTaskDataEvent(task));
- }
-
- @Override
- public void onAnimationCancel(Animator animation) { }
-
- @Override
- public void onAnimationRepeat(Animator animation) { }
- };
-
- }
- }
-
- public TaskStackHorizontalViewAdapter(List tasks) {
- mTaskList = new ArrayList<Task>(tasks);
- }
-
- public void setNewStackTasks(List tasks) {
- mTaskList.clear();
- mTaskList.addAll(tasks);
- notifyDataSetChanged();
- }
-
- @Override
- public TaskStackHorizontalViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
- int viewType) {
- LayoutInflater inflater = LayoutInflater.from(parent.getContext());
- ViewHolder viewHolder = new ViewHolder(
- inflater.inflate(R.layout.recents_tv_task_card_view, parent, false));
- return viewHolder;
- }
-
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- Task task = mTaskList.get(position);
- // Retrives from caches, loading only if necessary
- Recents.getTaskLoader().loadTaskData(task);
- holder.init(task);
- }
-
- @Override
- public int getItemCount() {
- return mTaskList.size();
- }
-
- public void removeTask(Task task) {
- int position = mTaskList.indexOf(task);
- if (position >= 0) {
- mTaskList.remove(position);
- notifyItemRemoved(position);
- if (mGridView != null) {
- mGridView.getStack().removeTask(task, AnimationProps.IMMEDIATE,
- false);
- }
- }
- }
-
- public int getPositionOfTask(Task task) {
- int position = mTaskList.indexOf(task);
- return (position >= 0) ? position : 0;
- }
-
-
- public void setTaskStackHorizontalGridView(TaskStackHorizontalGridView gridView) {
- mGridView = gridView;
- }
-
- public void addTaskAt(Task task, int position) {
- mTaskList.add(position, task);
- notifyItemInserted(position);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index 6a66fca7..8882cab 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -16,6 +16,7 @@
package com.android.systemui.recents.views;
+import static android.app.ActivityManager.StackId.ASSISTANT_STACK_ID;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
@@ -303,7 +304,7 @@
// TODO: Sometimes targetStackId is not initialized after reboot, so we also have to
// check for INVALID_STACK_ID
if (targetStackId == FULLSCREEN_WORKSPACE_STACK_ID || targetStackId == DOCKED_STACK_ID
- || targetStackId == INVALID_STACK_ID) {
+ || targetStackId == ASSISTANT_STACK_ID || targetStackId == INVALID_STACK_ID) {
if (taskView == null) {
specs.add(composeOffscreenAnimationSpec(task, offscreenTaskRect));
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
index db0c95e..2180ec8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
@@ -160,7 +160,10 @@
EventBus.getDefault().send(new DragStartInitializeDropTargetsEvent(event.task,
event.taskView, this));
if (mDeviceId != -1) {
- InputDevice.getDevice(mDeviceId).setPointerType(PointerIcon.TYPE_GRABBING);
+ InputDevice device = InputDevice.getDevice(mDeviceId);
+ if (device != null) {
+ device.setPointerType(PointerIcon.TYPE_GRABBING);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 6f59fe2..97506e6 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -746,15 +746,18 @@
if (mStableInsets.isEmpty()) {
SystemServicesProxy.getInstance(mContext).getStableInsets(mStableInsets);
}
+ mMinimizedSnapAlgorithm = null;
+ mDockedStackMinimized = minimized;
+ initializeSnapAlgorithm();
if (!mIsInMinimizeInteraction && minimized) {
mIsInMinimizeInteraction = true;
mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition(
isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight,
mDividerSize);
+
+ int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
+ resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
}
- mMinimizedSnapAlgorithm = null;
- mDockedStackMinimized = minimized;
- initializeSnapAlgorithm();
}
}
@@ -1140,7 +1143,7 @@
&& dockSideBottomRight(mDockSide))) {
return StackId.DOCKED_STACK_ID;
} else {
- return StackId.HOME_STACK_ID;
+ return StackId.RECENTS_STACK_ID;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index fb92a67..dceeb74 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -29,6 +29,7 @@
import android.os.BatteryStats;
import android.os.Handler;
import android.os.Message;
+import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -39,6 +40,7 @@
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -49,6 +51,8 @@
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.util.wakelock.SettableWakeLock;
+import com.android.systemui.util.wakelock.WakeLock;
/**
* Controls the indications and error messages shown on the Keyguard
@@ -68,6 +72,7 @@
private final KeyguardIndicationTextView mDisclosure;
private final UserManager mUserManager;
private final IBatteryStats mBatteryInfo;
+ private final SettableWakeLock mWakeLock;
private final int mSlowThreshold;
private final int mFastThreshold;
@@ -92,6 +97,13 @@
public KeyguardIndicationController(Context context, ViewGroup indicationArea,
LockIcon lockIcon) {
+ this(context, indicationArea, lockIcon,
+ WakeLock.createPartial(context, "Doze:KeyguardIndication"));
+ }
+
+ @VisibleForTesting
+ KeyguardIndicationController(Context context, ViewGroup indicationArea, LockIcon lockIcon,
+ WakeLock wakeLock) {
mContext = context;
mIndicationArea = indicationArea;
mTextView = (KeyguardIndicationTextView) indicationArea.findViewById(
@@ -99,6 +111,7 @@
mDisclosure = (KeyguardIndicationTextView) indicationArea.findViewById(
R.id.keyguard_indication_enterprise_disclosure);
mLockIcon = lockIcon;
+ mWakeLock = new SettableWakeLock(wakeLock);
Resources res = context.getResources();
mSlowThreshold = res.getInteger(R.integer.config_chargingSlowlyThreshold);
@@ -208,6 +221,11 @@
mTransientIndication = transientIndication;
mTransientTextColor = textColor;
mHandler.removeMessages(MSG_HIDE_TRANSIENT);
+ if (mDozing && !TextUtils.isEmpty(mTransientIndication)) {
+ // Make sure this doesn't get stuck and burns in. Acquire wakelock until its cleared.
+ mWakeLock.setAcquired(true);
+ hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS);
+ }
updateIndication();
}
@@ -223,6 +241,10 @@
}
private void updateIndication() {
+ if (TextUtils.isEmpty(mTransientIndication)) {
+ mWakeLock.setAcquired(false);
+ }
+
if (mVisible) {
// Walk down a precedence-ordered list of what should indication
// should be shown based on user or device state
@@ -323,9 +345,8 @@
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- if (msg.what == MSG_HIDE_TRANSIENT && mTransientIndication != null) {
- mTransientIndication = null;
- updateIndication();
+ if (msg.what == MSG_HIDE_TRANSIENT) {
+ hideTransientIndication();
} else if (msg.what == MSG_CLEAR_FP_MSG) {
mLockIcon.setTransientFpError(false);
hideTransientIndication();
@@ -340,17 +361,27 @@
}
protected class BaseKeyguardCallback extends KeyguardUpdateMonitorCallback {
+ public static final int HIDE_DELAY_MS = 5000;
private int mLastSuccessiveErrorMessage = -1;
@Override
public void onRefreshBatteryInfo(KeyguardUpdateMonitor.BatteryStatus status) {
boolean isChargingOrFull = status.status == BatteryManager.BATTERY_STATUS_CHARGING
|| status.status == BatteryManager.BATTERY_STATUS_FULL;
+ boolean wasPluggedIn = mPowerPluggedIn;
mPowerPluggedIn = status.isPluggedIn() && isChargingOrFull;
mPowerCharged = status.isCharged();
mChargingWattage = status.maxChargingWattage;
mChargingSpeed = status.getChargingSpeed(mSlowThreshold, mFastThreshold);
updateIndication();
+ if (mDozing) {
+ if (!wasPluggedIn && mPowerPluggedIn) {
+ showTransientIndication(computePowerIndication());
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
+ } else if (wasPluggedIn && !mPowerPluggedIn) {
+ hideTransientIndication();
+ }
+ }
}
@Override
@@ -401,8 +432,7 @@
} else if (updateMonitor.isDeviceInteractive()) {
showTransientIndication(errString, errorColor);
// We want to keep this message around in case the screen was off
- mHandler.removeMessages(MSG_HIDE_TRANSIENT);
- hideTransientIndicationDelayed(5000);
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
} else {
mMessageToShowOnScreenOn = errString;
}
@@ -415,8 +445,7 @@
int errorColor = Utils.getColorError(mContext);
showTransientIndication(mMessageToShowOnScreenOn, errorColor);
// We want to keep this message around in case the screen was off
- mHandler.removeMessages(MSG_HIDE_TRANSIENT);
- hideTransientIndicationDelayed(5000);
+ hideTransientIndicationDelayed(HIDE_DELAY_MS);
mMessageToShowOnScreenOn = null;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 8f8d966..90e908b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -16,11 +16,15 @@
package com.android.systemui.statusbar;
+import android.app.AppGlobals;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
import android.content.Context;
import android.graphics.drawable.Icon;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
@@ -31,7 +35,9 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;
+import android.Manifest;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.NotificationColorUtil;
import com.android.systemui.statusbar.notification.InflationException;
@@ -453,13 +459,30 @@
}
// Q: What kinds of notifications should show during setup?
- // A: Almost none! Only things coming from the system (package is "android") that also
- // have special "kind" tags marking them as relevant for setup (see below).
+ // A: Almost none! Only things coming from packages with permission
+ // android.permission.NOTIFICATION_DURING_SETUP that also have special "kind" tags marking them
+ // as relevant for setup (see below).
public static boolean showNotificationEvenIfUnprovisioned(StatusBarNotification sbn) {
- return "android".equals(sbn.getPackageName())
+ return showNotificationEvenIfUnprovisioned(AppGlobals.getPackageManager(), sbn);
+ }
+
+ @VisibleForTesting
+ static boolean showNotificationEvenIfUnprovisioned(IPackageManager packageManager,
+ StatusBarNotification sbn) {
+ return checkUidPermission(packageManager, Manifest.permission.NOTIFICATION_DURING_SETUP,
+ sbn.getUid()) == PackageManager.PERMISSION_GRANTED
&& sbn.getNotification().extras.getBoolean(Notification.EXTRA_ALLOW_DURING_SETUP);
}
+ private static int checkUidPermission(IPackageManager packageManager, String permission,
+ int uid) {
+ try {
+ return packageManager.checkUidPermission(permission, uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
public void dump(PrintWriter pw, String indent) {
int N = mSortedAndFiltered.size();
pw.print(indent);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index 66703ee..73eecbb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -23,19 +23,19 @@
import android.view.View;
import android.widget.RemoteViews;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationContentView;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.phone.StatusBar;
-import java.util.Objects;
-
/**
* A utility that inflates the right kind of contentView based on the state
*/
public class NotificationInflater {
- private static final int FLAG_REINFLATE_ALL = ~0;
+ @VisibleForTesting
+ static final int FLAG_REINFLATE_ALL = ~0;
private static final int FLAG_REINFLATE_CONTENT_VIEW = 1<<0;
private static final int FLAG_REINFLATE_EXPANDED_VIEW = 1<<1;
private static final int FLAG_REINFLATE_HEADS_UP_VIEW = 1<<2;
@@ -104,115 +104,12 @@
*/
private void inflateNotificationViews(int reInflateFlags)
throws InflationException {
- NotificationData.Entry entry = mRow.getEntry();
- StatusBarNotification sbn = entry.notification;
- Context context = mRow.getContext();
- NotificationContentView privateLayout = mRow.getPrivateLayout();
+ StatusBarNotification sbn = mRow.getEntry().notification;
try {
final Notification.Builder recoveredBuilder
- = Notification.Builder.recoverBuilder(context, sbn.getNotification());
- boolean isLowPriority = mIsLowPriority && !mIsChildInGroup;
- if ((reInflateFlags & FLAG_REINFLATE_CONTENT_VIEW) != 0) {
- final RemoteViews newContentView = createContentView(recoveredBuilder,
- isLowPriority, mUsesIncreasedHeadsUpHeight);
- if (!compareRemoteViews(newContentView,
- entry.cachedContentView)) {
- View contentViewLocal = newContentView.apply(
- sbn.getPackageContext(context),
- privateLayout,
- mRemoteViewClickHandler);
- contentViewLocal.setIsRootNamespace(true);
- privateLayout.setContractedChild(contentViewLocal);
- } else {
- newContentView.reapply(sbn.getPackageContext(context),
- privateLayout.getContractedChild(),
- mRemoteViewClickHandler);
- }
- entry.cachedContentView = newContentView;
- }
-
- if ((reInflateFlags & FLAG_REINFLATE_EXPANDED_VIEW) != 0) {
- final RemoteViews newBigContentView = createBigContentView(
- recoveredBuilder, isLowPriority);
- if (newBigContentView != null) {
- if (!compareRemoteViews(newBigContentView, entry.cachedBigContentView)) {
- View bigContentViewLocal = newBigContentView.apply(
- sbn.getPackageContext(context),
- privateLayout,
- mRemoteViewClickHandler);
- bigContentViewLocal.setIsRootNamespace(true);
- privateLayout.setExpandedChild(bigContentViewLocal);
- } else {
- newBigContentView.reapply(sbn.getPackageContext(context),
- privateLayout.getExpandedChild(),
- mRemoteViewClickHandler);
- }
- } else if (entry.cachedBigContentView != null) {
- privateLayout.setExpandedChild(null);
- }
- entry.cachedBigContentView = newBigContentView;
- mRow.setExpandable(newBigContentView != null);
- }
-
- if ((reInflateFlags & FLAG_REINFLATE_HEADS_UP_VIEW) != 0) {
- final RemoteViews newHeadsUpContentView =
- recoveredBuilder.createHeadsUpContentView(mUsesIncreasedHeight);
- if (newHeadsUpContentView != null) {
- if (!compareRemoteViews(newHeadsUpContentView,
- entry.cachedHeadsUpContentView)) {
- View headsUpContentViewLocal = newHeadsUpContentView.apply(
- sbn.getPackageContext(context),
- privateLayout,
- mRemoteViewClickHandler);
- headsUpContentViewLocal.setIsRootNamespace(true);
- privateLayout.setHeadsUpChild(headsUpContentViewLocal);
- } else {
- newHeadsUpContentView.reapply(sbn.getPackageContext(context),
- privateLayout.getHeadsUpChild(),
- mRemoteViewClickHandler);
- }
- } else if (entry.cachedHeadsUpContentView != null) {
- privateLayout.setHeadsUpChild(null);
- }
- entry.cachedHeadsUpContentView = newHeadsUpContentView;
- }
-
- if ((reInflateFlags & FLAG_REINFLATE_PUBLIC_VIEW) != 0) {
- NotificationContentView publicLayout = mRow.getPublicLayout();
- final RemoteViews newPublicNotification
- = recoveredBuilder.makePublicContentView();
- if (!compareRemoteViews(newPublicNotification, entry.cachedPublicContentView)) {
- View publicContentView = newPublicNotification.apply(
- sbn.getPackageContext(context),
- publicLayout,
- mRemoteViewClickHandler);
- publicContentView.setIsRootNamespace(true);
- publicLayout.setContractedChild(publicContentView);
- } else {
- newPublicNotification.reapply(sbn.getPackageContext(context),
- publicLayout.getContractedChild(),
- mRemoteViewClickHandler);
- }
- entry.cachedPublicContentView = newPublicNotification;
- }
-
- if ((reInflateFlags & FLAG_REINFLATE_AMBIENT_VIEW) != 0) {
- final RemoteViews newAmbientNotification
- = recoveredBuilder.makeAmbientNotification();
- if (!compareRemoteViews(newAmbientNotification, entry.cachedAmbientContentView)) {
- View ambientContentView = newAmbientNotification.apply(
- sbn.getPackageContext(context),
- privateLayout,
- mRemoteViewClickHandler);
- ambientContentView.setIsRootNamespace(true);
- privateLayout.setAmbientChild(ambientContentView);
- } else {
- newAmbientNotification.reapply(sbn.getPackageContext(context),
- privateLayout.getAmbientChild(),
- mRemoteViewClickHandler);
- }
- entry.cachedAmbientContentView = newAmbientNotification;
- }
+ = Notification.Builder.recoverBuilder(mRow.getContext(), sbn.getNotification());
+ Context packageContext = sbn.getPackageContext(mRow.getContext());
+ inflateNotificationViews(reInflateFlags, recoveredBuilder, packageContext);
} catch (RuntimeException e) {
final String ident = sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId());
@@ -221,6 +118,115 @@
}
}
+ @VisibleForTesting
+ void inflateNotificationViews(int reInflateFlags,
+ Notification.Builder builder, Context packageContext) {
+ NotificationData.Entry entry = mRow.getEntry();
+ NotificationContentView privateLayout = mRow.getPrivateLayout();
+ boolean isLowPriority = mIsLowPriority && !mIsChildInGroup;
+ if ((reInflateFlags & FLAG_REINFLATE_CONTENT_VIEW) != 0) {
+ final RemoteViews newContentView = createContentView(builder,
+ isLowPriority, mUsesIncreasedHeight);
+ if (!compareRemoteViews(newContentView,
+ entry.cachedContentView)) {
+ View contentViewLocal = newContentView.apply(
+ packageContext,
+ privateLayout,
+ mRemoteViewClickHandler);
+ contentViewLocal.setIsRootNamespace(true);
+ privateLayout.setContractedChild(contentViewLocal);
+ } else {
+ newContentView.reapply(packageContext,
+ privateLayout.getContractedChild(),
+ mRemoteViewClickHandler);
+ }
+ entry.cachedContentView = newContentView;
+ }
+
+ if ((reInflateFlags & FLAG_REINFLATE_EXPANDED_VIEW) != 0) {
+ final RemoteViews newBigContentView = createBigContentView(
+ builder, isLowPriority);
+ if (newBigContentView != null) {
+ if (!compareRemoteViews(newBigContentView, entry.cachedBigContentView)) {
+ View bigContentViewLocal = newBigContentView.apply(
+ packageContext,
+ privateLayout,
+ mRemoteViewClickHandler);
+ bigContentViewLocal.setIsRootNamespace(true);
+ privateLayout.setExpandedChild(bigContentViewLocal);
+ } else {
+ newBigContentView.reapply(packageContext,
+ privateLayout.getExpandedChild(),
+ mRemoteViewClickHandler);
+ }
+ } else if (entry.cachedBigContentView != null) {
+ privateLayout.setExpandedChild(null);
+ }
+ entry.cachedBigContentView = newBigContentView;
+ mRow.setExpandable(newBigContentView != null);
+ }
+
+ if ((reInflateFlags & FLAG_REINFLATE_HEADS_UP_VIEW) != 0) {
+ final RemoteViews newHeadsUpContentView =
+ builder.createHeadsUpContentView(mUsesIncreasedHeadsUpHeight);
+ if (newHeadsUpContentView != null) {
+ if (!compareRemoteViews(newHeadsUpContentView,
+ entry.cachedHeadsUpContentView)) {
+ View headsUpContentViewLocal = newHeadsUpContentView.apply(
+ packageContext,
+ privateLayout,
+ mRemoteViewClickHandler);
+ headsUpContentViewLocal.setIsRootNamespace(true);
+ privateLayout.setHeadsUpChild(headsUpContentViewLocal);
+ } else {
+ newHeadsUpContentView.reapply(packageContext,
+ privateLayout.getHeadsUpChild(),
+ mRemoteViewClickHandler);
+ }
+ } else if (entry.cachedHeadsUpContentView != null) {
+ privateLayout.setHeadsUpChild(null);
+ }
+ entry.cachedHeadsUpContentView = newHeadsUpContentView;
+ }
+
+ if ((reInflateFlags & FLAG_REINFLATE_PUBLIC_VIEW) != 0) {
+ NotificationContentView publicLayout = mRow.getPublicLayout();
+ final RemoteViews newPublicNotification
+ = builder.makePublicContentView();
+ if (!compareRemoteViews(newPublicNotification, entry.cachedPublicContentView)) {
+ View publicContentView = newPublicNotification.apply(
+ packageContext,
+ publicLayout,
+ mRemoteViewClickHandler);
+ publicContentView.setIsRootNamespace(true);
+ publicLayout.setContractedChild(publicContentView);
+ } else {
+ newPublicNotification.reapply(packageContext,
+ publicLayout.getContractedChild(),
+ mRemoteViewClickHandler);
+ }
+ entry.cachedPublicContentView = newPublicNotification;
+ }
+
+ if ((reInflateFlags & FLAG_REINFLATE_AMBIENT_VIEW) != 0) {
+ final RemoteViews newAmbientNotification
+ = builder.makeAmbientNotification();
+ if (!compareRemoteViews(newAmbientNotification, entry.cachedAmbientContentView)) {
+ View ambientContentView = newAmbientNotification.apply(
+ packageContext,
+ privateLayout,
+ mRemoteViewClickHandler);
+ ambientContentView.setIsRootNamespace(true);
+ privateLayout.setAmbientChild(ambientContentView);
+ } else {
+ newAmbientNotification.reapply(packageContext,
+ privateLayout.getAmbientChild(),
+ mRemoteViewClickHandler);
+ }
+ entry.cachedAmbientContentView = newAmbientNotification;
+ }
+ }
+
private RemoteViews createBigContentView(Notification.Builder builder,
boolean isLowPriority) {
RemoteViews bigContentView = builder.createBigContentView();
@@ -260,6 +266,7 @@
public interface InflationExceptionHandler {
void handleInflationException(StatusBarNotification notification, InflationException e);
}
+
public void onDensityOrFontScaleChanged() {
NotificationData.Entry entry = mRow.getEntry();
entry.cachedAmbientContentView = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 4a2ec88..7b2e997 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
-import android.os.Build;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
@@ -25,6 +24,7 @@
import android.util.MathUtils;
import android.util.SparseBooleanArray;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.systemui.R;
import java.io.PrintWriter;
@@ -32,14 +32,15 @@
public class DozeParameters {
private static final int MAX_DURATION = 60 * 1000;
public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully";
- public static final boolean ALWAYS_ON_AVAILABLE = Build.IS_DEBUGGABLE;
private final Context mContext;
+ private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
public DozeParameters(Context context) {
mContext = context;
+ mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
}
public void dump(PrintWriter pw) {
@@ -58,8 +59,7 @@
pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println(
dumpPickupSubtypePerformsProxCheck());
- if (ALWAYS_ON_AVAILABLE) {
- pw.print(" getAlwaysOn(): "); pw.println(getAlwaysOn());
+ if (mAmbientDisplayConfiguration.alwaysOnAvailable()) {
pw.print(" getSensorsWakeUpFully(): "); pw.println(getSensorsWakeUpFully());
}
}
@@ -119,13 +119,11 @@
}
public boolean getAlwaysOn() {
- return ALWAYS_ON_AVAILABLE
- && Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.DOZE_ALWAYS_ON, 0, UserHandle.USER_CURRENT) != 0;
+ return mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
}
public boolean getSensorsWakeUpFully() {
- return ALWAYS_ON_AVAILABLE
+ return mAmbientDisplayConfiguration.alwaysOnAvailable()
&& Settings.Secure.getIntForUser(mContext.getContentResolver(),
DOZE_SENSORS_WAKE_UP_FULLY, 1, UserHandle.USER_CURRENT) != 0;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java
index 83b96bf..b5f56c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenGestureLogger.java
@@ -19,6 +19,7 @@
import android.metrics.LogMaker;
import android.util.ArrayMap;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.EventLogConstants;
@@ -32,6 +33,7 @@
private ArrayMap<Integer, Integer> mLegacyMap;
private LogMaker mLogMaker = new LogMaker(MetricsEvent.VIEW_UNKNOWN)
.setType(MetricsEvent.TYPE_ACTION);
+ private MetricsLogger mMetricsLogger = new MetricsLogger();
public LockscreenGestureLogger() {
mLegacyMap = new ArrayMap<>(EventLogConstants.METRICS_GESTURE_TYPE_MAP.length);
@@ -41,7 +43,7 @@
}
public void write(int gesture, int length, int velocity) {
- MetricsLogger.action(mLogMaker.setCategory(gesture)
+ mMetricsLogger.write(mLogMaker.setCategory(gesture)
.setType(MetricsEvent.TYPE_ACTION)
.addTaggedData(MetricsEvent.FIELD_GESTURE_LENGTH, length)
.addTaggedData(MetricsEvent.FIELD_GESTURE_VELOCITY, velocity));
@@ -56,4 +58,9 @@
}
return value;
}
+
+ @VisibleForTesting
+ void setMetricsLogger(MetricsLogger metricsLogger) {
+ mMetricsLogger = metricsLogger;
+ }
}
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 99f8aaf..8a3c4e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -142,7 +142,7 @@
try {
WindowManagerGlobal.getWindowManagerService()
- .watchRotation(mRotationWatcher);
+ .watchRotation(mRotationWatcher, getContext().getDisplay().getDisplayId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 005b701..2c5bd3c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -90,6 +90,7 @@
import android.provider.Settings;
import android.service.notification.NotificationListenerService.RankingMap;
import android.service.notification.StatusBarNotification;
+import android.support.annotation.VisibleForTesting;
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -487,6 +488,8 @@
private ScreenPinningRequest mScreenPinningRequest;
+ MetricsLogger mMetricsLogger = new MetricsLogger();
+
// ensure quick settings is disabled until the current user makes it through the setup wizard
private boolean mUserSetup = false;
private DeviceProvisionedListener mUserSetupObserver = new DeviceProvisionedListener() {
@@ -749,6 +752,12 @@
private NavigationBarFragment mNavigationBar;
private View mNavigationBarView;
+ @VisibleForTesting
+ void setMetricsLogger(MetricsLogger metricsLogger) {
+ mMetricsLogger = metricsLogger;
+ mLockscreenGestureLogger.setMetricsLogger(metricsLogger);
+ }
+
@Override
public void start() {
mNetworkController = Dependency.get(NetworkController.class);
@@ -1360,7 +1369,7 @@
mDismissView.setOnButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- MetricsLogger.action(mContext, MetricsEvent.ACTION_DISMISS_ALL_NOTES);
+ mMetricsLogger.action(MetricsEvent.ACTION_DISMISS_ALL_NOTES);
clearAllNotifications();
}
});
@@ -1539,7 +1548,7 @@
} else {
EventBus.getDefault().send(new UndockingTaskEvent());
if (metricsUndockAction != -1) {
- MetricsLogger.action(mContext, metricsUndockAction);
+ mMetricsLogger.action(metricsUndockAction);
}
}
}
@@ -1597,7 +1606,7 @@
notification.getKey());
notification.getNotification().fullScreenIntent.send();
shadeEntry.notifyFullScreenIntentLaunched();
- MetricsLogger.count(mContext, "note_fullscreen", 1);
+ mMetricsLogger.count("note_fullscreen", 1);
} catch (PendingIntent.CanceledException e) {
}
}
@@ -2801,16 +2810,16 @@
if (!mUserSetup) return;
if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP == key) {
- MetricsLogger.action(mContext, MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_UP);
+ mMetricsLogger.action(MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_UP);
mNotificationPanel.collapse(false /* delayed */, 1.0f /* speedUpFactor */);
} else if (KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN == key) {
- MetricsLogger.action(mContext, MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_DOWN);
+ mMetricsLogger.action(MetricsEvent.ACTION_SYSTEM_NAVIGATION_KEY_DOWN);
if (mNotificationPanel.isFullyCollapsed()) {
mNotificationPanel.expand(true /* animate */);
- MetricsLogger.count(mContext, NotificationPanelView.COUNTER_PANEL_OPEN, 1);
+ mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN, 1);
} else if (!mNotificationPanel.isInSettings() && !mNotificationPanel.isExpanding()){
mNotificationPanel.flingSettings(0 /* velocity */, true /* expand */);
- MetricsLogger.count(mContext, NotificationPanelView.COUNTER_PANEL_OPEN_QS, 1);
+ mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN_QS, 1);
}
}
@@ -3689,7 +3698,7 @@
if (pinnedHeadsUp && isPanelFullyCollapsed()) {
notificationLoad = 1;
} else {
- MetricsLogger.histogram(mContext, "note_load", notificationLoad);
+ mMetricsLogger.histogram("note_load", notificationLoad);
}
mBarService.onPanelRevealed(clearNotificationEffects, notificationLoad);
} else {
@@ -3772,7 +3781,7 @@
if (mStatusBarStateLog == null) {
mStatusBarStateLog = new LogMaker(MetricsEvent.VIEW_UNKNOWN);
}
- MetricsLogger.action(mStatusBarStateLog
+ mMetricsLogger.write(mStatusBarStateLog
.setCategory(isBouncerShowing ? MetricsEvent.BOUNCER : MetricsEvent.LOCKSCREEN)
.setType(isShowing ? MetricsEvent.TYPE_OPEN : MetricsEvent.TYPE_CLOSE)
.setSubtype(isSecure ? 1 : 0));
@@ -5776,7 +5785,7 @@
NotificationInfo info = (NotificationInfo) item.gutsContent;
final NotificationInfo.OnSettingsClickListener onSettingsClick = (View v,
int appUid) -> {
- MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTE_INFO);
+ mMetricsLogger.action(MetricsEvent.ACTION_NOTE_INFO);
guts.resetFalsingCheck();
startAppNotificationSettingsActivity(pkg, appUid, channel.getId());
};
@@ -5848,7 +5857,7 @@
return false;
}
- MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTE_CONTROLS);
+ mMetricsLogger.action(MetricsEvent.ACTION_NOTE_CONTROLS);
// ensure that it's laid but not visible until actually laid out
guts.setVisibility(View.INVISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index 48ff1c1..641fe69 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -45,7 +45,7 @@
* has occurred.
*/
interface BatteryStateChangeCallback {
- void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging);
- void onPowerSaveChanged(boolean isPowerSave);
+ default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {}
+ default void onPowerSaveChanged(boolean isPowerSave) {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
index 1df12ac..1a51dab 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
@@ -25,7 +25,7 @@
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.phone.StatusBarIconController;
-import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
+import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
public class BatteryPreference extends DropDownPreference implements TunerService.Tunable {
@@ -49,7 +49,7 @@
public void onAttached() {
super.onAttached();
mHasPercentage = Settings.System.getInt(getContext().getContentResolver(),
- SHOW_PERCENT_SETTING, 0) != 0;
+ SHOW_BATTERY_PERCENT, 0) != 0;
Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
}
@@ -84,7 +84,7 @@
protected boolean persistString(String value) {
final boolean v = PERCENT.equals(value);
MetricsLogger.action(getContext(), MetricsEvent.TUNER_BATTERY_PERCENTAGE, v);
- Settings.System.putInt(getContext().getContentResolver(), SHOW_PERCENT_SETTING, v ? 1 : 0);
+ Settings.System.putInt(getContext().getContentResolver(), SHOW_BATTERY_PERCENT, v ? 1 : 0);
if (DISABLED.equals(value)) {
mBlacklist.add(mBattery);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
index 209b439..e7bce708 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
@@ -26,11 +26,11 @@
import android.view.MenuInflater;
import android.view.MenuItem;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.plugins.PluginPrefs;
-import com.android.systemui.statusbar.phone.DozeParameters;
public class TunerFragment extends PreferenceFragment {
@@ -65,7 +65,7 @@
if (!PluginPrefs.hasPlugins(getContext())) {
getPreferenceScreen().removePreference(findPreference(KEY_PLUGINS));
}
- if (!DozeParameters.ALWAYS_ON_AVAILABLE) {
+ if (!alwaysOnAvailable()) {
getPreferenceScreen().removePreference(findPreference(KEY_DOZE));
}
@@ -77,6 +77,10 @@
}
}
+ private boolean alwaysOnAvailable() {
+ return new AmbientDisplayConfiguration(getContext()).alwaysOnAvailable();
+ }
+
@Override
public void onResume() {
super.onResume();
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
index 6a92b2f..7c4f2ee 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
@@ -38,7 +38,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
-import static com.android.systemui.BatteryMeterView.SHOW_PERCENT_SETTING;
+import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
import com.android.systemui.DemoMode;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -213,7 +213,7 @@
// A couple special cases.
Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null);
Settings.System.putString(mContentResolver,
- SHOW_PERCENT_SETTING, null);
+ SHOW_BATTERY_PERCENT, null);
Intent intent = new Intent(DemoMode.ACTION_DEMO);
intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_EXIT);
mContext.sendBroadcast(intent);
diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
index 43727e0..cfe16dd 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.app.Notification;
import android.app.Notification.Action;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -35,6 +36,7 @@
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
+import android.provider.Settings;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
@@ -181,6 +183,11 @@
}
private void updateMissingPrivateVolumes() {
+ if (isTv()) {
+ // On TV, TvSettings displays a modal full-screen activity in this case.
+ return;
+ }
+
final List<VolumeRecord> recs = mStorageManager.getVolumeRecords();
for (VolumeRecord rec : recs) {
if (rec.getType() != VolumeInfo.TYPE_PRIVATE) continue;
@@ -210,7 +217,8 @@
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setLocalOnly(true)
.setCategory(Notification.CATEGORY_SYSTEM)
- .setDeleteIntent(buildSnoozeIntent(fsUuid));
+ .setDeleteIntent(buildSnoozeIntent(fsUuid))
+ .extend(new Notification.TvExtender());
SystemUI.overrideNotificationAppName(mContext, builder);
mNotificationManager.notifyAsUser(fsUuid, SystemMessage.NOTE_STORAGE_PRIVATE,
@@ -237,7 +245,8 @@
.setStyle(new Notification.BigTextStyle().bigText(text))
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setLocalOnly(true)
- .setCategory(Notification.CATEGORY_ERROR);
+ .setCategory(Notification.CATEGORY_ERROR)
+ .extend(new Notification.TvExtender());
SystemUI.overrideNotificationAppName(mContext, builder);
mNotificationManager.notifyAsUser(disk.getId(), SystemMessage.NOTE_STORAGE_DISK,
@@ -378,7 +387,7 @@
.addAction(new Action(R.drawable.ic_eject_24dp,
mContext.getString(R.string.ext_media_unmount_action),
buildUnmountPendingIntent(vol)))
- .setContentIntent(browseIntent)
+ .setContentIntent(buildUnmountPendingIntent(vol))
.setCategory(Notification.CATEGORY_SYSTEM);
// Non-adoptable disks can't be snoozed.
if (disk.isAdoptable()) {
@@ -571,15 +580,21 @@
.setContentText(text)
.setStyle(new Notification.BigTextStyle().bigText(text))
.setVisibility(Notification.VISIBILITY_PUBLIC)
- .setLocalOnly(true);
+ .setLocalOnly(true)
+ .extend(new Notification.TvExtender());
overrideNotificationAppName(mContext, builder);
return builder;
}
private PendingIntent buildInitPendingIntent(DiskInfo disk) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageWizardInit");
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction("com.android.tv.settings.action.NEW_STORAGE");
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageWizardInit");
+ }
intent.putExtra(DiskInfo.EXTRA_DISK_ID, disk.getId());
final int requestKey = disk.getId().hashCode();
@@ -589,8 +604,13 @@
private PendingIntent buildInitPendingIntent(VolumeInfo vol) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageWizardInit");
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction("com.android.tv.settings.action.NEW_STORAGE");
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageWizardInit");
+ }
intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
final int requestKey = vol.getId().hashCode();
@@ -600,13 +620,23 @@
private PendingIntent buildUnmountPendingIntent(VolumeInfo vol) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageUnmountReceiver");
- intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction("com.android.tv.settings.action.UNMOUNT_STORAGE");
+ intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
- final int requestKey = vol.getId().hashCode();
- return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent,
- PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT);
+ final int requestKey = vol.getId().hashCode();
+ return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageUnmountReceiver");
+ intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
+
+ final int requestKey = vol.getId().hashCode();
+ return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT);
+ }
}
private PendingIntent buildBrowsePendingIntent(VolumeInfo vol) {
@@ -619,17 +649,22 @@
private PendingIntent buildVolumeSettingsPendingIntent(VolumeInfo vol) {
final Intent intent = new Intent();
- switch (vol.getType()) {
- case VolumeInfo.TYPE_PRIVATE:
- intent.setClassName("com.android.settings",
- "com.android.settings.Settings$PrivateVolumeSettingsActivity");
- break;
- case VolumeInfo.TYPE_PUBLIC:
- intent.setClassName("com.android.settings",
- "com.android.settings.Settings$PublicVolumeSettingsActivity");
- break;
- default:
- return null;
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction(Settings.ACTION_INTERNAL_STORAGE_SETTINGS);
+ } else {
+ switch (vol.getType()) {
+ case VolumeInfo.TYPE_PRIVATE:
+ intent.setClassName("com.android.settings",
+ "com.android.settings.Settings$PrivateVolumeSettingsActivity");
+ break;
+ case VolumeInfo.TYPE_PUBLIC:
+ intent.setClassName("com.android.settings",
+ "com.android.settings.Settings$PublicVolumeSettingsActivity");
+ break;
+ default:
+ return null;
+ }
}
intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId());
@@ -648,6 +683,7 @@
}
private PendingIntent buildForgetPendingIntent(VolumeRecord rec) {
+ // Not used on TV
final Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.Settings$PrivateVolumeForgetActivity");
@@ -660,8 +696,13 @@
private PendingIntent buildWizardMigratePendingIntent(MoveInfo move) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageWizardMigrateProgress");
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction("com.android.tv.settings.action.MIGRATE_STORAGE");
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageWizardMigrateProgress");
+ }
intent.putExtra(PackageManager.EXTRA_MOVE_ID, move.moveId);
final VolumeInfo vol = mStorageManager.findVolumeByQualifiedUuid(move.volumeUuid);
@@ -674,8 +715,13 @@
private PendingIntent buildWizardMovePendingIntent(MoveInfo move) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageWizardMoveProgress");
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction("com.android.tv.settings.action.MOVE_APP");
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageWizardMoveProgress");
+ }
intent.putExtra(PackageManager.EXTRA_MOVE_ID, move.moveId);
return PendingIntent.getActivityAsUser(mContext, move.moveId, intent,
@@ -684,12 +730,22 @@
private PendingIntent buildWizardReadyPendingIntent(DiskInfo disk) {
final Intent intent = new Intent();
- intent.setClassName("com.android.settings",
- "com.android.settings.deviceinfo.StorageWizardReady");
+ if (isTv()) {
+ intent.setPackage("com.android.tv.settings");
+ intent.setAction(Settings.ACTION_INTERNAL_STORAGE_SETTINGS);
+ } else {
+ intent.setClassName("com.android.settings",
+ "com.android.settings.deviceinfo.StorageWizardReady");
+ }
intent.putExtra(DiskInfo.EXTRA_DISK_ID, disk.getId());
final int requestKey = disk.getId().hashCode();
return PendingIntent.getActivityAsUser(mContext, requestKey, intent,
PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT);
}
+
+ private boolean isTv() {
+ PackageManager packageManager = mContext.getPackageManager();
+ return packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index 5911766..5df3beb 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -18,6 +18,7 @@
import android.app.NotificationManager;
import android.content.Context;
+import android.content.pm.PackageManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
@@ -32,6 +33,7 @@
@VisibleForTesting
static void createAll(Context context) {
+
final NotificationManager nm = context.getSystemService(NotificationManager.class);
nm.createNotificationChannels(Arrays.asList(
new NotificationChannel(
@@ -49,7 +51,9 @@
new NotificationChannel(
STORAGE,
R.string.notification_channel_storage,
- NotificationManager.IMPORTANCE_LOW)
+ isTv(context)
+ ? NotificationManager.IMPORTANCE_DEFAULT
+ : NotificationManager.IMPORTANCE_LOW)
));
}
@@ -57,4 +61,9 @@
public void start() {
createAll(mContext);
}
+
+ private static boolean isTv(Context context) {
+ PackageManager packageManager = context.getPackageManager();
+ return packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/SettableWakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/SettableWakeLock.java
new file mode 100644
index 0000000..f2ed55f3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/SettableWakeLock.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.util.wakelock;
+
+import android.os.Handler;
+import android.os.PowerManager;
+
+import com.android.internal.util.Preconditions;
+
+public class SettableWakeLock {
+
+ private final WakeLock mInner;
+
+ private boolean mAcquired;
+
+ public SettableWakeLock(WakeLock inner) {
+ Preconditions.checkNotNull(inner, "inner wakelock required");
+
+ mInner = inner;
+ }
+
+ public synchronized boolean isAcquired() {
+ return mAcquired;
+ }
+
+ public synchronized void setAcquired(boolean acquired) {
+ if (mAcquired != acquired) {
+ if (acquired) {
+ mInner.acquire();
+ } else {
+ mInner.release();
+ }
+ mAcquired = acquired;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
new file mode 100644
index 0000000..eea3de3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.util.wakelock;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.systemui.plugins.doze.DozeProvider;
+
+/** WakeLock wrapper for testability */
+public interface WakeLock extends DozeProvider.WakeLock {
+
+ static WakeLock createPartial(Context context, String tag) {
+ return wrap(createPartialInner(context, tag));
+ }
+
+ @VisibleForTesting
+ static PowerManager.WakeLock createPartialInner(Context context, String tag) {
+ return context.getSystemService(PowerManager.class)
+ .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tag);
+ }
+
+ static WakeLock wrap(final PowerManager.WakeLock inner) {
+ return new WakeLock() {
+ /** @see PowerManager.WakeLock#acquire() */
+ public void acquire() {
+ inner.acquire();
+ }
+
+ /** @see PowerManager.WakeLock#release() */
+ public void release() {
+ inner.release();
+ }
+
+ /** @see PowerManager.WakeLock#wrap(Runnable) */
+ public Runnable wrap(Runnable runnable) {
+ return inner.wrap(runnable);
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index 41b75ff..612a54a 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -36,6 +36,7 @@
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.REQUEST_NETWORK_SCORES" />
<uses-permission android:name="android.permission.CONTROL_VPN" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
<uses-library android:name="android.test.runner" />
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
new file mode 100644
index 0000000..5477afa8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.doze;
+
+import static org.junit.Assert.assertFalse;
+
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DozeConfigurationTest extends SysuiTestCase {
+
+ private AmbientDisplayConfiguration mDozeConfig;
+
+ @Before
+ public void setup() {
+ mDozeConfig = new AmbientDisplayConfiguration(mContext);
+ }
+
+ @Test
+ public void alwaysOn_offByDefault() throws Exception {
+ if (!mDozeConfig.alwaysOnAvailable()) {
+ return;
+ }
+
+ mContext.getSettingsProvider().acquireOverridesBuilder(this)
+ .addSetting("secure", Settings.Secure.DOZE_ALWAYS_ON, null)
+ .build();
+
+ assertFalse(mDozeConfig.alwaysOnEnabled(UserHandle.USER_CURRENT));
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index 0cccbe1..ba39671 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -28,8 +28,9 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -38,12 +39,12 @@
import static org.mockito.Mockito.when;
import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Display;
import com.android.systemui.SysUIRunner;
import com.android.systemui.UiThreadTest;
-import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.Before;
import org.junit.Test;
@@ -58,17 +59,17 @@
private DozeServiceFake mServiceFake;
private WakeLockFake mWakeLockFake;
- private DozeParameters mParamsMock;
+ private AmbientDisplayConfiguration mConfigMock;
private DozeMachine.Part mPartMock;
@Before
public void setUp() {
mServiceFake = new DozeServiceFake();
mWakeLockFake = new WakeLockFake();
- mParamsMock = mock(DozeParameters.class);
+ mConfigMock = mock(AmbientDisplayConfiguration.class);
mPartMock = mock(DozeMachine.Part.class);
- mMachine = new DozeMachine(mServiceFake, mParamsMock, mWakeLockFake);
+ mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake);
mMachine.setParts(new DozeMachine.Part[]{mPartMock});
}
@@ -82,7 +83,7 @@
@Test
public void testInitialize_goesToDoze() {
- when(mParamsMock.getAlwaysOn()).thenReturn(false);
+ when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(false);
mMachine.requestState(INITIALIZED);
@@ -92,7 +93,7 @@
@Test
public void testInitialize_goesToAod() {
- when(mParamsMock.getAlwaysOn()).thenReturn(true);
+ when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
mMachine.requestState(INITIALIZED);
@@ -102,7 +103,7 @@
@Test
public void testPulseDone_goesToDoze() {
- when(mParamsMock.getAlwaysOn()).thenReturn(false);
+ when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(false);
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE_REQUEST_PULSE);
mMachine.requestState(DOZE_PULSING);
@@ -115,7 +116,7 @@
@Test
public void testPulseDone_goesToAoD() {
- when(mParamsMock.getAlwaysOn()).thenReturn(true);
+ when(mConfigMock.alwaysOnEnabled(anyInt())).thenReturn(true);
mMachine.requestState(INITIALIZED);
mMachine.requestState(DOZE_REQUEST_PULSE);
mMachine.requestState(DOZE_PULSING);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index 7335af3..4250962 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -16,19 +16,26 @@
package com.android.systemui.statusbar;
+import static android.support.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import android.app.Instrumentation;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Looper;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.internal.runner.junit4.statement.UiThreadStatement;
import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
import android.view.ViewGroup;
@@ -36,8 +43,10 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
+import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -54,9 +63,13 @@
private KeyguardIndicationTextView mDisclosure = mock(KeyguardIndicationTextView.class);
private KeyguardIndicationController mController;
+ private WakeLockFake mWakeLock;
+ private Instrumentation mInstrumentation;
@Before
public void setUp() throws Exception {
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+
mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager);
mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class));
mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class));
@@ -65,13 +78,15 @@
when(mIndicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure))
.thenReturn(mDisclosure);
+
+ mWakeLock = new WakeLockFake();
}
private void createController() {
if (Looper.myLooper() == null) {
Looper.prepare();
}
- mController = new KeyguardIndicationController(mContext, mIndicationArea, null);
+ mController = new KeyguardIndicationController(mContext, mIndicationArea, null, mWakeLock);
}
@Test
@@ -139,4 +154,46 @@
verify(mDisclosure).setVisibility(View.GONE);
verifyNoMoreInteractions(mDisclosure);
}
+
+ @Test
+ public void transientIndication_holdsWakeLock_whenDozing() {
+ createController();
+
+ mController.setDozing(true);
+ mController.showTransientIndication("Test");
+
+ assertTrue(mWakeLock.isHeld());
+ }
+
+ @Test
+ public void transientIndication_releasesWakeLock_afterHiding() {
+ createController();
+
+ mController.setDozing(true);
+ mController.showTransientIndication("Test");
+ mController.hideTransientIndication();
+
+ assertFalse(mWakeLock.isHeld());
+ }
+
+ @Ignore("Flaky")
+ @Test
+ public void transientIndication_releasesWakeLock_afterHidingDelayed() throws Throwable {
+ mInstrumentation.runOnMainSync(() -> {
+ createController();
+
+ mController.setDozing(true);
+ mController.showTransientIndication("Test");
+ mController.hideTransientIndicationDelayed(0);
+ });
+ mInstrumentation.waitForIdleSync();
+
+ boolean[] held = new boolean[2];
+ mInstrumentation.runOnMainSync(() -> {
+ held[0] = mWakeLock.isHeld();
+ held[1] = true;
+ });
+ assertFalse("wake lock still held", held[0]);
+ assertTrue("held was not written yet", held[1]);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
new file mode 100644
index 0000000..08ac9a9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.app.Notification;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.service.notification.StatusBarNotification;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationDataTest extends SysuiTestCase {
+
+ private static final int UID_NORMAL = 123;
+ private static final int UID_ALLOW_DURING_SETUP = 456;
+
+ private final StatusBarNotification mMockStatusBarNotification =
+ mock(StatusBarNotification.class);
+
+ private final IPackageManager mMockPackageManager = mock(IPackageManager.class);
+
+ @Before
+ public void setUp() throws Exception {
+ when(mMockStatusBarNotification.getUid()).thenReturn(UID_NORMAL);
+
+ when(mMockPackageManager.checkUidPermission(
+ eq(Manifest.permission.NOTIFICATION_DURING_SETUP),
+ eq(UID_NORMAL)))
+ .thenReturn(PackageManager.PERMISSION_DENIED);
+ when(mMockPackageManager.checkUidPermission(
+ eq(Manifest.permission.NOTIFICATION_DURING_SETUP),
+ eq(UID_ALLOW_DURING_SETUP)))
+ .thenReturn(PackageManager.PERMISSION_GRANTED);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testShowNotificationEvenIfUnprovisioned_FalseIfNoExtra() {
+ initStatusBarNotification(false);
+ when(mMockStatusBarNotification.getUid()).thenReturn(UID_ALLOW_DURING_SETUP);
+
+ assertFalse(
+ NotificationData.showNotificationEvenIfUnprovisioned(
+ mMockPackageManager,
+ mMockStatusBarNotification));
+ }
+
+ @Test
+ @UiThreadTest
+ public void testShowNotificationEvenIfUnprovisioned_FalseIfNoPermission() {
+ initStatusBarNotification(true);
+
+ assertFalse(
+ NotificationData.showNotificationEvenIfUnprovisioned(
+ mMockPackageManager,
+ mMockStatusBarNotification));
+ }
+
+ @Test
+ @UiThreadTest
+ public void testShowNotificationEvenIfUnprovisioned_TrueIfHasPermissionAndExtra() {
+ initStatusBarNotification(true);
+ when(mMockStatusBarNotification.getUid()).thenReturn(UID_ALLOW_DURING_SETUP);
+
+ assertTrue(
+ NotificationData.showNotificationEvenIfUnprovisioned(
+ mMockPackageManager,
+ mMockStatusBarNotification));
+ }
+
+ private void initStatusBarNotification(boolean allowDuringSetup) {
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup);
+ Notification notification = new Notification.Builder(mContext, "test")
+ .addExtras(bundle)
+ .build();
+ when(mMockStatusBarNotification.getNotification()).thenReturn(notification);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index 96dbdb3..c91b269 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -42,12 +42,6 @@
}
public ExpandableNotificationRow createRow() {
- LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
- mContext.LAYOUT_INFLATER_SERVICE);
- ExpandableNotificationRow row = (ExpandableNotificationRow) inflater.inflate(
- R.layout.status_bar_notification_row,
- null, false);
- row.setGroupManager(mGroupManager);
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
@@ -59,6 +53,16 @@
.setContentText("Text")
.setPublicVersion(publicVersion)
.build();
+ return createRow(notification);
+ }
+
+ public ExpandableNotificationRow createRow(Notification notification) {
+ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ mContext.LAYOUT_INFLATER_SERVICE);
+ ExpandableNotificationRow row = (ExpandableNotificationRow) inflater.inflate(
+ R.layout.status_bar_notification_row,
+ null, false);
+ row.setGroupManager(mGroupManager);
UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
StatusBarNotification sbn = new StatusBarNotification("com.android.systemui",
"com.android.systemui", mId++, null, 1000,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java
new file mode 100644
index 0000000..0ec9c10
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationinflaterTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import static com.android.systemui.statusbar.notification.NotificationInflater.FLAG_REINFLATE_ALL;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.Notification;
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.NotificationTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationinflaterTest {
+
+ private Context mContext;
+ private NotificationInflater mNotificationInflater;
+ private Notification.Builder mBuilder;
+
+ @Before
+ @UiThreadTest
+ public void setUp() {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mBuilder = new Notification.Builder(mContext).setSmallIcon(
+ R.drawable.ic_person)
+ .setContentTitle("Title")
+ .setContentText("Text");
+ ExpandableNotificationRow row = new NotificationTestHelper(mContext).createRow(
+ mBuilder.build());
+ mNotificationInflater = new NotificationInflater(row);
+ }
+
+ @Test
+ public void testIncreasedHeadsUpBeingUsed() {
+ mNotificationInflater.setUsesIncreasedHeadsUpHeight(true);
+ Notification.Builder builder = spy(mBuilder);
+ mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
+ verify(builder).createHeadsUpContentView(true);
+ }
+
+ @Test
+ public void testIncreasedHeightBeingUsed() {
+ mNotificationInflater.setUsesIncreasedHeight(true);
+ Notification.Builder builder = spy(mBuilder);
+ mNotificationInflater.inflateNotificationViews(FLAG_REINFLATE_ALL, builder, mContext);
+ verify(builder).createContentView(true);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index 9f56da7..f48af75 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -23,14 +23,14 @@
import static org.mockito.Mockito.when;
import android.metrics.LogMaker;
-import android.metrics.MetricsReader;
-import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts;
import android.support.test.runner.AndroidJUnit4;
import android.util.DisplayMetrics;
+import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ActivatableNotificationView;
@@ -39,13 +39,9 @@
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-// TODO(gpitsch): We have seen some flakes in these tests, needs some investigation.
-// Q: How is mMetricsReader being used by the tested code?
-// A: StatusBar uses MetricsLogger to write to the event log, then read back by MetricsReader
@SmallTest
@RunWith(AndroidJUnit4.class)
public class StatusBarTest extends SysuiTestCase {
@@ -55,8 +51,8 @@
KeyguardIndicationController mKeyguardIndicationController;
NotificationStackScrollLayout mStackScroller;
StatusBar mStatusBar;
+ FakeMetricsLogger mMetricsLogger;
- private MetricsReader mMetricsReader;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@Before
@@ -65,8 +61,10 @@
mUnlockMethodCache = mock(UnlockMethodCache.class);
mKeyguardIndicationController = mock(KeyguardIndicationController.class);
mStackScroller = mock(NotificationStackScrollLayout.class);
+ mMetricsLogger = new FakeMetricsLogger();
mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
mKeyguardIndicationController, mStackScroller);
+ mStatusBar.setMetricsLogger(mMetricsLogger);
doAnswer(invocation -> {
OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
@@ -81,15 +79,6 @@
}).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any());
when(mStackScroller.getActivatedChild()).thenReturn(null);
-
- mMetricsReader = new MetricsReader();
- mMetricsReader.checkpoint(); // clear out old logs
- try {
- // pause so that no new events arrive in the rest of this millisecond.
- Thread.sleep(2);
- } catch (InterruptedException e) {
- // pass
- }
}
@Test
@@ -116,8 +105,6 @@
mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false);
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void lockscreenStateMetrics_notShowing() {
// uninteresting state, except that fingerprint must be non-zero
@@ -127,17 +114,15 @@
when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false);
when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false);
when(mUnlockMethodCache.isMethodSecure()).thenReturn(false);
-
mStatusBar.onKeyguardViewManagerStatesUpdated();
- MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.LOCKSCREEN)
.setType(MetricsEvent.TYPE_CLOSE)
.setSubtype(0));
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void lockscreenStateMetrics_notShowing_secure() {
// uninteresting state, except that fingerprint must be non-zero
@@ -150,14 +135,13 @@
mStatusBar.onKeyguardViewManagerStatesUpdated();
- MetricsAsserts.assertHasLog("missing hidden secure lockscreen log", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing hidden secure lockscreen log",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.LOCKSCREEN)
.setType(MetricsEvent.TYPE_CLOSE)
.setSubtype(1));
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void lockscreenStateMetrics_isShowing() {
// uninteresting state, except that fingerprint must be non-zero
@@ -170,14 +154,13 @@
mStatusBar.onKeyguardViewManagerStatesUpdated();
- MetricsAsserts.assertHasLog("missing insecure lockscreen showing", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing insecure lockscreen showing",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.LOCKSCREEN)
.setType(MetricsEvent.TYPE_OPEN)
.setSubtype(0));
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void lockscreenStateMetrics_isShowing_secure() {
// uninteresting state, except that fingerprint must be non-zero
@@ -190,14 +173,13 @@
mStatusBar.onKeyguardViewManagerStatesUpdated();
- MetricsAsserts.assertHasLog("missing secure lockscreen showing log", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing secure lockscreen showing log",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.LOCKSCREEN)
.setType(MetricsEvent.TYPE_OPEN)
.setSubtype(1));
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void lockscreenStateMetrics_isShowingBouncer() {
// uninteresting state, except that fingerprint must be non-zero
@@ -210,20 +192,20 @@
mStatusBar.onKeyguardViewManagerStatesUpdated();
- MetricsAsserts.assertHasLog("missing bouncer log", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing bouncer log",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.BOUNCER)
.setType(MetricsEvent.TYPE_OPEN)
.setSubtype(1));
}
- @Ignore("flaky test")
- @FlakyTest
@Test
public void onActivatedMetrics() {
ActivatableNotificationView view = mock(ActivatableNotificationView.class);
mStatusBar.onActivated(view);
- MetricsAsserts.assertHasLog("missing lockscreen note tap log", mMetricsReader,
+ MetricsAsserts.assertHasLog("missing lockscreen note tap log",
+ mMetricsLogger.getLogs(),
new LogMaker(MetricsEvent.ACTION_LS_NOTE)
.setType(MetricsEvent.TYPE_ACTION));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
new file mode 100644
index 0000000..f6692eb
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.util.wakelock;
+
+import static junit.framework.TestCase.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SettableWakeLockTest {
+
+ private WakeLockFake mFake;
+ private SettableWakeLock mSettable;
+
+ @Before
+ public void setup() {
+ mFake = new WakeLockFake();
+ mSettable = new SettableWakeLock(mFake);
+ }
+
+ @Test
+ public void setAcquire_true_acquires() throws Exception {
+ mSettable.setAcquired(true);
+ assertTrue(mFake.isHeld());
+ assertEquals(mFake.isHeld(), mSettable.isAcquired());
+ }
+
+ @Test
+ public void setAcquire_false_releases() throws Exception {
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(false);
+ assertFalse(mFake.isHeld());
+ assertEquals(mFake.isHeld(), mSettable.isAcquired());
+ }
+
+ @Test
+ public void setAcquire_true_multipleTimes_isIdempotent() throws Exception {
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(false);
+ assertFalse(mFake.isHeld());
+ assertEquals(mFake.isHeld(), mSettable.isAcquired());
+ }
+
+ @Test
+ public void setAcquire_false_multipleTimes_idempotent() throws Exception {
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(false);
+ mSettable.setAcquired(false);
+ assertFalse(mFake.isHeld());
+ assertEquals(mFake.isHeld(), mSettable.isAcquired());
+ }
+
+ @Test
+ public void setAcquire_false_multipleTimes_idempotent_again() throws Exception {
+ mSettable.setAcquired(true);
+ mSettable.setAcquired(false);
+ mSettable.setAcquired(false);
+ mSettable.setAcquired(true);
+ assertTrue(mFake.isHeld());
+ assertEquals(mFake.isHeld(), mSettable.isAcquired());
+ }
+
+
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/WakeLockFake.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java
similarity index 82%
rename from packages/SystemUI/tests/src/com/android/systemui/doze/WakeLockFake.java
rename to packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java
index 7c04fe2..4cefb99 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/WakeLockFake.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockFake.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -11,21 +11,17 @@
* 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.
+ * limitations under the License
*/
-package com.android.systemui.doze;
+package com.android.systemui.util.wakelock;
import com.android.internal.util.Preconditions;
-public class WakeLockFake extends DozeFactory.WakeLock {
+public class WakeLockFake implements WakeLock {
private int mAcquired = 0;
- public WakeLockFake() {
- super(null);
- }
-
@Override
public void acquire() {
mAcquired++;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
new file mode 100644
index 0000000..5394499
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.util.wakelock;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class WakeLockTest {
+
+ WakeLock mWakeLock;
+ PowerManager.WakeLock mInner;
+
+ @Before
+ public void setUp() {
+ Context context = InstrumentationRegistry.getContext();
+
+ mInner = WakeLock.createPartialInner(context, WakeLockTest.class.getName());
+ mWakeLock = WakeLock.wrap(mInner);
+ }
+
+ @After
+ public void tearDown() {
+ mInner.setReferenceCounted(false);
+ mInner.release();
+ }
+
+ @Test
+ public void createPartialInner_notHeldYet() {
+ assertFalse(mInner.isHeld());
+ }
+
+ @Test
+ public void wakeLock_acquire() {
+ mWakeLock.acquire();
+ assertTrue(mInner.isHeld());
+ }
+
+ @Test
+ public void wakeLock_release() {
+ mWakeLock.acquire();
+ mWakeLock.release();
+ assertFalse(mInner.isHeld());
+ }
+
+ @Test
+ public void wakeLock_refCounted() {
+ mWakeLock.acquire();
+ mWakeLock.acquire();
+ mWakeLock.release();
+ assertTrue(mInner.isHeld());
+ }
+
+ @Test
+ public void wakeLock_wrap() {
+ boolean[] ran = new boolean[1];
+
+ Runnable wrapped = mWakeLock.wrap(() -> {
+ ran[0] = true;
+ });
+
+ assertTrue(mInner.isHeld());
+ assertFalse(ran[0]);
+
+ wrapped.run();
+
+ assertTrue(ran[0]);
+ assertFalse(mInner.isHeld());
+ }
+}
\ No newline at end of file
diff --git a/proto/Android.mk b/proto/Android.mk
index a13a780..1c03d16 100644
--- a/proto/Android.mk
+++ b/proto/Android.mk
@@ -14,3 +14,20 @@
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/jarjar-rules.txt
include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Host-side version of framework-protos
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := host-framework-protos
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_SRC_FILES:= $(call all-proto-files-under, src)
+
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_STATIC_JAVA_LIBRARIES := host-libprotobuf-java-nano
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/jarjar-rules.txt
+
+include $(BUILD_HOST_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index c45de0d..25481ce 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -44,6 +44,18 @@
// The view or control was updated.
TYPE_UPDATE = 6;
+
+ // Type for APP_TRANSITION event: The transition started a new activity for which it's process
+ // wasn't running.
+ TYPE_TRANSITION_COLD_LAUNCH = 7;
+
+ // Type for APP_TRANSITION event: The transition started a new activity for which it's process
+ // was already running.
+ TYPE_TRANSITION_WARM_LAUNCH = 8;
+
+ // Type for APP_TRANSITION event: The transition brought an already existing activity to the
+ // front.
+ TYPE_TRANSITION_HOT_LAUNCH = 9;
}
// Known visual elements: views or controls.
@@ -3175,7 +3187,7 @@
DIALOG_SUPPORT_SYSTEM_INFORMATION = 756;
// These values should never appear in log outputs - they are reserved for
- // internal Tron use.
+ // internal platform metrics use.
RESERVED_FOR_LOGBUILDER_CATEGORY = 757;
RESERVED_FOR_LOGBUILDER_TYPE = 758;
RESERVED_FOR_LOGBUILDER_SUBTYPE = 759;
@@ -3282,7 +3294,7 @@
DEFAULT_AUTOFILL_PICKER = 792;
// These values should never appear in log outputs - they are reserved for
- // internal Tron use.
+ // internal platform metrics use.
NOTIFICATION_SINCE_CREATE_MILLIS = 793;
NOTIFICATION_SINCE_VISIBLE_MILLIS = 794;
NOTIFICATION_SINCE_UPDATE_MILLIS = 795;
@@ -3297,7 +3309,7 @@
QS_NFC = 800;
// These values should never appear in log outputs - they are reserved for
- // internal Tron use.
+ // internal platform metrics use.
RESERVED_FOR_LOGBUILDER_BUCKET = 801;
RESERVED_FOR_LOGBUILDER_VALUE = 802;
RESERVED_FOR_LOGBUILDER_COUNTER = 803;
@@ -3540,6 +3552,55 @@
// OS: N
ACTION_GET_CONTACT = 864;
+ // This values should never appear in log outputs - it is reserved for
+ // internal platform metrics use.
+ RESERVED_FOR_LOGBUILDER_PID = 865;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Available devices
+ ACTION_SETTINGS_BLUETOOTH_PAIR = 866;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Paired devices
+ ACTION_SETTINGS_BLUETOOTH_CONNECT = 867;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Connected device
+ ACTION_SETTINGS_BLUETOOTH_DISCONNECT = 868;
+
+ // ACTION: Settings > Connected devices > Bluetooth -> Error dialog
+ ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR = 869;
+
+ // ACTION: Settings > Connected devices > Bluetooth master switch Toggle
+ ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE = 870;
+
+ // The name of the activity being launched in an app transition event.
+ APP_TRANSITION_ACTIVITY_NAME = 871;
+
+ // ACTION: Settings > App detail > Uninstall
+ ACTION_SETTINGS_UNINSTALL_APP = 872;
+
+ // ACTION: Settings > App detail > Uninstall Device admin app
+ ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN = 873;
+
+ // ACTION: Settings > App detail > Disable app
+ ACTION_SETTINGS_DISABLE_APP = 874;
+
+ // ACTION: Settings > App detail > Enable app
+ ACTION_SETTINGS_ENABLE_APP = 875;
+
+ // ACTION: Settings > App detail > Clear data
+ ACTION_SETTINGS_CLEAR_APP_DATA = 876;
+
+ // ACTION: Settings > App detail > Clear cache
+ ACTION_SETTINGS_CLEAR_APP_CACHE = 877;
+
+ // ACTION: Clicking on any search result in Settings.
+ ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT = 878;
+
+ // FIELD: Settings inline search result name
+ FIELD_SETTINGS_SEARCH_INLINE_RESULT_NAME = 879;
+
+ // FIELD: Settings inline search result value
+ FIELD_SETTINGS_SEARCH_INLINE_RESULT_VALUE = 880;
+
// ---- End O Constants, all O constants go above this line ----
// Add new aosp constants above this line.
diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk
index 447a47d..4040db3 100644
--- a/rs/jni/Android.mk
+++ b/rs/jni/Android.mk
@@ -5,6 +5,7 @@
android_renderscript_RenderScript.cpp
LOCAL_SHARED_LIBRARIES := \
+ libandroid \
libandroid_runtime \
libandroidfw \
libnativehelper \
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index 2300da3..b4630ef 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -34,6 +34,8 @@
#include "android_runtime/android_view_Surface.h"
#include "android_runtime/android_util_AssetManager.h"
#include "android/graphics/GraphicsJNI.h"
+#include "android/native_window.h"
+#include "android/native_window_jni.h"
#include <rsEnv.h>
#include <rsApiStubs.h>
@@ -1264,10 +1266,10 @@
ALOGD("nAllocationGetSurface, con(%p), a(%p)", (RsContext)con, (RsAllocation)a);
}
- IGraphicBufferProducer *v = (IGraphicBufferProducer *)rsAllocationGetSurface((RsContext)con,
- (RsAllocation)a);
- sp<IGraphicBufferProducer> bp = v;
- v->decStrong(nullptr);
+ ANativeWindow *anw = (ANativeWindow *)rsAllocationGetSurface((RsContext)con, (RsAllocation)a);
+
+ sp<Surface> surface(static_cast<Surface*>(anw));
+ sp<IGraphicBufferProducer> bp = surface->getIGraphicBufferProducer();
jobject o = android_view_Surface_createFromIGraphicBufferProducer(_env, bp);
return o;
@@ -1281,13 +1283,12 @@
(RsAllocation)alloc, (Surface *)sur);
}
- sp<Surface> s;
+ ANativeWindow *anw = nullptr;
if (sur != 0) {
- s = android_view_Surface_getSurface(_env, sur);
+ anw = ANativeWindow_fromSurface(_env, sur);
}
- rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc,
- static_cast<ANativeWindow *>(s.get()));
+ rsAllocationSetSurface((RsContext)con, (RsAllocation)alloc, anw);
}
static void
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 44afe1d..b56035f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -50,6 +50,7 @@
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.display.DisplayManager;
+import android.hardware.fingerprint.IFingerprintService;
import android.hardware.input.InputManager;
import android.net.Uri;
import android.os.Binder;
@@ -69,7 +70,6 @@
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.provider.Settings;
-import android.hardware.fingerprint.IFingerprintService;
import android.provider.SettingsStringUtil.ComponentNameSet;
import android.provider.SettingsStringUtil.SettingStringHelper;
import android.text.TextUtils;
@@ -82,6 +82,7 @@
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MagnificationSpec;
+import android.view.View;
import android.view.WindowInfo;
import android.view.WindowManager;
import android.view.WindowManagerInternal;
@@ -97,8 +98,11 @@
import android.view.accessibility.IAccessibilityManagerClient;
import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
+import com.android.internal.os.HandlerCaller;
import com.android.internal.os.SomeArgs;
+import com.android.internal.util.IntPair;
import com.android.server.LocalServices;
import com.android.server.policy.AccessibilityShortcutController;
import com.android.server.statusbar.StatusBarManagerInternal;
@@ -118,6 +122,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
/**
* This class is instantiated by the system as a system level service and can be
@@ -149,6 +154,9 @@
private static final String GET_WINDOW_TOKEN = "getWindowToken";
+ private static final String SET_PIP_ACTION_REPLACEMENT =
+ "setPictureInPictureActionReplacingConnection";
+
private static final ComponentName sFakeAccessibilityServiceComponentName =
new ComponentName("foo.bar", "FakeService");
@@ -158,8 +166,6 @@
private static final int OWN_PROCESS_ID = android.os.Process.myPid();
- private static final int WINDOW_ID_UNKNOWN = -1;
-
// Each service has an ID. Also provide one for magnification gesture handling
public static final int MAGNIFICATION_GESTURE_HANDLER_ID = 0;
@@ -220,6 +226,8 @@
private final SparseArray<AccessibilityConnectionWrapper> mGlobalInteractionConnections =
new SparseArray<>();
+ private AccessibilityConnectionWrapper mPictureInPictureActionReplacingConnection;
+
private final SparseArray<IBinder> mGlobalWindowTokens = new SparseArray<>();
private final SparseArray<UserState> mUserStates = new SparseArray<>();
@@ -429,7 +437,7 @@
}
@Override
- public int addClient(IAccessibilityManagerClient client, int userId) {
+ public long addClient(IAccessibilityManagerClient client, int userId) {
synchronized (mLock) {
// We treat calls from a profile as if made by its parent as profiles
// share the accessibility state of the parent. The call below
@@ -445,7 +453,8 @@
if (DEBUG) {
Slog.i(LOG_TAG, "Added global client for pid:" + Binder.getCallingPid());
}
- return userState.getClientState();
+ return IntPair.of(
+ userState.getClientState(), userState.mLastSentRelevantEventTypes);
} else {
userState.mUserClients.register(client);
// If this client is not for the current user we do not
@@ -455,7 +464,9 @@
Slog.i(LOG_TAG, "Added user client for pid:" + Binder.getCallingPid()
+ " and userId:" + mCurrentUserId);
}
- return (resolvedUserId == mCurrentUserId) ? userState.getClientState() : 0;
+ return IntPair.of(
+ (resolvedUserId == mCurrentUserId) ? userState.getClientState() : 0,
+ userState.mLastSentRelevantEventTypes);
}
}
}
@@ -465,6 +476,25 @@
boolean dispatchEvent = false;
synchronized (mLock) {
+ if (event.getWindowId() ==
+ AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID) {
+ // The replacer window isn't shown to services. Move its events into the pip.
+ AccessibilityWindowInfo pip = mSecurityPolicy.getPictureInPictureWindow();
+ if (pip != null) {
+ int pipId = pip.getId();
+ event.setWindowId(pipId);
+ event.setSealed(true);
+ AccessibilityNodeInfo info = event.getSource();
+ info.setSealed(false);
+ event.setSealed(false);
+ if (info != null) {
+ info.setSourceNodeId(info.getSourceNodeId(), pipId);
+ event.setSource(info);
+ info.recycle();
+ }
+ }
+ }
+
// We treat calls from a profile as if made by its parent as profiles
// share the accessibility state of the parent. The call below
// performs the current profile parent resolution..
@@ -694,6 +724,27 @@
}
@Override
+ public void setPictureInPictureActionReplacingConnection(
+ IAccessibilityInteractionConnection connection) throws RemoteException {
+ mSecurityPolicy.enforceCallingPermission(Manifest.permission.MODIFY_ACCESSIBILITY_DATA,
+ SET_PIP_ACTION_REPLACEMENT);
+ synchronized (mLock) {
+ if (mPictureInPictureActionReplacingConnection != null) {
+ mPictureInPictureActionReplacingConnection.unlinkToDeath();
+ mPictureInPictureActionReplacingConnection = null;
+ }
+ if (connection != null) {
+ AccessibilityConnectionWrapper wrapper = new AccessibilityConnectionWrapper(
+ AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID,
+ connection, UserHandle.USER_ALL);
+ mPictureInPictureActionReplacingConnection = wrapper;
+ wrapper.linkToDeath();
+ }
+ mSecurityPolicy.notifyWindowsChanged();
+ }
+ }
+
+ @Override
public void registerUiTestAutomationService(IBinder owner,
IAccessibilityServiceClient serviceClient,
AccessibilityServiceInfo accessibilityServiceInfo,
@@ -1278,6 +1329,35 @@
scheduleNotifyClientsOfServicesStateChange(userState);
}
+ private void updateRelevantEventsLocked(UserState userState) {
+ int relevantEventTypes = AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK;
+ for (Service service : userState.mBoundServices) {
+ relevantEventTypes |= service.mEventTypes;
+ }
+ int finalRelevantEventTypes = relevantEventTypes;
+
+ if (userState.mLastSentRelevantEventTypes != finalRelevantEventTypes) {
+ userState.mLastSentRelevantEventTypes = finalRelevantEventTypes;
+ mMainHandler.obtainMessage(MainHandler.MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS,
+ userState.mUserId, finalRelevantEventTypes);
+ mMainHandler.post(() -> {
+ broadcastToClients(userState, (client) -> {
+ try {
+ client.setRelevantEventTypes(finalRelevantEventTypes);
+ } catch (RemoteException re) {
+ /* ignore */
+ }
+ });
+ });
+ }
+ }
+
+ private void broadcastToClients(
+ UserState userState, Consumer<IAccessibilityManagerClient> clientAction) {
+ mGlobalClients.broadcast(clientAction);
+ userState.mUserClients.broadcast(clientAction);
+ }
+
/**
* Determines if given event can be dispatched to a service based on the package of the
* event source. Specifically, a service is notified if it is interested in events from the
@@ -1293,9 +1373,10 @@
return false;
}
- if (event.getWindowId() != WINDOW_ID_UNKNOWN && !event.isImportantForAccessibility()
- && (service.mFetchFlags
- & AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) == 0) {
+ if ((event.getWindowId() != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID)
+ && !event.isImportantForAccessibility()
+ && (service.mFetchFlags & AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS)
+ == 0) {
return false;
}
@@ -1587,6 +1668,7 @@
scheduleUpdateFingerprintGestureHandling(userState);
scheduleUpdateInputFilter(userState);
scheduleUpdateClientsIfNeededLocked(userState);
+ updateRelevantEventsLocked(userState);
}
private void updateAccessibilityFocusBehaviorLocked(UserState userState) {
@@ -2035,6 +2117,7 @@
}
}
+ @GuardedBy("mLock")
private MagnificationSpec getCompatibleMagnificationSpecLocked(int windowId) {
IBinder windowToken = mGlobalWindowTokens.get(windowId);
if (windowToken == null) {
@@ -2234,6 +2317,7 @@
public static final int MSG_CLEAR_ACCESSIBILITY_FOCUS = 9;
public static final int MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS = 10;
public static final int MSG_UPDATE_FINGERPRINT = 11;
+ public static final int MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS = 12;
public MainHandler(Looper looper) {
super(looper);
@@ -2304,6 +2388,22 @@
case MSG_UPDATE_FINGERPRINT: {
updateFingerprintGestureHandling((UserState) msg.obj);
} break;
+
+ case MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS: {
+ final int userId = msg.arg1;
+ final int relevantEventTypes = msg.arg2;
+ final UserState userState;
+ synchronized (mLock) {
+ userState = getUserStateLocked(userId);
+ }
+ broadcastToClients(userState, (client) -> {
+ try {
+ client.setRelevantEventTypes(relevantEventTypes);
+ } catch (RemoteException re) {
+ /* ignore */
+ }
+ });
+ } break;
}
}
@@ -2333,19 +2433,13 @@
private void sendStateToClients(int clientState,
RemoteCallbackList<IAccessibilityManagerClient> clients) {
- try {
- final int userClientCount = clients.beginBroadcast();
- for (int i = 0; i < userClientCount; i++) {
- IAccessibilityManagerClient client = clients.getBroadcastItem(i);
- try {
- client.setState(clientState);
- } catch (RemoteException re) {
- /* ignore */
- }
+ clients.broadcast((client) -> {
+ try {
+ client.setState(clientState);
+ } catch (RemoteException re) {
+ /* ignore */
}
- } finally {
- clients.finishBroadcast();
- }
+ });
}
private void notifyClientsOfServicesStateChange(
@@ -2846,6 +2940,7 @@
final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
Region partialInteractiveRegion = Region.obtain();
+ MagnificationSpec spec;
synchronized (mLock) {
mUsesAccessibilityCache = true;
if (!isCalledForCurrentUserLocked()) {
@@ -2867,10 +2962,12 @@
partialInteractiveRegion.recycle();
partialInteractiveRegion = null;
}
+ spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
}
final int interrogatingPid = Binder.getCallingPid();
+ callback = replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
+ interrogatingPid, interrogatingTid);
final long identityToken = Binder.clearCallingIdentity();
- MagnificationSpec spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
try {
connection.findAccessibilityNodeInfosByViewId(accessibilityNodeId, viewIdResName,
partialInteractiveRegion, interactionId, callback, mFetchFlags,
@@ -2898,6 +2995,7 @@
final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
Region partialInteractiveRegion = Region.obtain();
+ MagnificationSpec spec;
synchronized (mLock) {
mUsesAccessibilityCache = true;
if (!isCalledForCurrentUserLocked()) {
@@ -2919,10 +3017,12 @@
partialInteractiveRegion.recycle();
partialInteractiveRegion = null;
}
+ spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
}
final int interrogatingPid = Binder.getCallingPid();
+ callback = replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
+ interrogatingPid, interrogatingTid);
final long identityToken = Binder.clearCallingIdentity();
- MagnificationSpec spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
try {
connection.findAccessibilityNodeInfosByText(accessibilityNodeId, text,
partialInteractiveRegion, interactionId, callback, mFetchFlags,
@@ -2950,6 +3050,7 @@
final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
Region partialInteractiveRegion = Region.obtain();
+ MagnificationSpec spec;
synchronized (mLock) {
mUsesAccessibilityCache = true;
if (!isCalledForCurrentUserLocked()) {
@@ -2971,10 +3072,12 @@
partialInteractiveRegion.recycle();
partialInteractiveRegion = null;
}
+ spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
}
final int interrogatingPid = Binder.getCallingPid();
+ callback = replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
+ interrogatingPid, interrogatingTid);
final long identityToken = Binder.clearCallingIdentity();
- MagnificationSpec spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
try {
connection.findAccessibilityNodeInfoByAccessibilityId(accessibilityNodeId,
partialInteractiveRegion, interactionId, callback, mFetchFlags | flags,
@@ -3002,6 +3105,7 @@
final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
Region partialInteractiveRegion = Region.obtain();
+ MagnificationSpec spec;
synchronized (mLock) {
if (!isCalledForCurrentUserLocked()) {
return false;
@@ -3023,10 +3127,12 @@
partialInteractiveRegion.recycle();
partialInteractiveRegion = null;
}
+ spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
}
final int interrogatingPid = Binder.getCallingPid();
+ callback = replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
+ interrogatingPid, interrogatingTid);
final long identityToken = Binder.clearCallingIdentity();
- MagnificationSpec spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
try {
connection.findFocus(accessibilityNodeId, focusType, partialInteractiveRegion,
interactionId, callback, mFetchFlags, interrogatingPid, interrogatingTid,
@@ -3054,6 +3160,7 @@
final int resolvedWindowId;
IAccessibilityInteractionConnection connection = null;
Region partialInteractiveRegion = Region.obtain();
+ MagnificationSpec spec;
synchronized (mLock) {
if (!isCalledForCurrentUserLocked()) {
return false;
@@ -3074,10 +3181,12 @@
partialInteractiveRegion.recycle();
partialInteractiveRegion = null;
}
+ spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
}
final int interrogatingPid = Binder.getCallingPid();
+ callback = replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
+ interrogatingPid, interrogatingTid);
final long identityToken = Binder.clearCallingIdentity();
- MagnificationSpec spec = getCompatibleMagnificationSpecLocked(resolvedWindowId);
try {
connection.focusSearch(accessibilityNodeId, direction, partialInteractiveRegion,
interactionId, callback, mFetchFlags, interrogatingPid, interrogatingTid,
@@ -3149,6 +3258,18 @@
if (connection == null) {
return false;
}
+ AccessibilityWindowInfo windowInfo =
+ mSecurityPolicy.findWindowById(resolvedWindowId);
+ if ((windowInfo != null) && windowInfo.inPictureInPicture()) {
+ boolean isA11yFocusAction =
+ (action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS)
+ || (action ==
+ AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+ if ((mPictureInPictureActionReplacingConnection != null)
+ && !isA11yFocusAction) {
+ connection = mPictureInPictureActionReplacingConnection.mConnection;
+ }
+ }
}
}
final int interrogatingPid = Binder.getCallingPid();
@@ -3562,7 +3683,7 @@
if (mSecurityPolicy.canRetrieveWindowContentLocked(this)) {
event.setConnectionId(mId);
} else {
- event.setSource(null);
+ event.setSource((View) null);
}
event.setSealed(true);
}
@@ -3790,17 +3911,17 @@
}
private int resolveAccessibilityWindowIdLocked(int accessibilityWindowId) {
- if (accessibilityWindowId == AccessibilityNodeInfo.ACTIVE_WINDOW_ID) {
+ if (accessibilityWindowId == AccessibilityWindowInfo.ACTIVE_WINDOW_ID) {
return mSecurityPolicy.getActiveWindowId();
}
return accessibilityWindowId;
}
private int resolveAccessibilityWindowIdForFindFocusLocked(int windowId, int focusType) {
- if (windowId == AccessibilityNodeInfo.ACTIVE_WINDOW_ID) {
+ if (windowId == AccessibilityWindowInfo.ACTIVE_WINDOW_ID) {
return mSecurityPolicy.mActiveWindowId;
}
- if (windowId == AccessibilityNodeInfo.ANY_WINDOW_ID) {
+ if (windowId == AccessibilityWindowInfo.ANY_WINDOW_ID) {
if (focusType == AccessibilityNodeInfo.FOCUS_INPUT) {
return mSecurityPolicy.mFocusedWindowId;
} else if (focusType == AccessibilityNodeInfo.FOCUS_ACCESSIBILITY) {
@@ -3810,6 +3931,20 @@
return windowId;
}
+ private IAccessibilityInteractionConnectionCallback replaceCallbackIfNeeded(
+ IAccessibilityInteractionConnectionCallback originalCallback,
+ int resolvedWindowId, int interactionId, int interrogatingPid,
+ long interrogatingTid) {
+ AccessibilityWindowInfo windowInfo = mSecurityPolicy.findWindowById(resolvedWindowId);
+ if ((windowInfo == null) || !windowInfo.inPictureInPicture()
+ || (mPictureInPictureActionReplacingConnection == null)) {
+ return originalCallback;
+ }
+ return new ActionReplacingCallback(originalCallback,
+ mPictureInPictureActionReplacingConnection.mConnection, interactionId,
+ interrogatingPid, interrogatingTid);
+ }
+
private final class InvocationHandler extends Handler {
public static final int MSG_ON_GESTURE = 1;
public static final int MSG_CLEAR_ACCESSIBILITY_CACHE = 2;
@@ -3960,6 +4095,7 @@
reportedWindow.setBoundsInScreen(window.boundsInScreen);
reportedWindow.setTitle(window.title);
reportedWindow.setAnchorId(window.accessibilityIdOfAnchor);
+ reportedWindow.setPictureInPicture(window.inPictureInPicture);
final int parentId = findWindowIdLocked(window.parentToken);
if (parentId >= 0) {
@@ -4157,7 +4293,9 @@
| AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED
| AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY;
+ // In Z order
public List<AccessibilityWindowInfo> mWindows;
+ public SparseArray<AccessibilityWindowInfo> mWindowsById = new SparseArray<>();
public int mActiveWindowId = INVALID_WINDOW_ID;
public int mFocusedWindowId = INVALID_WINDOW_ID;
@@ -4217,6 +4355,7 @@
for (int i = oldWindowCount - 1; i >= 0; i--) {
mWindows.remove(i).recycle();
}
+ mWindowsById.clear();
mFocusedWindowId = INVALID_WINDOW_ID;
if (!mTouchInteractionInProgress) {
@@ -4245,6 +4384,7 @@
}
}
mWindows.add(window);
+ mWindowsById.put(windowId, window);
}
if (mTouchInteractionInProgress && activeWindowGone) {
@@ -4306,7 +4446,7 @@
public void updateEventSourceLocked(AccessibilityEvent event) {
if ((event.getEventType() & RETRIEVAL_ALLOWING_EVENT_TYPES) == 0) {
- event.setSource(null);
+ event.setSource((View) null);
}
}
@@ -4446,7 +4586,7 @@
}
}
- private void notifyWindowsChanged() {
+ public void notifyWindowsChanged() {
if (mWindowsForAccessibilityCallback == null) {
return;
}
@@ -4560,11 +4700,15 @@
}
private AccessibilityWindowInfo findWindowById(int windowId) {
+ return mWindowsById.get(windowId);
+ }
+
+ private AccessibilityWindowInfo getPictureInPictureWindow() {
if (mWindows != null) {
final int windowCount = mWindows.size();
for (int i = 0; i < windowCount; i++) {
AccessibilityWindowInfo window = mWindows.get(i);
- if (window.getId() == windowId) {
+ if (window.inPictureInPicture()) {
return window;
}
}
@@ -4613,6 +4757,8 @@
public final CopyOnWriteArrayList<Service> mBoundServices =
new CopyOnWriteArrayList<>();
+ public int mLastSentRelevantEventTypes = AccessibilityEvent.TYPES_ALL_MASK;
+
public final Map<ComponentName, Service> mComponentNameToServiceMap =
new HashMap<>();
diff --git a/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
new file mode 100644
index 0000000..0e30fb2
--- /dev/null
+++ b/services/accessibility/java/com/android/server/accessibility/ActionReplacingCallback.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+import android.os.Binder;
+import android.os.RemoteException;
+import android.util.Slog;
+import android.view.MagnificationSpec;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import android.view.accessibility.IAccessibilityInteractionConnection;
+import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * If we are stripping and/or replacing the actions from a window, we need to intercept the
+ * nodes heading back to the service and swap out the actions.
+ */
+public class ActionReplacingCallback extends IAccessibilityInteractionConnectionCallback.Stub {
+ private static final boolean DEBUG = false;
+ private static final String LOG_TAG = "ActionReplacingCallback";
+
+ private final IAccessibilityInteractionConnectionCallback mServiceCallback;
+ private final IAccessibilityInteractionConnection mConnectionWithReplacementActions;
+ private final int mInteractionId;
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ List<AccessibilityNodeInfo> mNodesWithReplacementActions;
+
+ @GuardedBy("mLock")
+ List<AccessibilityNodeInfo> mNodesFromOriginalWindow;
+
+ @GuardedBy("mLock")
+ AccessibilityNodeInfo mNodeFromOriginalWindow;
+
+ // Keep track of whether or not we've been called back for a single node
+ @GuardedBy("mLock")
+ boolean mSingleNodeCallbackHappened;
+
+ // Keep track of whether or not we've been called back for multiple node
+ @GuardedBy("mLock")
+ boolean mMultiNodeCallbackHappened;
+
+ // We shouldn't get any more callbacks after we've called back the original service, but
+ // keep track to make sure we catch such strange things
+ @GuardedBy("mLock")
+ boolean mDone;
+
+ public ActionReplacingCallback(IAccessibilityInteractionConnectionCallback serviceCallback,
+ IAccessibilityInteractionConnection connectionWithReplacementActions,
+ int interactionId, int interrogatingPid, long interrogatingTid) {
+ mServiceCallback = serviceCallback;
+ mConnectionWithReplacementActions = connectionWithReplacementActions;
+ mInteractionId = interactionId;
+
+ // Request the root node of the replacing window
+ final long identityToken = Binder.clearCallingIdentity();
+ try {
+ mConnectionWithReplacementActions.findAccessibilityNodeInfoByAccessibilityId(
+ AccessibilityNodeInfo.ROOT_NODE_ID, null, interactionId + 1, this, 0,
+ interrogatingPid, interrogatingTid, null, null);
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Error calling findAccessibilityNodeInfoByAccessibilityId()");
+ }
+ // Pretend we already got a (null) list of replacement nodes
+ mMultiNodeCallbackHappened = true;
+ } finally {
+ Binder.restoreCallingIdentity(identityToken);
+ }
+ }
+
+ @Override
+ public void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, int interactionId) {
+ boolean readyForCallback;
+ synchronized(mLock) {
+ if (interactionId == mInteractionId) {
+ mNodeFromOriginalWindow = info;
+ } else {
+ Slog.e(LOG_TAG, "Callback with unexpected interactionId");
+ throw new RuntimeException("Callback with unexpected interactionId"); // Remove
+ }
+
+ mSingleNodeCallbackHappened = true;
+ readyForCallback = mMultiNodeCallbackHappened;
+ }
+ if (readyForCallback) {
+ replaceInfoActionsAndCallService();
+ }
+ }
+
+ @Override
+ public void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos,
+ int interactionId) {
+ boolean callbackForSingleNode;
+ boolean callbackForMultipleNodes;
+ synchronized(mLock) {
+ if (interactionId == mInteractionId) {
+ mNodesFromOriginalWindow = infos;
+ } else if (interactionId == mInteractionId + 1) {
+ mNodesWithReplacementActions = infos;
+ } else {
+ Slog.e(LOG_TAG, "Callback with unexpected interactionId");
+ throw new RuntimeException("Callback with unexpected interactionId"); // Remove
+ }
+ callbackForSingleNode = mSingleNodeCallbackHappened;
+ callbackForMultipleNodes = mMultiNodeCallbackHappened;
+ mMultiNodeCallbackHappened = true;
+ }
+ if (callbackForSingleNode) {
+ replaceInfoActionsAndCallService();
+ }
+ if (callbackForMultipleNodes) {
+ replaceInfosActionsAndCallService();
+ }
+ }
+
+ @Override
+ public void setPerformAccessibilityActionResult(boolean succeeded, int interactionId)
+ throws RemoteException {
+ // There's no reason to use this class when performing actions. Do something reasonable.
+ mServiceCallback.setPerformAccessibilityActionResult(succeeded, interactionId);
+ }
+
+ private void replaceInfoActionsAndCallService() {
+ final AccessibilityNodeInfo nodeToReturn;
+ synchronized (mLock) {
+ if (mDone) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Extra callback");
+ }
+ throw new RuntimeException("Extra callback"); // Replace with return before submit
+ }
+ if (mNodeFromOriginalWindow != null) {
+ replaceActionsOnInfoLocked(mNodeFromOriginalWindow);
+ }
+ recycleReplaceActionNodesLocked();
+ nodeToReturn = mNodeFromOriginalWindow;
+ mDone = true;
+ }
+ try {
+ mServiceCallback.setFindAccessibilityNodeInfoResult(nodeToReturn, mInteractionId);
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfoResult");
+ }
+ }
+ }
+
+ private void replaceInfosActionsAndCallService() {
+ final List<AccessibilityNodeInfo> nodesToReturn;
+ synchronized (mLock) {
+ if (mDone) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Extra callback");
+ }
+ throw new RuntimeException("Extra callback"); // Replace with return before submit
+ }
+ if (mNodesFromOriginalWindow != null) {
+ for (int i = 0; i < mNodesFromOriginalWindow.size(); i++) {
+ replaceActionsOnInfoLocked(mNodesFromOriginalWindow.get(i));
+ }
+ }
+ recycleReplaceActionNodesLocked();
+ nodesToReturn = mNodesFromOriginalWindow;
+ mDone = true;
+ }
+ try {
+ mServiceCallback.setFindAccessibilityNodeInfosResult(nodesToReturn, mInteractionId);
+ } catch (RemoteException re) {
+ if (DEBUG) {
+ Slog.e(LOG_TAG, "Failed to setFindAccessibilityNodeInfosResult");
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void replaceActionsOnInfoLocked(AccessibilityNodeInfo info) {
+ info.removeAllActions();
+ // We currently only replace actions for the root node
+ if ((info.getSourceNodeId() == AccessibilityNodeInfo.ROOT_NODE_ID)
+ && mNodesWithReplacementActions != null) {
+ // This list should always contain a single node with the root ID
+ for (int i = 0; i < mNodesWithReplacementActions.size(); i++) {
+ AccessibilityNodeInfo nodeWithReplacementActions =
+ mNodesWithReplacementActions.get(i);
+ if (nodeWithReplacementActions.getSourceNodeId()
+ == AccessibilityNodeInfo.ROOT_NODE_ID) {
+ List<AccessibilityAction> actions = nodeWithReplacementActions.getActionList();
+ if (actions != null) {
+ for (int j = 0; j < actions.size(); j++) {
+ info.addAction(actions.get(j));
+ }
+ // The PIP needs to be able to take accessibility focus
+ info.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
+ info.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+ }
+ }
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void recycleReplaceActionNodesLocked() {
+ for (int i = mNodesWithReplacementActions.size() - 1; i >= 0; i--) {
+ AccessibilityNodeInfo nodeWithReplacementAction = mNodesWithReplacementActions.get(i);
+ nodeWithReplacementAction.recycle();
+ }
+ mNodesWithReplacementActions = null;
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
similarity index 83%
rename from services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
rename to services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index e943c4c..a372f95 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -17,7 +17,7 @@
package com.android.server.autofill;
import static android.Manifest.permission.MANAGE_AUTO_FILL;
-import static android.content.Context.AUTO_FILL_MANAGER_SERVICE;
+import static android.content.Context.AUTOFILL_MANAGER_SERVICE;
import static com.android.server.autofill.Helper.VERBOSE;
import android.Manifest;
@@ -45,8 +45,8 @@
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import android.view.autofill.IAutoFillManager;
import android.view.autofill.IAutoFillManagerClient;
@@ -64,16 +64,16 @@
import java.util.List;
/**
- * Entry point service for auto-fill management.
+ * Entry point service for autofill management.
*
* <p>This service provides the {@link IAutoFillManager} implementation and keeps a list of
- * {@link AutoFillManagerServiceImpl} per user; the real work is done by
- * {@link AutoFillManagerServiceImpl} itself.
+ * {@link AutofillManagerServiceImpl} per user; the real work is done by
+ * {@link AutofillManagerServiceImpl} itself.
*/
// TODO(b/33197203): Handle removing of packages
-public final class AutoFillManagerService extends SystemService {
+public final class AutofillManagerService extends SystemService {
- private static final String TAG = "AutoFillManagerService";
+ private static final String TAG = "AutofillManagerService";
static final String RECEIVER_BUNDLE_EXTRA_SESSIONS = "sessions";
@@ -83,7 +83,7 @@
private final Object mLock = new Object();
/**
- * Cache of {@link AutoFillManagerServiceImpl} per user id.
+ * Cache of {@link AutofillManagerServiceImpl} per user id.
* <p>
* It has to be mapped by user id because the same current user could have simultaneous sessions
* associated to different user profiles (for example, in a multi-window environment or when
@@ -91,13 +91,13 @@
* <p>
* Entries on this cache are added on demand and removed when:
* <ol>
- * <li>An auto-fill service app is removed.
- * <li>The {@link android.provider.Settings.Secure#AUTO_FILL_SERVICE} for an user change.\
+ * <li>An autofill service app is removed.
+ * <li>The {@link android.provider.Settings.Secure#AUTOFILL_SERVICE} for an user change.
* </ol>
*/
// TODO(b/33197203): Update the above comment
@GuardedBy("mLock")
- private SparseArray<AutoFillManagerServiceImpl> mServicesCache = new SparseArray<>();
+ private SparseArray<AutofillManagerServiceImpl> mServicesCache = new SparseArray<>();
// TODO(b/33197203): set a different max (or disable it) on low-memory devices.
private final LocalLog mRequestsHistory = new LocalLog(20);
@@ -115,7 +115,7 @@
}
};
- public AutoFillManagerService(Context context) {
+ public AutofillManagerService(Context context) {
super(context);
mContext = context;
mUi = new AutoFillUI(mContext);
@@ -128,7 +128,7 @@
@Override
public void onStart() {
- publishBinderService(AUTO_FILL_MANAGER_SERVICE, new AutoFillManagerServiceStub());
+ publishBinderService(AUTOFILL_MANAGER_SERVICE, new AutoFillManagerServiceStub());
}
@Override
@@ -157,10 +157,11 @@
*
* @return service instance.
*/
- @NonNull AutoFillManagerServiceImpl getServiceForUserLocked(int userId) {
- AutoFillManagerServiceImpl service = mServicesCache.get(userId);
+ @NonNull
+ AutofillManagerServiceImpl getServiceForUserLocked(int userId) {
+ AutofillManagerServiceImpl service = mServicesCache.get(userId);
if (service == null) {
- service = new AutoFillManagerServiceImpl(mContext, mLock,
+ service = new AutofillManagerServiceImpl(mContext, mLock,
mRequestsHistory, userId, mUi);
mServicesCache.put(userId, service);
}
@@ -174,7 +175,7 @@
final IBinder activityToken = getTopActivityForUser();
if (activityToken != null) {
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = mServicesCache.get(userId);
+ final AutofillManagerServiceImpl service = mServicesCache.get(userId);
if (service == null) {
Log.w(TAG, "handleSaveForUser(): no cached service for userId " + userId);
return;
@@ -258,7 +259,7 @@
* Removes a cached service for a given user.
*/
private void removeCachedServiceLocked(int userId) {
- final AutoFillManagerServiceImpl service = mServicesCache.get(userId);
+ final AutofillManagerServiceImpl service = mServicesCache.get(userId);
if (service != null) {
mServicesCache.delete(userId);
service.destroyLocked();
@@ -269,7 +270,7 @@
* Updates a cached service for a given user.
*/
private void updateCachedServiceLocked(int userId) {
- AutoFillManagerServiceImpl service = mServicesCache.get(userId);
+ AutofillManagerServiceImpl service = mServicesCache.get(userId);
if (service != null) {
service.updateLocked();
}
@@ -299,7 +300,7 @@
@Override
public void setAuthenticationResult(Bundle data, IBinder activityToken, int userId) {
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
+ final AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
service.setAuthenticationResultLocked(data, activityToken);
}
}
@@ -307,29 +308,29 @@
@Override
public void setHasCallback(IBinder activityToken, int userId, boolean hasIt) {
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
+ final AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
service.setHasCallback(activityToken, hasIt);
}
}
@Override
public void startSession(IBinder activityToken, IBinder windowToken, IBinder appCallback,
- AutoFillId autoFillId, Rect bounds, AutoFillValue value, int userId,
+ AutofillId autofillId, Rect bounds, AutofillValue value, int userId,
boolean hasCallback) {
// TODO(b/33197203): make sure it's called by resumed / focused activity
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = getServiceForUserLocked(userId);
+ final AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
service.startSessionLocked(activityToken, windowToken, appCallback,
- autoFillId, bounds, value, hasCallback);
+ autofillId, bounds, value, hasCallback);
}
}
@Override
- public void updateSession(IBinder activityToken, AutoFillId id, Rect bounds,
- AutoFillValue value, int flags, int userId) {
+ public void updateSession(IBinder activityToken, AutofillId id, Rect bounds,
+ AutofillValue value, int flags, int userId) {
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = mServicesCache.get(
+ final AutofillManagerServiceImpl service = mServicesCache.get(
UserHandle.getCallingUserId());
if (service != null) {
service.updateSessionLocked(activityToken, id, bounds, value, flags);
@@ -340,7 +341,7 @@
@Override
public void finishSession(IBinder activityToken, int userId) {
synchronized (mLock) {
- final AutoFillManagerServiceImpl service = mServicesCache.get(
+ final AutofillManagerServiceImpl service = mServicesCache.get(
UserHandle.getCallingUserId());
if (service != null) {
service.finishSessionLocked(activityToken);
@@ -349,6 +350,17 @@
}
@Override
+ public void cancelSession(IBinder activityToken, int userId) {
+ synchronized (mLock) {
+ final AutofillManagerServiceImpl service = mServicesCache.get(
+ UserHandle.getCallingUserId());
+ if (service != null) {
+ service.cancelSessionLocked(activityToken);
+ }
+ }
+ }
+
+ @Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (mContext.checkCallingPermission(
Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) {
@@ -366,7 +378,7 @@
pw.println(size);
for (int i = 0; i < size; i++) {
pw.print("\nService at index "); pw.println(i);
- final AutoFillManagerServiceImpl impl = mServicesCache.valueAt(i);
+ final AutofillManagerServiceImpl impl = mServicesCache.valueAt(i);
impl.dumpLocked(" ", pw);
}
}
@@ -379,7 +391,7 @@
@Override
public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
- (new AutoFillManagerServiceShellCommand(AutoFillManagerService.this)).exec(
+ (new AutofillManagerServiceShellCommand(AutofillManagerService.this)).exec(
this, in, out, err, args, callback, resultReceiver);
}
}
@@ -389,7 +401,7 @@
super(handler);
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(
- Settings.Secure.AUTO_FILL_SERVICE), false, this, UserHandle.USER_ALL);
+ Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL);
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
similarity index 87%
rename from services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
rename to services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index aa0840c..b6c60d0 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -16,13 +16,13 @@
package com.android.server.autofill;
-import static android.service.autofill.AutoFillService.EXTRA_ACTIVITY_TOKEN;
+import static android.service.autofill.AutofillService.EXTRA_ACTIVITY_TOKEN;
import static android.service.voice.VoiceInteractionSession.KEY_RECEIVER_EXTRAS;
import static android.service.voice.VoiceInteractionSession.KEY_STRUCTURE;
-import static android.view.autofill.AutoFillManager.FLAG_FOCUS_GAINED;
-import static android.view.autofill.AutoFillManager.FLAG_FOCUS_LOST;
-import static android.view.autofill.AutoFillManager.FLAG_START_SESSION;
-import static android.view.autofill.AutoFillManager.FLAG_VALUE_CHANGED;
+import static android.view.autofill.AutofillManager.FLAG_VIEW_ENTERED;
+import static android.view.autofill.AutofillManager.FLAG_VIEW_EXITED;
+import static android.view.autofill.AutofillManager.FLAG_START_SESSION;
+import static android.view.autofill.AutofillManager.FLAG_VALUE_CHANGED;
import static com.android.server.autofill.Helper.DEBUG;
import static com.android.server.autofill.Helper.VERBOSE;
@@ -51,8 +51,8 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.provider.Settings;
-import android.service.autofill.AutoFillService;
-import android.service.autofill.AutoFillServiceInfo;
+import android.service.autofill.AutofillService;
+import android.service.autofill.AutofillServiceInfo;
import android.service.autofill.Dataset;
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
@@ -62,10 +62,9 @@
import android.util.LocalLog;
import android.util.PrintWriterPrinter;
import android.util.Slog;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillManager;
-import android.view.autofill.AutoFillValue;
-
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillManager;
+import android.view.autofill.AutofillValue;
import android.view.autofill.IAutoFillManagerClient;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.HandlerCaller;
@@ -78,13 +77,13 @@
import java.util.Map.Entry;
/**
- * Bridge between the {@code system_server}'s {@link AutoFillManagerService} and the
+ * Bridge between the {@code system_server}'s {@link AutofillManagerService} and the
* app's {@link IAutoFillService} implementation.
*
*/
-final class AutoFillManagerServiceImpl {
+final class AutofillManagerServiceImpl {
- private static final String TAG = "AutoFillManagerServiceImpl";
+ private static final String TAG = "AutofillManagerServiceImpl";
private static final int MSG_SERVICE_SAVE = 1;
@@ -94,7 +93,7 @@
private final AutoFillUI mUi;
private RemoteCallbackList<IAutoFillManagerClient> mClients;
- private AutoFillServiceInfo mInfo;
+ private AutofillServiceInfo mInfo;
private final LocalLog mRequestsHistory;
@@ -114,7 +113,7 @@
/**
* Cache of pending {@link Session}s, keyed by {@code activityToken}.
*
- * <p>They're kept until the {@link AutoFillService} finished handling a request, an error
+ * <p>They're kept until the {@link AutofillService} finished handling a request, an error
* occurs, or the session times out.
*/
// TODO(b/33197203): need to make sure service is bound while callback is pending and/or
@@ -174,7 +173,7 @@
}
};
- AutoFillManagerServiceImpl(Context context, Object lock, LocalLog requestsHistory,
+ AutofillManagerServiceImpl(Context context, Object lock, LocalLog requestsHistory,
int userId, AutoFillUI ui) {
mContext = context;
mLock = lock;
@@ -205,21 +204,21 @@
ComponentName serviceComponent = null;
ServiceInfo serviceInfo = null;
final String componentName = Settings.Secure.getStringForUser(
- mContext.getContentResolver(), Settings.Secure.AUTO_FILL_SERVICE, mUserId);
+ mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
if (!TextUtils.isEmpty(componentName)) {
try {
serviceComponent = ComponentName.unflattenFromString(componentName);
serviceInfo = AppGlobals.getPackageManager().getServiceInfo(serviceComponent,
0, mUserId);
} catch (RuntimeException | RemoteException e) {
- Slog.e(TAG, "Bad auto-fill service name " + componentName + ": " + e);
+ Slog.e(TAG, "Bad autofill service name " + componentName + ": " + e);
return;
}
}
try {
final boolean hadService = hasService();
if (serviceInfo != null) {
- mInfo = new AutoFillServiceInfo(mContext.getPackageManager(),
+ mInfo = new AutofillServiceInfo(mContext.getPackageManager(),
serviceComponent, mUserId);
} else {
mInfo = null;
@@ -236,12 +235,12 @@
sendStateToClients();
}
} catch (PackageManager.NameNotFoundException e) {
- Slog.e(TAG, "Bad auto-fill service name " + componentName + ": " + e);
+ Slog.e(TAG, "Bad autofill service name " + componentName + ": " + e);
}
}
/**
- * Used by {@link AutoFillManagerServiceShellCommand} to request save for the current top app.
+ * Used by {@link AutofillManagerServiceShellCommand} to request save for the current top app.
*/
void requestSaveForUserLocked(IBinder activityToken) {
if (!hasService()) {
@@ -285,14 +284,15 @@
}
void startSessionLocked(IBinder activityToken, IBinder windowToken, IBinder appCallbackToken,
- AutoFillId autoFillId, Rect bounds, AutoFillValue value, boolean hasCallback) {
+ AutofillId autofillId, Rect bounds, AutofillValue value, boolean hasCallback) {
if (!hasService()) {
return;
}
final String historyItem = "s=" + mInfo.getServiceInfo().packageName
+ " u=" + mUserId + " a=" + activityToken
- + " i=" + autoFillId + " b=" + bounds + " hc=" + hasCallback;
+
+ + " i=" + autofillId + " b=" + bounds + " hc=" + hasCallback;
mRequestsHistory.log(historyItem);
// TODO(b/33197203): Handle partitioning
@@ -304,7 +304,7 @@
final Session newSession = createSessionByTokenLocked(activityToken,
windowToken, appCallbackToken, hasCallback);
- newSession.updateLocked(autoFillId, bounds, value, FLAG_START_SESSION);
+ newSession.updateLocked(autofillId, bounds, value, FLAG_START_SESSION);
}
void finishSessionLocked(IBinder activityToken) {
@@ -321,6 +321,20 @@
session.showSaveLocked();
}
+ void cancelSessionLocked(IBinder activityToken) {
+ if (!hasService()) {
+ return;
+ }
+
+ final Session session = mSessions.get(activityToken);
+ if (session == null) {
+ Slog.w(TAG, "cancelSessionLocked(): no session for " + activityToken);
+ return;
+ }
+
+ session.destroyLocked();
+ }
+
private Session createSessionByTokenLocked(IBinder activityToken, IBinder windowToken,
IBinder appCallbackToken, boolean hasCallback) {
final Session newSession = new Session(mContext, activityToken,
@@ -340,9 +354,9 @@
receiverExtras.putBinder(EXTRA_ACTIVITY_TOKEN, activityToken);
final long identity = Binder.clearCallingIdentity();
try {
- if (!ActivityManager.getService().requestAutoFillData(mAssistReceiver,
+ if (!ActivityManager.getService().requestAutofillData(mAssistReceiver,
receiverExtras, activityToken)) {
- Slog.w(TAG, "failed to request auto-fill data for " + activityToken);
+ Slog.w(TAG, "failed to request autofill data for " + activityToken);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -353,8 +367,8 @@
return newSession;
}
- void updateSessionLocked(IBinder activityToken, AutoFillId autoFillId, Rect bounds,
- AutoFillValue value, int flags) {
+ void updateSessionLocked(IBinder activityToken, AutofillId autofillId, Rect bounds,
+ AutofillValue value, int flags) {
// TODO(b/33197203): add MetricsLogger call
final Session session = mSessions.get(activityToken);
if (session == null) {
@@ -364,7 +378,7 @@
return;
}
- session.updateLocked(autoFillId, bounds, value, flags);
+ session.updateLocked(autofillId, bounds, value, flags);
}
private void handleSessionSave(IBinder activityToken) {
@@ -457,13 +471,13 @@
@Override
public String toString() {
- return "AutoFillManagerServiceImpl: [userId=" + mUserId
+ return "AutofillManagerServiceImpl: [userId=" + mUserId
+ ", component=" + (mInfo != null
? mInfo.getServiceInfo().getComponentName() : null) + "]";
}
/**
- * State for a given view with a AutoFillId.
+ * State for a given view with a AutofillId.
*
* <p>This class holds state about a view and calls its listener when the fill UI is ready to
* be displayed for the view.
@@ -474,10 +488,10 @@
* Called when the fill UI is ready to be shown for this view.
*/
void onFillReady(ViewState viewState, FillResponse fillResponse, Rect bounds,
- AutoFillId focusedId, @Nullable AutoFillValue value);
+ AutofillId focusedId, @Nullable AutofillValue value);
}
- final AutoFillId mId;
+ final AutofillId mId;
private final Listener mListener;
// TODO(b/33197203): would not need a reference to response and session if it was an inner
// class of Session...
@@ -486,12 +500,12 @@
FillResponse mResponse;
Intent mAuthIntent;
- private AutoFillValue mAutoFillValue;
+ private AutofillValue mAutofillValue;
private Rect mBounds;
private boolean mValueUpdated;
- ViewState(Session session, AutoFillId id, Listener listener) {
+ ViewState(Session session, AutofillId id, Listener listener) {
mSession = session;
mId = id;
mListener = listener;
@@ -520,9 +534,9 @@
// TODO(b/33197203): need to refactor / rename / document this method to make it clear that
// it can change the value and update the UI; similarly, should replace code that
// directly sets mAutoFilLValue to use encapsulation.
- void update(@Nullable AutoFillValue autoFillValue, @Nullable Rect bounds) {
- if (autoFillValue != null) {
- mAutoFillValue = autoFillValue;
+ void update(@Nullable AutofillValue autofillValue, @Nullable Rect bounds) {
+ if (autofillValue != null) {
+ mAutofillValue = autofillValue;
}
if (bounds != null) {
mBounds = bounds;
@@ -533,25 +547,25 @@
/**
* Calls {@link
- * Listener#onFillReady(ViewState, FillResponse, Rect, AutoFillId, AutoFillValue)} if the
+ * Listener#onFillReady(ViewState, FillResponse, Rect, AutofillId, AutofillValue)} if the
* fill UI is ready to be displayed (i.e. when response and bounds are set).
*/
void maybeCallOnFillReady() {
if (mResponse != null && (mResponse.getAuthentication() != null
|| mResponse.getDatasets() != null) && mBounds != null) {
- mListener.onFillReady(this, mResponse, mBounds, mId, mAutoFillValue);
+ mListener.onFillReady(this, mResponse, mBounds, mId, mAutofillValue);
}
}
@Override
public String toString() {
- return "ViewState: [id=" + mId + ", value=" + mAutoFillValue + ", bounds=" + mBounds
+ return "ViewState: [id=" + mId + ", value=" + mAutofillValue + ", bounds=" + mBounds
+ ", updated = " + mValueUpdated + "]";
}
void dump(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("id:" ); pw.println(mId);
- pw.print(prefix); pw.print("value:" ); pw.println(mAutoFillValue);
+ pw.print(prefix); pw.print("value:" ); pw.println(mAutofillValue);
pw.print(prefix); pw.print("updated:" ); pw.println(mValueUpdated);
pw.print(prefix); pw.print("bounds:" ); pw.println(mBounds);
pw.print(prefix); pw.print("authIntent:" ); pw.println(mAuthIntent);
@@ -564,7 +578,7 @@
* <p>This class manages the multiple {@link ViewState}s for each view it has, and keeps track
* of the current {@link ViewState} to display the appropriate UI.
*
- * <p>Although the auto-fill requests and callbacks are stateless from the service's point of
+ * <p>Although the autofill requests and callbacks are stateless from the service's point of
* view, we need to keep state in the framework side for cases such as authentication. For
* example, when service return a {@link FillResponse} that contains all the fields needed
* to fill the activity but it requires authentication first, that response need to be held
@@ -580,7 +594,7 @@
private final IBinder mWindowToken;
@GuardedBy("mLock")
- private final Map<AutoFillId, ViewState> mViewStates = new ArrayMap<>();
+ private final Map<AutofillId, ViewState> mViewStates = new ArrayMap<>();
@GuardedBy("mLock")
@Nullable
@@ -604,13 +618,13 @@
/**
* Assist structure sent by the app; it will be updated (sanitized, change values for save)
- * before sent to {@link AutoFillService}.
+ * before sent to {@link AutofillService}.
*/
@GuardedBy("mLock")
private AssistStructure mStructure;
/**
- * Whether the client has an {@link android.view.autofill.AutoFillManager.AutofillCallback}.
+ * Whether the client has an {@link android.view.autofill.AutofillManager.AutofillCallback}.
*/
private boolean mHasCallback;
@@ -692,11 +706,11 @@
try {
final String autoFillService = Settings.Secure.getStringForUser(
mContext.getContentResolver(),
- Settings.Secure.AUTO_FILL_SERVICE, mUserId);
+ Settings.Secure.AUTOFILL_SERVICE, mUserId);
if (mInfo.getServiceInfo().getComponentName().equals(
ComponentName.unflattenFromString(autoFillService))) {
Settings.Secure.putStringForUser(mContext.getContentResolver(),
- Settings.Secure.AUTO_FILL_SERVICE, null, mUserId);
+ Settings.Secure.AUTOFILL_SERVICE, null, mUserId);
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -738,7 +752,7 @@
// AutoFillUiCallback
@Override
- public void onEvent(AutoFillId id, int event) {
+ public void onEvent(AutofillId id, int event) {
mHandlerCaller.getHandler().post(() -> {
notifyChangeToClient(id, event);
});
@@ -749,7 +763,7 @@
removeSelf();
} else {
Parcelable result = data.getParcelable(
- AutoFillManager.EXTRA_AUTHENTICATION_RESULT);
+ AutofillManager.EXTRA_AUTHENTICATION_RESULT);
if (result instanceof FillResponse) {
mCurrentResponse = (FillResponse) result;
processResponseLocked(mCurrentResponse);
@@ -777,7 +791,7 @@
}
if (mCurrentResponse == null) {
// Happens when the activity / session was finished before the service replied, or
- // when the service cannot auto-fill it (and returned a null response).
+ // when the service cannot autofill it (and returned a null response).
if (DEBUG) {
Slog.d(TAG, "showSaveLocked(): no mCurrentResponse");
}
@@ -795,16 +809,16 @@
final int size = saveInfo.getSavableIds().size();
for (int i = 0; i < size; i++) {
- final AutoFillId id = saveInfo.getSavableIds().valueAt(i);
+ final AutofillId id = saveInfo.getSavableIds().valueAt(i);
final ViewState state = mViewStates.get(id);
if (state != null && state.mValueUpdated) {
- final AutoFillValue filledValue = findValue(mAutoFilledDataset, id);
- if (state.mAutoFillValue == null || state.mAutoFillValue.equals(filledValue)) {
+ final AutofillValue filledValue = findValue(mAutoFilledDataset, id);
+ if (state.mAutofillValue == null || state.mAutofillValue.equals(filledValue)) {
continue;
}
if (DEBUG) {
Slog.d(TAG, "finishSessionLocked(): found a change on " + id + ": "
- + state.mAutoFillValue);
+ + state.mAutofillValue);
}
getUiForShowing().showSaveUi(
mInfo.getServiceInfo().loadLabel(mContext.getPackageManager()),
@@ -829,15 +843,15 @@
final Bundle extras = this.mCurrentResponse.getExtras();
- for (Entry<AutoFillId, ViewState> entry : mViewStates.entrySet()) {
- final AutoFillValue value = entry.getValue().mAutoFillValue;
+ for (Entry<AutofillId, ViewState> entry : mViewStates.entrySet()) {
+ final AutofillValue value = entry.getValue().mAutofillValue;
if (value == null) {
if (VERBOSE) {
Slog.v(TAG, "callSaveLocked(): skipping " + entry.getKey());
}
continue;
}
- final AutoFillId id = entry.getKey();
+ final AutofillId id = entry.getKey();
final ViewNode node = findViewNodeByIdLocked(id);
if (node == null) {
Slog.w(TAG, "callSaveLocked(): did not find node with id " + id);
@@ -847,7 +861,7 @@
Slog.v(TAG, "callSaveLocked(): updating " + id + " to " + value);
}
- node.updateAutoFillValue(value);
+ node.updateAutofillValue(value);
}
// Sanitize structure before it's sent to service.
@@ -861,10 +875,10 @@
mRemoteFillService.onSaveRequest(mStructure, extras);
}
- void updateLocked(AutoFillId id, Rect bounds, AutoFillValue value, int flags) {
+ void updateLocked(AutofillId id, Rect bounds, AutofillValue value, int flags) {
if (mAutoFilledDataset != null && (flags & FLAG_VALUE_CHANGED) == 0) {
// TODO(b/33197203): ignoring because we don't support partitions yet
- Slog.d(TAG, "updateLocked(): ignoring " + flags + " after app was auto-filled");
+ Slog.d(TAG, "updateLocked(): ignoring " + flags + " after app was autofilled");
return;
}
@@ -875,28 +889,28 @@
}
if ((flags & FLAG_START_SESSION) != 0) {
- // View is triggering auto-fill.
+ // View is triggering autofill.
mCurrentViewState = viewState;
viewState.update(value, bounds);
return;
}
if ((flags & FLAG_VALUE_CHANGED) != 0) {
- if (value != null && !value.equals(viewState.mAutoFillValue)) {
+ if (value != null && !value.equals(viewState.mAutofillValue)) {
viewState.mValueUpdated = true;
- // Must check if this update was caused by auto-filling the view, in which
+ // Must check if this update was caused by autofilling the view, in which
// case we just update the value, but not the UI.
if (mAutoFilledDataset != null) {
- final AutoFillValue filledValue = findValue(mAutoFilledDataset, id);
+ final AutofillValue filledValue = findValue(mAutoFilledDataset, id);
if (value.equals(filledValue)) {
- viewState.mAutoFillValue = value;
+ viewState.mAutofillValue = value;
return;
}
}
// Change value
- viewState.mAutoFillValue = value;
+ viewState.mAutofillValue = value;
// Update the chooser UI
getUiForShowing().filterFillUi(value.coerceToString());
@@ -905,7 +919,7 @@
return;
}
- if ((flags & FLAG_FOCUS_GAINED) != 0) {
+ if ((flags & FLAG_VIEW_ENTERED) != 0) {
// Remove the UI if the ViewState has changed.
if (mCurrentViewState != viewState) {
mUi.hideFillUi(mCurrentViewState != null ? mCurrentViewState.mId : null);
@@ -923,7 +937,7 @@
return;
}
- if ((flags & FLAG_FOCUS_LOST) != 0) {
+ if ((flags & FLAG_VIEW_EXITED) != 0) {
if (mCurrentViewState == viewState) {
mUi.hideFillUi(viewState.mId);
mCurrentViewState = null;
@@ -936,10 +950,10 @@
@Override
public void onFillReady(ViewState viewState, FillResponse response, Rect bounds,
- AutoFillId filledId, @Nullable AutoFillValue value) {
+ AutofillId filledId, @Nullable AutofillValue value) {
String filterText = "";
if (value != null) {
- // TODO(b/33197203): Handle other AutoFillValue types
+ // TODO(b/33197203): Handle other AutofillValue types
final CharSequence text = value.getTextValue();
if (text != null) {
filterText = text.toString();
@@ -949,7 +963,7 @@
getUiForShowing().showFillUi(filledId, response, bounds, filterText);
}
- private void notifyChangeToClient(AutoFillId id, int event) {
+ private void notifyChangeToClient(AutofillId id, int event) {
if (!mHasCallback) return;
try {
mClient.onAutofillEvent(mWindowToken, id, event);
@@ -1001,12 +1015,12 @@
}
CharSequence getServiceName() {
- return AutoFillManagerServiceImpl.this.getServiceName();
+ return AutofillManagerServiceImpl.this.getServiceName();
}
private Intent createAuthFillInIntent(AssistStructure structure) {
Intent fillInIntent = new Intent();
- fillInIntent.putExtra(AutoFillManager.EXTRA_ASSIST_STRUCTURE, structure);
+ fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, structure);
return fillInIntent;
}
@@ -1025,7 +1039,7 @@
pw.print(prefix); pw.print("mCurrentViewStates: "); pw.println(mCurrentViewState);
pw.print(prefix); pw.print("mViewStates: "); pw.println(mViewStates.size());
final String prefix2 = prefix + " ";
- for (Map.Entry<AutoFillId, ViewState> entry : mViewStates.entrySet()) {
+ for (Map.Entry<AutofillId, ViewState> entry : mViewStates.entrySet()) {
pw.print(prefix); pw.print("State for id "); pw.println(entry.getKey());
entry.getValue().dump(prefix2, pw);
}
@@ -1049,9 +1063,9 @@
if (DEBUG) {
Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
}
- mClient.autoFill(dataset.getFieldIds(), dataset.getFieldValues());
+ mClient.autofill(dataset.getFieldIds(), dataset.getFieldValues());
} catch (RemoteException e) {
- Slog.w(TAG, "Error auto-filling activity: " + e);
+ Slog.w(TAG, "Error autofilling activity: " + e);
}
}
}
@@ -1063,12 +1077,12 @@
}
}
- private ViewNode findViewNodeByIdLocked(AutoFillId id) {
+ private ViewNode findViewNodeByIdLocked(AutofillId id) {
final int size = mStructure.getWindowNodeCount();
for (int i = 0; i < size; i++) {
final WindowNode window = mStructure.getWindowNodeAt(i);
final ViewNode root = window.getRootViewNode();
- if (id.equals(root.getAutoFillId())) {
+ if (id.equals(root.getAutofillId())) {
return root;
}
final ViewNode child = findViewNodeByIdLocked(root, id);
@@ -1079,16 +1093,16 @@
return null;
}
- private ViewNode findViewNodeByIdLocked(ViewNode parent, AutoFillId id) {
+ private ViewNode findViewNodeByIdLocked(ViewNode parent, AutofillId id) {
final int childrenSize = parent.getChildCount();
if (childrenSize > 0) {
for (int i = 0; i < childrenSize; i++) {
final ViewNode child = parent.getChildAt(i);
- if (id.equals(child.getAutoFillId())) {
+ if (id.equals(child.getAutofillId())) {
return child;
}
final ViewNode grandChild = findViewNodeByIdLocked(child, id);
- if (grandChild != null && id.equals(grandChild.getAutoFillId())) {
+ if (grandChild != null && id.equals(grandChild.getAutofillId())) {
return grandChild;
}
}
diff --git a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
similarity index 96%
rename from services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java
rename to services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
index 76d9aea..80560f1 100644
--- a/services/autofill/java/com/android/server/autofill/AutoFillManagerServiceShellCommand.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceShellCommand.java
@@ -16,7 +16,7 @@
package com.android.server.autofill;
-import static com.android.server.autofill.AutoFillManagerService.RECEIVER_BUNDLE_EXTRA_SESSIONS;
+import static com.android.server.autofill.AutofillManagerService.RECEIVER_BUNDLE_EXTRA_SESSIONS;
import android.app.ActivityManager;
import android.os.Bundle;
@@ -30,11 +30,11 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-public final class AutoFillManagerServiceShellCommand extends ShellCommand {
+public final class AutofillManagerServiceShellCommand extends ShellCommand {
- private final AutoFillManagerService mService;
+ private final AutofillManagerService mService;
- public AutoFillManagerServiceShellCommand(AutoFillManagerService service) {
+ public AutofillManagerServiceShellCommand(AutofillManagerService service) {
mService = service;
}
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 2f600c2..090cf91 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -19,8 +19,8 @@
import android.annotation.Nullable;
import android.os.Bundle;
import android.service.autofill.Dataset;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import java.util.ArrayList;
import java.util.Arrays;
@@ -61,9 +61,9 @@
* Gets the value of a {@link Dataset} field by its id, or {@code null} if not found.
*/
@Nullable
- static AutoFillValue findValue(Dataset dataset, AutoFillId id) {
+ static AutofillValue findValue(Dataset dataset, AutofillId id) {
if (dataset != null) {
- final ArrayList<AutoFillId> ids = dataset.getFieldIds();
+ final ArrayList<AutofillId> ids = dataset.getFieldIds();
final int size = ids.size();
for (int i = 0; i < size; i++) {
if (id.equals(ids.get(i))) {
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index d9f9721..eeff37c 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -30,7 +30,7 @@
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.service.autofill.AutoFillService;
+import android.service.autofill.AutofillService;
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
import android.service.autofill.IAutoFillServiceConnection;
@@ -100,8 +100,7 @@
mContext = context;
mCallbacks = callbacks;
mComponentName = componentName;
- mIntent = new Intent(AutoFillService.SERVICE_INTERFACE)
- .setComponent(mComponentName);
+ mIntent = new Intent(AutofillService.SERVICE_INTERFACE).setComponent(mComponentName);
mUserId = userId;
mHandler = new MyHandler(context);
}
@@ -183,7 +182,7 @@
return;
}
if (!isBound()) {
- if (mPendingRequest != null && mPendingRequest != pendingRequest) {
+ if (mPendingRequest != null) {
mPendingRequest.cancel();
}
mPendingRequest = pendingRequest;
@@ -338,9 +337,10 @@
Slog.w(LOG_TAG, "Exception calling onConnected(): " + e);
}
-
if (mPendingRequest != null) {
- handlePendingRequest(mPendingRequest);
+ PendingRequest pendingRequest = mPendingRequest;
+ mPendingRequest = null;
+ handlePendingRequest(pendingRequest);
}
mServiceDied = false;
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index 599bbfe..3eefa7c 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -15,8 +15,8 @@
*/
package com.android.server.autofill.ui;
-import static android.view.autofill.AutoFillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
-import static android.view.autofill.AutoFillManager.AutofillCallback.EVENT_INPUT_SHOWN;
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_SHOWN;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -31,7 +31,7 @@
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Slog;
-import android.view.autofill.AutoFillId;
+import android.view.autofill.AutofillId;
import android.widget.Toast;
import com.android.server.UiThread;
@@ -39,7 +39,7 @@
import java.io.PrintWriter;
/**
- * Handles all auto-fill related UI tasks. The UI has two components:
+ * Handles all autofill related UI tasks. The UI has two components:
* fill UI that shows a popup style window anchored at the focused
* input field for choosing a dataset to fill or trigger the response
* authentication flow; save UI that shows a toast style window for
@@ -66,7 +66,7 @@
void fill(@NonNull Dataset dataset);
void save();
void cancelSave();
- void onEvent(AutoFillId id, int event);
+ void onEvent(AutofillId id, int event);
}
public AutoFillUI(@NonNull Context context) {
@@ -102,7 +102,7 @@
/**
* Hides the fill UI.
*/
- public void hideFillUi(AutoFillId id) {
+ public void hideFillUi(AutofillId id) {
mHandler.post(() -> {
hideFillUiUiThread();
if (mCallback != null) {
@@ -153,7 +153,7 @@
* @param anchorBounds bounds of the focused view
* @param filterText text of the view to be filled
*/
- public void showFillUi(@NonNull AutoFillId focusedId, @NonNull FillResponse response,
+ public void showFillUi(@NonNull AutofillId focusedId, @NonNull FillResponse response,
@NonNull Rect anchorBounds, @Nullable String filterText) {
mHandler.post(() -> {
if (!hasCallback()) {
@@ -190,7 +190,7 @@
}
/**
- * Shows the UI asking the user to save for auto-fill.
+ * Shows the UI asking the user to save for autofill.
*/
public void showSaveUi(@NonNull CharSequence providerLabel, @NonNull SaveInfo info) {
mHandler.post(() -> {
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 0d5fbbe..3fdcd9e 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -32,12 +32,11 @@
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.view.autofill.AutoFillId;
-import android.view.autofill.AutoFillValue;
+import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.android.internal.R;
-import com.android.internal.R;
import libcore.util.Objects;
import java.util.ArrayList;
@@ -45,6 +44,8 @@
final class FillUi {
private static final String TAG = "FillUi";
+ private static final int VISIBLE_OPTIONS_MAX_COUNT = 3;
+
interface Callback {
void onResponsePicked(@NonNull FillResponse response);
void onDatasetPicked(@NonNull Dataset dataset);
@@ -57,6 +58,8 @@
private final @NonNull Callback mCallback;
+ private final @NonNull ListView mListView;
+
private final @Nullable ArrayAdapter<ViewItem> mAdapter;
private @Nullable String mFilterText;
@@ -67,13 +70,16 @@
private boolean mDestroyed;
FillUi(@NonNull Context context, @NonNull FillResponse response,
- @NonNull AutoFillId focusedViewId, @NonNull IBinder windowToken,
+ @NonNull AutofillId focusedViewId, @NonNull IBinder windowToken,
@NonNull Rect anchorBounds, @Nullable String filterText,
@NonNull Callback callback) {
mAnchorBounds.set(anchorBounds);
mCallback = callback;
if (response.getAuthentication() != null) {
+ mListView = null;
+ mAdapter = null;
+
final View content;
try {
content = response.getPresentation().apply(context, null);
@@ -81,7 +87,6 @@
callback.onCanceled();
Slog.e(TAG, "Error inflating remote views", e);
mWindow = null;
- mAdapter = null;
return;
}
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
@@ -90,10 +95,9 @@
content.setOnClickListener(v -> mCallback.onResponsePicked(response));
mContentWidth = content.getMeasuredWidth();
mContentHeight = content.getMeasuredHeight();
- mAdapter = null;
mWindow = new AnchoredWindow(windowToken, content);
- mWindow.update(mContentWidth, mContentHeight, mAnchorBounds);
+ mWindow.show(mContentWidth, mContentHeight, mAnchorBounds);
} else {
final int datasetCount = response.getDatasets().size();
final ArrayList<ViewItem> items = new ArrayList<>(datasetCount);
@@ -101,7 +105,7 @@
final Dataset dataset = response.getDatasets().get(i);
final int index = dataset.getFieldIds().indexOf(focusedViewId);
if (index >= 0) {
- AutoFillValue value = dataset.getFieldValues().get(index);
+ final AutofillValue value = dataset.getFieldValues().get(index);
final View view;
try {
view = dataset.getPresentation().apply(context, null);
@@ -122,16 +126,16 @@
};
final LayoutInflater inflater = LayoutInflater.from(context);
- final ListView listView = (ListView) inflater.inflate(
+ mListView = (ListView) inflater.inflate(
com.android.internal.R.layout.autofill_dataset_picker, null);
- listView.setAdapter(mAdapter);
- listView.setOnItemClickListener((adapter, view, position, id) -> {
+ mListView.setAdapter(mAdapter);
+ mListView.setOnItemClickListener((adapter, view, position, id) -> {
final ViewItem vi = mAdapter.getItem(position);
mCallback.onDatasetPicked(vi.getDataset());
});
filter(filterText);
- mWindow = new AnchoredWindow(windowToken, listView);
+ mWindow = new AnchoredWindow(windowToken, mListView);
}
}
@@ -139,7 +143,7 @@
throwIfDestroyed();
if (!mAnchorBounds.equals(anchorBounds)) {
mAnchorBounds.set(anchorBounds);
- mWindow.update(mContentWidth, mContentHeight, anchorBounds);
+ mWindow.show(mContentWidth, mContentHeight, anchorBounds);
}
}
@@ -157,10 +161,16 @@
return;
}
if (count <= 0) {
- mCallback.onCanceled();
+ mWindow.hide();
} else {
if (updateContentSize()) {
- mWindow.update(mContentWidth, mContentHeight, mAnchorBounds);
+ mWindow.show(mContentWidth, mContentHeight, mAnchorBounds);
+ }
+ if (mAdapter.getCount() > VISIBLE_OPTIONS_MAX_COUNT) {
+ mListView.setVerticalScrollBarEnabled(true);
+ mListView.onVisibilityAggregated(true);
+ } else {
+ mListView.setVerticalScrollBarEnabled(false);
}
}
});
@@ -168,7 +178,7 @@
public void destroy() {
throwIfDestroyed();
- mWindow.destroy();
+ mWindow.hide();
mDestroyed = true;
}
@@ -194,7 +204,7 @@
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0);
- final int itemCount = mAdapter.getCount();
+ final int itemCount = Math.min(mAdapter.getCount(), VISIBLE_OPTIONS_MAX_COUNT);
for (int i = 0; i < itemCount; i++) {
View view = mAdapter.getItem(i).getView();
view.measure(widthMeasureSpec, heightMeasureSpec);
@@ -267,7 +277,7 @@
/**
* Hides the window.
*/
- void destroy() {
+ void hide() {
if (mContentView.isAttachedToWindow()) {
mContentView.setOnTouchListener(null);
mWm.removeView(mContentView);
@@ -284,7 +294,7 @@
return false;
}
- public void update(int desiredWidth, int desiredHeight, Rect anchorBounds) {
+ public void show(int desiredWidth, int desiredHeight, Rect anchorBounds) {
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.setTitle("FillUi");
params.token = mActivityToken;
@@ -294,7 +304,6 @@
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
- params.format = PixelFormat.TRANSLUCENT;
mWm.getDefaultDisplay().getRealSize(mTempPoint);
final int screenWidth = mTempPoint.x;
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 0d438cb..179b3d0 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -2839,7 +2839,8 @@
}
final class UidObserver extends IUidObserver.Stub {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
}
@Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index de11f36..a5e357c 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -235,6 +235,7 @@
}
public AppOpsService(File storagePath, Handler handler) {
+ LockGuard.installLock(this, LockGuard.INDEX_APP_OPS);
mFile = new AtomicFile(storagePath);
mHandler = handler;
readState();
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 16ed276..a4f9f21 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3090,8 +3090,7 @@
}
@Override
- public void startTethering(int type, ResultReceiver receiver,
- boolean showProvisioningUi) {
+ public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi) {
ConnectivityManager.enforceTetherChangePermission(mContext);
if (!isTetheringSupported()) {
receiver.send(ConnectivityManager.TETHER_ERROR_UNSUPPORTED, null);
diff --git a/services/core/java/com/android/server/LockGuard.java b/services/core/java/com/android/server/LockGuard.java
index 3a381ae..b744917 100644
--- a/services/core/java/com/android/server/LockGuard.java
+++ b/services/core/java/com/android/server/LockGuard.java
@@ -53,10 +53,29 @@
* <li>A guarded synchronized block takes 50ns when disabled.
* <li>A guarded synchronized block takes 460ns per lock checked when enabled.
* </ul>
+ * <p>
+ * This class also supports a second simpler mode of operation where well-known
+ * locks are explicitly registered and checked via indexes.
*/
public class LockGuard {
private static final String TAG = "LockGuard";
+ public static final boolean ENABLED = false;
+
+ /**
+ * Well-known locks ordered by fixed index. Locks with a specific index
+ * should never be acquired while holding a lock of a lower index.
+ */
+ public static final int INDEX_APP_OPS = 0;
+ public static final int INDEX_POWER = 1;
+ public static final int INDEX_USER = 2;
+ public static final int INDEX_PACKAGES = 3;
+ public static final int INDEX_STORAGE = 4;
+ public static final int INDEX_WINDOW = 5;
+ public static final int INDEX_ACTIVITY = 6;
+
+ private static Object[] sKnownFixed = new Object[INDEX_ACTIVITY + 1];
+
private static ArrayMap<Object, LockInfo> sKnown = new ArrayMap<>(0, true);
private static class LockInfo {
@@ -119,11 +138,41 @@
}
/**
+ * Yell if any lower-level locks are being held by the calling thread that
+ * is about to acquire the given lock.
+ */
+ public static void guard(int index) {
+ for (int i = 0; i < index; i++) {
+ final Object lock = sKnownFixed[i];
+ if (lock != null && Thread.holdsLock(lock)) {
+ Slog.w(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding "
+ + lockToString(i) + " while trying to acquire "
+ + lockToString(index), new Throwable());
+ }
+ }
+ }
+
+ /**
* Report the given lock with a well-known label.
*/
- public static void installLock(Object lock, String label) {
+ public static Object installLock(Object lock, String label) {
final LockInfo info = findOrCreateLockInfo(lock);
info.label = label;
+ return lock;
+ }
+
+ /**
+ * Report the given lock with a well-known index.
+ */
+ public static Object installLock(Object lock, int index) {
+ sKnownFixed[index] = lock;
+ return lock;
+ }
+
+ public static Object installNewLock(int index) {
+ final Object lock = new Object();
+ installLock(lock, index);
+ return lock;
}
private static String lockToString(Object lock) {
@@ -135,6 +184,19 @@
}
}
+ private static String lockToString(int index) {
+ switch (index) {
+ case INDEX_APP_OPS: return "APP_OPS";
+ case INDEX_POWER: return "POWER";
+ case INDEX_USER: return "USER";
+ case INDEX_PACKAGES: return "PACKAGES";
+ case INDEX_STORAGE: return "STORAGE";
+ case INDEX_WINDOW: return "WINDOW";
+ case INDEX_ACTIVITY: return "ACTIVITY";
+ default: return Integer.toString(index);
+ }
+ }
+
public static void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
for (int i = 0; i < sKnown.size(); i++) {
final Object lock = sKnown.keyAt(i);
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index 480b08a..cecd7e5 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -29,11 +29,13 @@
import android.provider.Settings;
import android.text.format.DateUtils;
import android.util.ExceptionUtils;
+import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.util.ArrayUtils;
+import com.android.server.pm.PackageManagerService;
import java.io.File;
@@ -49,6 +51,7 @@
public class RescueParty {
private static final String TAG = "RescueParty";
+ private static final String PROP_ENABLE_RESCUE = "persist.sys.enable_rescue";
private static final String PROP_DISABLE_RESCUE = "persist.sys.disable_rescue";
private static final String PROP_RESCUE_LEVEL = "sys.rescue_level";
private static final String PROP_RESCUE_BOOT_COUNT = "sys.rescue_boot_count";
@@ -66,6 +69,11 @@
private static SparseArray<Threshold> sApps = new SparseArray<>();
private static boolean isDisabled() {
+ // Check if we're explicitly enabled for testing
+ if (SystemProperties.getBoolean(PROP_ENABLE_RESCUE, true)) {
+ return false;
+ }
+
// We're disabled on all engineering devices
if (Build.IS_ENG) {
Slog.v(TAG, "Disabled because of eng build");
@@ -138,7 +146,8 @@
SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level));
EventLogTags.writeRescueLevel(level, triggerUid);
- Slog.w(TAG, "Incremented rescue level to " + levelToString(level));
+ PackageManagerService.logCriticalInfo(Log.WARN, "Incremented rescue level to "
+ + levelToString(level) + " triggered by UID " + triggerUid);
}
/**
@@ -157,10 +166,13 @@
try {
executeRescueLevelInternal(context, level);
EventLogTags.writeRescueSuccess(level);
- Slog.d(TAG, "Finished rescue level " + levelToString(level));
+ PackageManagerService.logCriticalInfo(Log.DEBUG,
+ "Finished rescue level " + levelToString(level));
} catch (Throwable t) {
- EventLogTags.writeRescueFailure(level, ExceptionUtils.getCompleteMessage(t));
- Slog.e(TAG, "Failed rescue level " + levelToString(level), t);
+ final String msg = ExceptionUtils.getCompleteMessage(t);
+ EventLogTags.writeRescueFailure(level, msg);
+ PackageManagerService.logCriticalInfo(Log.ERROR,
+ "Failed rescue level " + levelToString(level) + ": " + msg);
}
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 32136bb..3667ecd 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -308,7 +308,7 @@
* <em>Never</em> hold the lock while performing downcalls into vold, since
* unsolicited events can suddenly appear to update data structures.
*/
- private final Object mLock = new Object();
+ private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_STORAGE);
/** Set of users that we know are unlocked. */
@GuardedBy("mLock")
@@ -3275,8 +3275,13 @@
if (uid != Binder.getCallingUid()) {
mContext.enforceCallingPermission(android.Manifest.permission.STORAGE_INTERNAL, TAG);
}
- // TODO: wire up to cache quota once merged
- return 64 * TrafficStats.MB_IN_BYTES;
+ final long token = Binder.clearCallingIdentity();
+ final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+ try {
+ return stats.getCacheQuotaBytes(volumeUuid, uid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index dade0ed..4670eed 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -289,7 +289,7 @@
* and then rebuild the cache. All under the cache lock. But that change is too
* large at this point.
*/
- final String removedPackageName = intent.getData().toString();
+ final String removedPackageName = intent.getData().getSchemeSpecificPart();
Runnable purgingRunnable = new Runnable() {
@Override
public void run() {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 10b1f2b..6bf77ae 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -127,10 +127,11 @@
import static com.android.server.am.ActivityStackSupervisor.CREATE_IF_NEEDED;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.am.ActivityStackSupervisor.FORCE_FOCUS;
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
-import static com.android.server.am.ActivityStackSupervisor.RESTORE_FROM_RECENTS;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV;
@@ -533,8 +534,8 @@
// on getting this result before starting to launch its UI).
static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
- // How long to wait in getAutoFillAssistStructure() for the activity to respond with the result.
- static final int PENDING_AUTO_FILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
+ // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
+ static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
// Maximum number of persisted Uri grants a package is allowed
static final int MAX_PERSISTED_URI_GRANTS = 128;
@@ -690,6 +691,9 @@
Process.setThreadPriority(tid, -2);
}
state.regionCounter++;
+ if (LockGuard.ENABLED) {
+ LockGuard.guard(LockGuard.INDEX_ACTIVITY);
+ }
}
static void resetPriorityAfterLockedSection() {
@@ -702,6 +706,7 @@
public class PendingAssistExtras extends Binder implements Runnable {
public final ActivityRecord activity;
+ public boolean isHome;
public final Bundle extras;
public final Intent intent;
public final String hint;
@@ -723,6 +728,7 @@
receiverExtras = _receiverExtras;
userHandle = _userHandle;
}
+
@Override
public void run() {
Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
@@ -2625,11 +2631,11 @@
}
@VisibleForTesting
- public ActivityManagerService() {
+ public ActivityManagerService(AppOpsService appOpsService) {
GL_ES_VERSION = 0;
mActivityStarter = null;
mAppErrors = null;
- mAppOpsService = null;
+ mAppOpsService = appOpsService;
mBatteryStatsService = null;
mCompatModePackages = null;
mConstants = null;
@@ -2654,6 +2660,7 @@
// Note: This method is invoked on the main thread but may need to attach various
// handlers to other threads. So take care to be explicit about the looper.
public ActivityManagerService(Context systemContext) {
+ LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
mContext = systemContext;
mFactoryTest = FactoryTest.getMode();
mSystemThread = ActivityThread.currentActivityThread();
@@ -4255,7 +4262,8 @@
mProcessObservers.finishBroadcast();
}
- private void dispatchUidsChanged() {
+ @VisibleForTesting
+ void dispatchUidsChanged() {
int N;
synchronized (this) {
N = mPendingUidChanges.size();
@@ -4278,104 +4286,105 @@
int i = mUidObservers.beginBroadcast();
while (i > 0) {
i--;
- final IUidObserver observer = mUidObservers.getBroadcastItem(i);
- final UidObserverRegistration reg = (UidObserverRegistration)
- mUidObservers.getBroadcastCookie(i);
- if (observer != null) {
- try {
- for (int j=0; j<N; j++) {
- UidRecord.ChangeItem item = mActiveUidChanges[j];
- final int change = item.change;
- UidRecord validateUid = null;
- if (VALIDATE_UID_STATES && i == 0) {
- validateUid = mValidateUids.get(item.uid);
- if (validateUid == null && change != UidRecord.CHANGE_GONE
- && change != UidRecord.CHANGE_GONE_IDLE) {
- validateUid = new UidRecord(item.uid);
- mValidateUids.put(item.uid, validateUid);
- }
- }
- if (change == UidRecord.CHANGE_IDLE
- || change == UidRecord.CHANGE_GONE_IDLE) {
- if ((reg.which & ActivityManager.UID_OBSERVER_IDLE) != 0) {
- if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
- "UID idle uid=" + item.uid);
- observer.onUidIdle(item.uid, item.ephemeral);
- }
- if (VALIDATE_UID_STATES && i == 0) {
- if (validateUid != null) {
- validateUid.idle = true;
- }
- }
- } else if (change == UidRecord.CHANGE_ACTIVE) {
- if ((reg.which & ActivityManager.UID_OBSERVER_ACTIVE) != 0) {
- if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
- "UID active uid=" + item.uid);
- observer.onUidActive(item.uid);
- }
- if (VALIDATE_UID_STATES && i == 0) {
- validateUid.idle = false;
- }
- }
- if (change == UidRecord.CHANGE_GONE
- || change == UidRecord.CHANGE_GONE_IDLE) {
- if ((reg.which & ActivityManager.UID_OBSERVER_GONE) != 0) {
- if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
- "UID gone uid=" + item.uid);
- observer.onUidGone(item.uid, item.ephemeral);
- }
- if (reg.lastProcStates != null) {
- reg.lastProcStates.delete(item.uid);
- }
- if (VALIDATE_UID_STATES && i == 0) {
- if (validateUid != null) {
- mValidateUids.remove(item.uid);
- }
- }
- } else {
- if ((reg.which & ActivityManager.UID_OBSERVER_PROCSTATE) != 0) {
- if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
- "UID CHANGED uid=" + item.uid
- + ": " + item.processState);
- boolean doReport = true;
- if (reg.cutpoint >= ActivityManager.MIN_PROCESS_STATE) {
- final int lastState = reg.lastProcStates.get(item.uid,
- ActivityManager.PROCESS_STATE_UNKNOWN);
- if (lastState != ActivityManager.PROCESS_STATE_UNKNOWN) {
- final boolean lastAboveCut = lastState <= reg.cutpoint;
- final boolean newAboveCut = item.processState <= reg.cutpoint;
- doReport = lastAboveCut != newAboveCut;
- } else {
- doReport = item.processState
- != ActivityManager.PROCESS_STATE_NONEXISTENT;
- }
- }
- if (doReport) {
- if (reg.lastProcStates != null) {
- reg.lastProcStates.put(item.uid, item.processState);
- }
- observer.onUidStateChanged(item.uid, item.processState);
- }
- }
- if (VALIDATE_UID_STATES && i == 0) {
- validateUid.curProcState = validateUid.setProcState
- = item.processState;
- }
- }
- }
- } catch (RemoteException e) {
- }
- }
+ dispatchUidsChangedForObserver(mUidObservers.getBroadcastItem(i),
+ (UidObserverRegistration) mUidObservers.getBroadcastCookie(i), N);
}
mUidObservers.finishBroadcast();
+ if (VALIDATE_UID_STATES && mUidObservers.getRegisteredCallbackCount() > 0) {
+ for (int j = 0; j < N; ++j) {
+ final UidRecord.ChangeItem item = mActiveUidChanges[j];
+ if (item.change == UidRecord.CHANGE_GONE
+ || item.change == UidRecord.CHANGE_GONE_IDLE) {
+ mValidateUids.remove(item.uid);
+ } else {
+ UidRecord validateUid = mValidateUids.get(item.uid);
+ if (validateUid == null) {
+ validateUid = new UidRecord(item.uid);
+ mValidateUids.put(item.uid, validateUid);
+ }
+ if (item.change == UidRecord.CHANGE_IDLE) {
+ validateUid.idle = true;
+ } else if (item.change == UidRecord.CHANGE_ACTIVE) {
+ validateUid.idle = false;
+ }
+ validateUid.curProcState = validateUid.setProcState = item.processState;
+ }
+ }
+ }
+
synchronized (this) {
- for (int j=0; j<N; j++) {
+ for (int j = 0; j < N; j++) {
mAvailUidChanges.add(mActiveUidChanges[j]);
}
}
}
+ private void dispatchUidsChangedForObserver(IUidObserver observer,
+ UidObserverRegistration reg, int changesSize) {
+ if (observer == null) {
+ return;
+ }
+ try {
+ for (int j = 0; j < changesSize; j++) {
+ UidRecord.ChangeItem item = mActiveUidChanges[j];
+ final int change = item.change;
+ if (change == UidRecord.CHANGE_IDLE
+ || change == UidRecord.CHANGE_GONE_IDLE) {
+ if ((reg.which & ActivityManager.UID_OBSERVER_IDLE) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID idle uid=" + item.uid);
+ observer.onUidIdle(item.uid, item.ephemeral);
+ }
+ } else if (change == UidRecord.CHANGE_ACTIVE) {
+ if ((reg.which & ActivityManager.UID_OBSERVER_ACTIVE) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID active uid=" + item.uid);
+ observer.onUidActive(item.uid);
+ }
+ }
+ if (change == UidRecord.CHANGE_GONE
+ || change == UidRecord.CHANGE_GONE_IDLE) {
+ if ((reg.which & ActivityManager.UID_OBSERVER_GONE) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID gone uid=" + item.uid);
+ observer.onUidGone(item.uid, item.ephemeral);
+ }
+ if (reg.lastProcStates != null) {
+ reg.lastProcStates.delete(item.uid);
+ }
+ } else {
+ if ((reg.which & ActivityManager.UID_OBSERVER_PROCSTATE) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID CHANGED uid=" + item.uid
+ + ": " + item.processState);
+ boolean doReport = true;
+ if (reg.cutpoint >= ActivityManager.MIN_PROCESS_STATE) {
+ final int lastState = reg.lastProcStates.get(item.uid,
+ ActivityManager.PROCESS_STATE_UNKNOWN);
+ if (lastState != ActivityManager.PROCESS_STATE_UNKNOWN) {
+ final boolean lastAboveCut = lastState <= reg.cutpoint;
+ final boolean newAboveCut = item.processState <= reg.cutpoint;
+ doReport = lastAboveCut != newAboveCut;
+ } else {
+ doReport = item.processState
+ != ActivityManager.PROCESS_STATE_NONEXISTENT;
+ }
+ }
+ if (doReport) {
+ if (reg.lastProcStates != null) {
+ reg.lastProcStates.put(item.uid, item.processState);
+ }
+ observer.onUidStateChanged(item.uid, item.processState,
+ item.procStateSeq);
+ }
+ }
+ }
+ }
+ } catch (RemoteException e) {
+ }
+ }
+
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
@@ -7803,9 +7812,14 @@
r.pictureInPictureArgs.copyOnlySet(args);
if (r.getStack().getStackId() == PINNED_STACK_ID) {
// If the activity is already in picture-in-picture, update the pinned stack now
+ // if it is not already expanding to fullscreen. Otherwise, the arguments will
+ // be used the next time the activity enters PiP
final PinnedActivityStack stack = r.getStack();
- stack.setPictureInPictureAspectRatio(r.pictureInPictureArgs.getAspectRatio());
- stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
+ if (!stack.isBoundsAnimatingToFullscreen()) {
+ stack.setPictureInPictureAspectRatio(
+ r.pictureInPictureArgs.getAspectRatio());
+ stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
+ }
}
logPictureInPictureArgs(args);
}
@@ -8523,13 +8537,21 @@
// Third... does the caller itself have permission to access
// this uri?
- if (UserHandle.getAppId(callingUid) != Process.SYSTEM_UID) {
- if (!checkHoldingPermissionsLocked(pm, pi, grantUri, callingUid, modeFlags)) {
- // Require they hold a strong enough Uri permission
- if (!checkUriPermissionLocked(grantUri, callingUid, modeFlags)) {
- throw new SecurityException("Uid " + callingUid
- + " does not have permission to uri " + grantUri);
- }
+ final int callingAppId = UserHandle.getAppId(callingUid);
+ if ((callingAppId == Process.SYSTEM_UID) || (callingAppId == Process.ROOT_UID)) {
+ if ("com.android.settings.files".equals(grantUri.uri.getAuthority())) {
+ // Exempted authority for cropping user photos in Settings app
+ } else {
+ Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission"
+ + " grant to " + grantUri + "; use startActivityAsCaller() instead");
+ return -1;
+ }
+ }
+ if (!checkHoldingPermissionsLocked(pm, pi, grantUri, callingUid, modeFlags)) {
+ // Require they hold a strong enough Uri permission
+ if (!checkUriPermissionLocked(grantUri, callingUid, modeFlags)) {
+ throw new SecurityException("Uid " + callingUid
+ + " does not have permission to uri " + grantUri);
}
}
return targetUid;
@@ -9650,7 +9672,7 @@
enforceCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
"getTaskThumbnail()");
final TaskRecord tr = mStackSupervisor.anyTaskForIdLocked(
- id, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ id, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS, INVALID_STACK_ID);
if (tr != null) {
return tr.getTaskThumbnailLocked();
}
@@ -9663,8 +9685,8 @@
synchronized (this) {
enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
"getTaskDescription()");
- final TaskRecord tr = mStackSupervisor.anyTaskForIdLocked(
- id, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ final TaskRecord tr = mStackSupervisor.anyTaskForIdLocked(id,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS, INVALID_STACK_ID);
if (tr != null) {
return tr.lastTaskDescription;
}
@@ -9776,7 +9798,7 @@
public void setTaskResizeable(int taskId, int resizeableMode) {
synchronized (this) {
final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
- taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS, INVALID_STACK_ID);
if (task == null) {
Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found");
return;
@@ -9838,8 +9860,8 @@
Rect rect = new Rect();
try {
synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
- taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS, INVALID_STACK_ID);
if (task == null) {
Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
return rect;
@@ -9870,8 +9892,8 @@
final long ident = Binder.clearCallingIdentity();
try {
synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
- taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY, INVALID_STACK_ID);
if (task == null) {
Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found");
return;
@@ -9889,8 +9911,8 @@
final long ident = Binder.clearCallingIdentity();
try {
synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
- taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY, INVALID_STACK_ID);
if (task == null) {
Slog.w(TAG, "cancelTaskThumbnailTransition: taskId=" + taskId + " not found");
return;
@@ -9909,8 +9931,8 @@
try {
final TaskRecord task;
synchronized (this) {
- task = mStackSupervisor.anyTaskForIdLocked(
- taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS, INVALID_STACK_ID);
if (task == null) {
Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
return null;
@@ -10247,13 +10269,8 @@
mWindowManager.setDockedStackCreateState(DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT,
null /* initialBounds */);
}
-
- final boolean successful = task.reparent(stackId, toTop,
+ task.reparent(stackId, toTop,
REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME, "moveTaskToStack");
- if (successful && stackId == DOCKED_STACK_ID) {
- // If task moved to docked stack - show recents if needed.
- mWindowManager.showRecentApps(false /* fromHome */);
- }
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -10326,7 +10343,7 @@
*/
@Override
public boolean moveTaskToDockedStack(int taskId, int createMode, boolean toTop, boolean animate,
- Rect initialBounds, boolean moveHomeStackFront) {
+ Rect initialBounds) {
enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToDockedStack()");
synchronized (this) {
long ident = Binder.clearCallingIdentity();
@@ -10343,12 +10360,9 @@
// Defer resuming until we move the home stack to the front below
final boolean moved = task.reparent(DOCKED_STACK_ID, toTop,
- REPARENT_KEEP_STACK_AT_FRONT, animate, DEFER_RESUME,
+ REPARENT_KEEP_STACK_AT_FRONT, animate, !DEFER_RESUME,
"moveTaskToDockedStack");
if (moved) {
- if (moveHomeStackFront) {
- mStackSupervisor.moveHomeStackToFront("moveTaskToDockedStack");
- }
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
}
return moved;
@@ -12654,16 +12668,16 @@
}
@Override
- public boolean requestAutoFillData(IResultReceiver receiver, Bundle receiverExtras,
+ public boolean requestAutofillData(IResultReceiver receiver, Bundle receiverExtras,
IBinder activityToken) {
// NOTE: we could always use ActivityManager.ASSIST_CONTEXT_FULL and let ActivityThread
// rely on the flags to decide whether the handleRequestAssistContextExtras() is for
- // auto-fill, but it's safer to explicitly use new AutoFill types, in case the Assist
+ // autofill, but it's safer to explicitly use new AutoFill types, in case the Assist
// requests use flags in the future as well (since their flags value might collide with the
- // auto-fill flag values).
- return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTO_FILL, null, null,
+ // autofill flag values).
+ return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
- null, PENDING_AUTO_FILL_ASSIST_STRUCTURE_TIMEOUT) != null;
+ null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT) != null;
}
private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
@@ -12710,6 +12724,7 @@
pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
userHandle);
+ pae.isHome = activity.isHomeActivity();
// Increment the sessionId if necessary
if (newSessionId) {
@@ -12756,6 +12771,8 @@
}
}
+ /** Called from an app when assist data is ready. */
+ @Override
public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure,
AssistContent content, Uri referrer) {
PendingAssistExtras pae = (PendingAssistExtras)token;
@@ -12766,6 +12783,9 @@
if (referrer != null) {
pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer);
}
+ if (structure != null) {
+ structure.setHomeActivity(pae.isHome);
+ }
pae.haveResult = true;
pae.notifyAll();
if (pae.intent == null && pae.receiver == null) {
@@ -17993,6 +18013,25 @@
// BROADCASTS
// =========================================================
+ private boolean isInstantApp(ProcessRecord record, String callerPackage, int uid) {
+ if (UserHandle.getAppId(uid) < Process.FIRST_APPLICATION_UID) {
+ return false;
+ }
+ // Easy case -- we have the app's ProcessRecord.
+ if (record != null) {
+ return record.info.isInstantApp();
+ }
+ // Otherwise check with PackageManager.
+ mAppOpsService.checkPackage(uid, callerPackage);
+ try {
+ IPackageManager pm = AppGlobals.getPackageManager();
+ return pm.isInstantApp(callerPackage, UserHandle.getUserId(uid));
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error looking up if " + callerPackage + " is an instant app.", e);
+ return true;
+ }
+ }
+
boolean isPendingBroadcastProcessLocked(int pid) {
return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid)
|| mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid);
@@ -18015,12 +18054,14 @@
}
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
- IIntentReceiver receiver, IntentFilter filter, String permission, int userId) {
+ IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
+ boolean visibleToInstantApps) {
enforceNotIsolatedCaller("registerReceiver");
ArrayList<Intent> stickyIntents = null;
ProcessRecord callerApp = null;
int callingUid;
int callingPid;
+ boolean instantApp;
synchronized(this) {
if (caller != null) {
callerApp = getRecordForAppLocked(caller);
@@ -18044,6 +18085,7 @@
callingPid = Binder.getCallingPid();
}
+ instantApp = isInstantApp(callerApp, callerPackage, callingUid);
userId = mUserController.handleIncomingUser(callingPid, callingUid, userId, true,
ALLOW_FULL_ONLY, "registerReceiver", callerPackage);
@@ -18079,6 +18121,11 @@
// Look for any matching sticky broadcasts...
for (int i = 0, N = stickyIntents.size(); i < N; i++) {
Intent intent = stickyIntents.get(i);
+ // Don't provided intents that aren't available to instant apps.
+ if (instantApp &&
+ (intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) == 0) {
+ continue;
+ }
// If intent has scheme "content", it will need to acccess
// provider that needs to lock mProviderMap in ActivityThread
// and also it may need to wait application response, so we
@@ -18137,7 +18184,7 @@
+ " callerPackage is " + callerPackage);
}
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage,
- permission, callingUid, userId);
+ permission, callingUid, userId, instantApp, visibleToInstantApps);
rl.add(bf);
if (!bf.debugCheck()) {
Slog.w(TAG, "==> For Dynamic broadcast");
@@ -18155,7 +18202,7 @@
Intent intent = allSticky.get(i);
BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, null,
- null, -1, -1, null, null, AppOpsManager.OP_NONE, null, receivers,
+ null, -1, -1, false, null, null, AppOpsManager.OP_NONE, null, receivers,
null, 0, null, null, false, true, true, -1);
queue.enqueueParallelBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
@@ -18396,6 +18443,12 @@
boolean ordered, boolean sticky, int callingPid, int callingUid, int userId) {
intent = new Intent(intent);
+ final boolean callerInstantApp = isInstantApp(callerApp, callerPackage, callingUid);
+ // Instant Apps cannot use FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS
+ if (callerInstantApp) {
+ intent.setFlags(intent.getFlags() & ~Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
+ }
+
// By default broadcasts do not go to stopped apps.
intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
@@ -18885,9 +18938,9 @@
}
final BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
- callerPackage, callingPid, callingUid, resolvedType, requiredPermissions,
- appOp, brOptions, registeredReceivers, resultTo, resultCode, resultData,
- resultExtras, ordered, sticky, false, userId);
+ callerPackage, callingPid, callingUid, callerInstantApp, resolvedType,
+ requiredPermissions, appOp, brOptions, registeredReceivers, resultTo,
+ resultCode, resultData, resultExtras, ordered, sticky, false, userId);
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Enqueueing parallel broadcast " + r);
final boolean replaced = replacePending
&& (queue.replaceParallelBroadcastLocked(r) != null);
@@ -18981,7 +19034,7 @@
|| resultTo != null) {
BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
- callerPackage, callingPid, callingUid, resolvedType,
+ callerPackage, callingPid, callingUid, callerInstantApp, resolvedType,
requiredPermissions, appOp, brOptions, receivers, resultTo, resultCode,
resultData, resultExtras, ordered, sticky, false, userId);
@@ -19898,14 +19951,11 @@
/** Helper method that requests bounds from WM and applies them to stack. */
private void resizeStackWithBoundsFromWindowManager(int stackId, boolean deferResume) {
final Rect newStackBounds = new Rect();
- final Rect newTempTaskBounds = new Rect();
- mStackSupervisor.getStack(stackId).getBoundsForNewConfiguration(newStackBounds,
- newTempTaskBounds);
+ mStackSupervisor.getStack(stackId).getBoundsForNewConfiguration(newStackBounds);
mStackSupervisor.resizeStackLocked(
stackId, !newStackBounds.isEmpty() ? newStackBounds : null /* bounds */,
- !newTempTaskBounds.isEmpty() ? newTempTaskBounds : null /* tempTaskBounds */,
- null /* tempTaskInsetBounds */, false /* preserveWindows */,
- false /* allowResizeInDockedMode */, deferResume);
+ null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
+ false /* preserveWindows */, false /* allowResizeInDockedMode */, deferResume);
}
/**
@@ -21485,6 +21535,7 @@
pendingChange.processState = uidRec != null
? uidRec.setProcState : ActivityManager.PROCESS_STATE_NONEXISTENT;
pendingChange.ephemeral = uidRec.ephemeral;
+ pendingChange.procStateSeq = uidRec != null ? uidRec.curProcStateSeq : 0;
// Directly update the power manager, since we sit on top of it and it is critical
// it be kept in sync (so wake locks will be held as soon as appropriate).
@@ -22906,16 +22957,9 @@
}
@Override
- public void notifyStartingWindowDrawn() {
+ public void notifyAppTransitionStarting(SparseIntArray reasons) {
synchronized (ActivityManagerService.this) {
- mStackSupervisor.mActivityMetricsLogger.notifyStartingWindowDrawn();
- }
- }
-
- @Override
- public void notifyAppTransitionStarting(int reason) {
- synchronized (ActivityManagerService.this) {
- mStackSupervisor.mActivityMetricsLogger.notifyTransitionStarting(reason);
+ mStackSupervisor.mActivityMetricsLogger.notifyTransitionStarting(reasons);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index ff796a54..ebbce02 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -1,24 +1,36 @@
package com.android.server.am;
+import static android.app.ActivityManager.START_SUCCESS;
+import static android.app.ActivityManager.START_TASK_TO_FRONT;
import static android.app.ActivityManager.StackId.ASSISTANT_STACK_ID;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
+import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
-
+import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_ACTIVITY_NAME;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DELAY_MS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityStack.STACK_INVISIBLE;
-import android.annotation.Nullable;
import android.app.ActivityManager.StackId;
import android.content.Context;
+import android.metrics.LogMaker;
import android.os.SystemClock;
import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
-import android.metrics.LogMaker;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.util.ArrayList;
@@ -48,12 +60,27 @@
private long mLastLogTimeSecs;
private final ActivityStackSupervisor mSupervisor;
private final Context mContext;
+ private final MetricsLogger mMetricsLogger = new MetricsLogger();
private long mCurrentTransitionStartTime = INVALID_START_TIME;
- private boolean mLoggedWindowsDrawn;
- private boolean mLoggedStartingWindowDrawn;
+
+ private int mCurrentTransitionDeviceUptime;
+ private int mCurrentTransitionDelayMs;
private boolean mLoggedTransitionStarting;
+ private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>();
+
+ private final class StackTransitionInfo {
+ private ActivityRecord launchedActivity;
+ private int startResult;
+ private boolean currentTransitionProcessRunning;
+ private int windowsDrawnDelayMs;
+ private int startingWindowDelayMs;
+ private int reason = APP_TRANSITION_TIMEOUT;
+ private boolean loggedWindowsDrawn;
+ private boolean loggedStartingWindowDrawn;
+ }
+
ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context) {
mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000;
mSupervisor = supervisor;
@@ -102,7 +129,9 @@
* activity.
*/
void notifyActivityLaunching() {
- mCurrentTransitionStartTime = System.currentTimeMillis();
+ if (!isAnyTransitionActive()) {
+ mCurrentTransitionStartTime = System.currentTimeMillis();
+ }
}
/**
@@ -118,9 +147,6 @@
launchedActivity.appInfo.uid)
: null;
final boolean processRunning = processRecord != null;
- final String componentName = launchedActivity != null
- ? launchedActivity.shortComponentName
- : null;
// We consider this a "process switch" if the process of the activity that gets launched
// didn't have an activity that was in started state. In this case, we assume that lot
@@ -129,7 +155,7 @@
final boolean processSwitch = processRecord == null
|| !hasStartedActivity(processRecord, launchedActivity);
- notifyActivityLaunched(resultCode, componentName, processRunning, processSwitch);
+ notifyActivityLaunched(resultCode, launchedActivity, processRunning, processSwitch);
}
private boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) {
@@ -151,92 +177,120 @@
*
* @param resultCode one of the ActivityManager.START_* flags, indicating the result of the
* launch
- * @param componentName the component name of the activity being launched
+ * @param launchedActivity the activity being launched
* @param processRunning whether the process that will contains the activity is already running
* @param processSwitch whether the process that will contain the activity didn't have any
* activity that was stopped, i.e. the started activity is "switching"
* processes
*/
- private void notifyActivityLaunched(int resultCode, @Nullable String componentName,
+ private void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity,
boolean processRunning, boolean processSwitch) {
- if (resultCode < 0 || componentName == null || !processSwitch) {
-
- // Failed to launch or it was not a process switch, so we don't care about the timing.
- reset();
+ // If we are already in an existing transition, only update the activity name, but not the
+ // other attributes.
+ final int stackId = launchedActivity != null && launchedActivity.getStack() != null
+ ? launchedActivity.getStack().mStackId
+ : INVALID_STACK_ID;
+ final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ if (launchedActivity != null && info != null) {
+ info.launchedActivity = launchedActivity;
return;
}
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_COMPONENT_NAME,
- componentName);
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_PROCESS_RUNNING,
- processRunning);
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS,
- (int) (SystemClock.uptimeMillis() / 1000));
+ final boolean otherStacksLaunching = mStackTransitionInfo.size() > 0 && info == null;
+ if ((resultCode < 0 || launchedActivity == null || !processSwitch
+ || stackId == INVALID_STACK_ID) && !otherStacksLaunching) {
- LogMaker builder = new LogMaker(MetricsEvent.APP_TRANSITION);
- builder.addTaggedData(MetricsEvent.APP_TRANSITION_COMPONENT_NAME, componentName);
- builder.addTaggedData(MetricsEvent.APP_TRANSITION_PROCESS_RUNNING, processRunning ? 1 : 0);
- builder.addTaggedData(MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS,
- SystemClock.uptimeMillis() / 1000);
- MetricsLogger.action(builder);
+ // Failed to launch or it was not a process switch, so we don't care about the timing.
+ reset(true /* abort */);
+ return;
+ } else if (otherStacksLaunching) {
+ // Don't log this stack but continue with the other stacks.
+ return;
+ }
+
+ final StackTransitionInfo newInfo = new StackTransitionInfo();
+ newInfo.launchedActivity = launchedActivity;
+ newInfo.currentTransitionProcessRunning = processRunning;
+ newInfo.startResult = resultCode;
+ mStackTransitionInfo.append(stackId, newInfo);
+ mCurrentTransitionDeviceUptime = (int) (SystemClock.uptimeMillis() / 1000);
}
/**
* Notifies the tracker that all windows of the app have been drawn.
*/
- void notifyWindowsDrawn() {
- if (!isTransitionActive() || mLoggedWindowsDrawn) {
+ void notifyWindowsDrawn(int stackId) {
+ final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ if (info == null || info.loggedWindowsDrawn) {
return;
}
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS,
- calculateCurrentDelay());
- mLoggedWindowsDrawn = true;
- if (mLoggedTransitionStarting) {
- reset();
+ info.windowsDrawnDelayMs = calculateCurrentDelay();
+ info.loggedWindowsDrawn = true;
+ if (allStacksWindowsDrawn() && mLoggedTransitionStarting) {
+ reset(false /* abort */);
}
}
/**
* Notifies the tracker that the starting window was drawn.
*/
- void notifyStartingWindowDrawn() {
- if (!isTransitionActive() || mLoggedStartingWindowDrawn) {
+ void notifyStartingWindowDrawn(int stackId) {
+ final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ if (info == null || info.loggedStartingWindowDrawn) {
return;
}
- mLoggedStartingWindowDrawn = true;
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS,
- calculateCurrentDelay());
+ info.loggedStartingWindowDrawn = true;
+ info.startingWindowDelayMs = calculateCurrentDelay();
}
/**
* Notifies the tracker that the app transition is starting.
*
- * @param reason The reason why we started it. Must be on of
- * ActivityManagerInternal.APP_TRANSITION_* reasons.
+ * @param stackIdReasons A map from stack id to a reason integer, which must be on of
+ * ActivityManagerInternal.APP_TRANSITION_* reasons.
*/
- void notifyTransitionStarting(int reason) {
- if (!isTransitionActive() || mLoggedTransitionStarting) {
+ void notifyTransitionStarting(SparseIntArray stackIdReasons) {
+ if (!isAnyTransitionActive() || mLoggedTransitionStarting) {
return;
}
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_REASON, reason);
- MetricsLogger.action(mContext, MetricsEvent.APP_TRANSITION_DELAY_MS,
- calculateCurrentDelay());
+ mCurrentTransitionDelayMs = calculateCurrentDelay();
mLoggedTransitionStarting = true;
- if (mLoggedWindowsDrawn) {
- reset();
+ for (int index = stackIdReasons.size() - 1; index >= 0; index--) {
+ final int stackId = stackIdReasons.keyAt(index);
+ final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ if (info == null) {
+ continue;
+ }
+ info.reason = stackIdReasons.valueAt(index);
+ }
+ if (allStacksWindowsDrawn()) {
+ reset(false /* abort */);
}
}
- private boolean isTransitionActive() {
- return mCurrentTransitionStartTime != INVALID_START_TIME;
+ private boolean allStacksWindowsDrawn() {
+ for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
+ if (!mStackTransitionInfo.valueAt(index).loggedWindowsDrawn) {
+ return false;
+ }
+ }
+ return true;
}
- private void reset() {
+ private boolean isAnyTransitionActive() {
+ return mCurrentTransitionStartTime != INVALID_START_TIME
+ && mStackTransitionInfo.size() > 0;
+ }
+
+ private void reset(boolean abort) {
+ if (!abort && isAnyTransitionActive()) {
+ logAppTransitionMultiEvents();
+ }
mCurrentTransitionStartTime = INVALID_START_TIME;
- mLoggedWindowsDrawn = false;
+ mCurrentTransitionDelayMs = -1;
mLoggedTransitionStarting = false;
- mLoggedStartingWindowDrawn = false;
+ mStackTransitionInfo.clear();
}
private int calculateCurrentDelay() {
@@ -244,4 +298,41 @@
// Shouldn't take more than 25 days to launch an app, so int is fine here.
return (int) (System.currentTimeMillis() - mCurrentTransitionStartTime);
}
+
+ private void logAppTransitionMultiEvents() {
+ for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
+ final StackTransitionInfo info = mStackTransitionInfo.valueAt(index);
+ final int type = getTransitionType(info);
+ if (type == -1) {
+ return;
+ }
+ final LogMaker builder = new LogMaker(APP_TRANSITION);
+ builder.setPackageName(info.launchedActivity.packageName);
+ builder.addTaggedData(APP_TRANSITION_ACTIVITY_NAME, info.launchedActivity.info.name);
+ builder.setType(type);
+ builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS,
+ mCurrentTransitionDeviceUptime);
+ builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs);
+ builder.setSubtype(info.reason);
+ if (info.startingWindowDelayMs != -1) {
+ builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS,
+ info.startingWindowDelayMs);
+ }
+ builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs);
+ mMetricsLogger.write(builder);
+ }
+ }
+
+ private int getTransitionType(StackTransitionInfo info) {
+ if (info.currentTransitionProcessRunning) {
+ if (info.startResult == START_SUCCESS) {
+ return TYPE_TRANSITION_WARM_LAUNCH;
+ } else if (info.startResult == START_TASK_TO_FRONT) {
+ return TYPE_TRANSITION_HOT_LAUNCH;
+ }
+ } else if (info.startResult == START_SUCCESS) {
+ return TYPE_TRANSITION_COLD_LAUNCH;
+ }
+ return -1;
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 77564bb..2e26bed 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -23,6 +23,7 @@
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
+import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OP_ENTER_PICTURE_IN_PICTURE_ON_HIDE;
@@ -890,6 +891,10 @@
return task != null ? (T) task.getStack() : null;
}
+ private int getStackId() {
+ return getStack() != null ? getStack().mStackId : INVALID_STACK_ID;
+ }
+
boolean changeWindowTranslucency(boolean toOpaque) {
if (fullscreen == toOpaque) {
return false;
@@ -1706,9 +1711,16 @@
}
@Override
+ public void onStartingWindowDrawn() {
+ synchronized (service) {
+ mStackSupervisor.mActivityMetricsLogger.notifyStartingWindowDrawn(getStackId());
+ }
+ }
+
+ @Override
public void onWindowsDrawn() {
synchronized (service) {
- mStackSupervisor.mActivityMetricsLogger.notifyWindowsDrawn();
+ mStackSupervisor.mActivityMetricsLogger.notifyWindowsDrawn(getStackId());
if (displayStartTime != 0) {
reportLaunchTimeLocked(SystemClock.uptimeMillis());
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index a679a31..2d91cad 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -120,6 +120,7 @@
import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.StackWindowController;
import com.android.server.wm.StackWindowListener;
+import com.android.server.wm.TaskStack;
import com.android.server.wm.WindowManagerService;
import java.io.FileDescriptor;
@@ -544,10 +545,13 @@
mActivityContainer.mActivityDisplay.mDisplay.getSize(out);
}
- void getStackDockedModeBounds(Rect outBounds, Rect outTempBounds, Rect outTempInsetBounds,
- boolean ignoreVisibility) {
- mWindowContainerController.getStackDockedModeBounds(outBounds, outTempBounds,
- outTempInsetBounds, ignoreVisibility);
+ /**
+ * @see ActivityStack.getStackDockedModeBounds(Rect, Rect, Rect, boolean)
+ */
+ void getStackDockedModeBounds(Rect currentTempTaskBounds, Rect outStackBounds,
+ Rect outTempTaskBounds, boolean ignoreVisibility) {
+ mWindowContainerController.getStackDockedModeBounds(currentTempTaskBounds,
+ outStackBounds, outTempTaskBounds, ignoreVisibility);
}
void prepareFreezingTaskBounds() {
@@ -562,8 +566,8 @@
outBounds.setEmpty();
}
- void getBoundsForNewConfiguration(Rect outBounds, Rect outTempBounds) {
- mWindowContainerController.getBoundsForNewConfiguration(outBounds, outTempBounds);
+ void getBoundsForNewConfiguration(Rect outBounds) {
+ mWindowContainerController.getBoundsForNewConfiguration(outBounds);
}
void positionChildWindowContainerAtTop(TaskRecord child) {
@@ -1582,6 +1586,16 @@
: STACK_INVISIBLE;
}
+ // Set home stack to invisible when it is below but not immediately below the docked stack
+ // A case would be if recents stack exists but has no tasks and is below the docked stack
+ // and home stack is below recents
+ if (mStackId == HOME_STACK_ID) {
+ int dockedStackIndex = mStacks.indexOf(mStackSupervisor.getStack(DOCKED_STACK_ID));
+ if (dockedStackIndex > stackIndex && stackIndex != dockedStackIndex - 1) {
+ return STACK_INVISIBLE;
+ }
+ }
+
// Find the first stack behind front stack that actually got something visible.
int stackBehindTopIndex = mStacks.indexOf(topStack) - 1;
while (stackBehindTopIndex >= 0 &&
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index bd70861..2ae815e30 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -21,8 +21,6 @@
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
-import static android.app.ActivityManager.RESIZE_MODE_FORCED;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID;
@@ -33,6 +31,7 @@
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.LAST_STATIC_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
+import static android.app.ActivityManager.StackId.RECENTS_STACK_ID;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -96,6 +95,7 @@
import static java.lang.Integer.MAX_VALUE;
import android.Manifest;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.Activity;
@@ -104,7 +104,6 @@
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityOptions;
-import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.IActivityContainerCallback;
import android.app.ProfilerInfo;
@@ -178,10 +177,11 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Objects;
import java.util.Set;
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
@@ -247,15 +247,31 @@
// Force the focus to change to the stack we are moving a task to..
static final boolean FORCE_FOCUS = true;
- // Restore task from the saved recents if it can't be found in any live stack.
- static final boolean RESTORE_FROM_RECENTS = true;
-
// Don't execute any calls to resume.
static final boolean DEFER_RESUME = true;
// Used to indicate that a task is removed it should also be removed from recents.
static final boolean REMOVE_FROM_RECENTS = true;
+ /**
+ * The modes which affect which tasks are returned when calling
+ * {@link ActivityStackSupervisor#anyTaskForIdLocked(int)}.
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ MATCH_TASK_IN_STACKS_ONLY,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE
+ })
+ public @interface AnyTaskForIdMatchTaskMode {}
+ // Match only tasks in the current stacks
+ static final int MATCH_TASK_IN_STACKS_ONLY = 0;
+ // Match either tasks in the current stacks, or in the recent tasks if not found in the stacks
+ static final int MATCH_TASK_IN_STACKS_OR_RECENT_TASKS = 1;
+ // Match either tasks in the current stacks, or in the recent tasks, restoring it to the
+ // provided stack id
+ static final int MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE = 2;
+
// Activity actions an app cannot start if it uses a permission which is not granted.
private static final ArrayMap<String, String> ACTION_TO_RUNTIME_PERMISSION =
new ArrayMap<>();
@@ -670,6 +686,13 @@
mHomeStack.moveToFront(reason);
}
+ void moveRecentsStackToFront(String reason) {
+ final ActivityStack recentsStack = getStack(RECENTS_STACK_ID);
+ if (recentsStack != null) {
+ recentsStack.moveToFront(reason);
+ }
+ }
+
/** Returns true if the focus activity was adjusted to the home stack top activity. */
boolean moveHomeStackTaskToTop(String reason) {
mHomeStack.moveHomeStackTaskToTop();
@@ -705,18 +728,26 @@
}
TaskRecord anyTaskForIdLocked(int id) {
- return anyTaskForIdLocked(id, RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ return anyTaskForIdLocked(id, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE,
+ INVALID_STACK_ID);
}
/**
* Returns a {@link TaskRecord} for the input id if available. Null otherwise.
* @param id Id of the task we would like returned.
- * @param restoreFromRecents If the id was not in the active list, but was found in recents,
- * restore the task from recents to the active list.
+ * @param matchMode The mode to match the given task id in.
* @param stackId The stack to restore the task to (default launch stack will be used if
- * stackId is {@link android.app.ActivityManager.StackId#INVALID_STACK_ID}).
+ * stackId is {@link android.app.ActivityManager.StackId#INVALID_STACK_ID}). Only
+ * valid if the matchMode is
+ * {@link #MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE}.
*/
- TaskRecord anyTaskForIdLocked(int id, boolean restoreFromRecents, int stackId) {
+ TaskRecord anyTaskForIdLocked(int id, @AnyTaskForIdMatchTaskMode int matchMode, int stackId) {
+ // If there is a stack id set, ensure that we are attempting to actually restore a task
+ if (matchMode != MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE &&
+ stackId != INVALID_STACK_ID) {
+ throw new IllegalArgumentException("Should not specify stackId for non-restore lookup");
+ }
+
int numDisplays = mActivityDisplays.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
@@ -729,18 +760,23 @@
}
}
- // Don't give up! Look in recents.
- if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Looking for task id=" + id + " in recents");
- TaskRecord task = mRecentTasks.taskForIdLocked(id);
- if (task == null) {
- if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "\tDidn't find task id=" + id + " in recents");
+ // If we are matching stack tasks only, return now
+ if (matchMode == MATCH_TASK_IN_STACKS_ONLY) {
return null;
}
- if (!restoreFromRecents) {
+ // Otherwise, check the recent tasks and return if we find it there and we are not restoring
+ // the task from recents
+ if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Looking for task id=" + id + " in recents");
+ TaskRecord task = mRecentTasks.taskForIdLocked(id);
+ if (matchMode == MATCH_TASK_IN_STACKS_OR_RECENT_TASKS) {
+ if (DEBUG_RECENTS && task == null) {
+ Slog.d(TAG_RECENTS, "\tDidn't find task id=" + id + " in recents");
+ }
return task;
}
+ // Implicitly, this case is MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE
if (!restoreRecentTaskLocked(task, stackId)) {
if (DEBUG_RECENTS) Slog.w(TAG_RECENTS,
"Couldn't restore task id=" + id + " found in recents");
@@ -836,7 +872,7 @@
// was 10, user 0 could only have taskIds 0 to 9, user 1: 10 to 19, user 2: 20 to 29, so on.
int candidateTaskId = nextTaskIdForUser(currentTaskId, userId);
while (mRecentTasks.taskIdTakenForUserLocked(candidateTaskId, userId)
- || anyTaskForIdLocked(candidateTaskId, !RESTORE_FROM_RECENTS,
+ || anyTaskForIdLocked(candidateTaskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS,
INVALID_STACK_ID) != null) {
candidateTaskId = nextTaskIdForUser(candidateTaskId, userId);
if (candidateTaskId == currentTaskId) {
@@ -2048,6 +2084,11 @@
if (!createStaticStackIfNeeded || !StackId.isStaticStack(stackId)) {
return null;
}
+ if (stackId == DOCKED_STACK_ID) {
+ // Make sure recents stack exist when creating a dock stack as it normally need to be on
+ // the other side of the docked stack and we make visibility decisions based on that.
+ getStack(RECENTS_STACK_ID, CREATE_IF_NEEDED, createOnTop);
+ }
return (T) createStackOnDisplay(stackId, DEFAULT_DISPLAY, createOnTop);
}
@@ -2236,7 +2277,7 @@
for (int i = mResizingTasksDuringAnimation.size() - 1; i >= 0; i--) {
final int taskId = mResizingTasksDuringAnimation.valueAt(i);
final TaskRecord task =
- anyTaskForIdLocked(taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ anyTaskForIdLocked(taskId, MATCH_TASK_IN_STACKS_ONLY, INVALID_STACK_ID);
if (task != null) {
task.setTaskDockedResizing(false);
}
@@ -2362,19 +2403,19 @@
// static stacks need to be adjusted so they don't overlap with the docked stack.
// We get the bounds to use from window manager which has been adjusted for any
// screen controls and is also the same for all stacks.
- final Rect tempOtherTaskRect = new Rect();
- final Rect tempOtherTaskInsetRect = new Rect();
+ final Rect otherTaskRect = new Rect();
for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
final ActivityStack current = getStack(i);
if (current != null && StackId.isResizeableByDockedStack(i)) {
- current.getStackDockedModeBounds(tempRect, tempOtherTaskRect,
- tempOtherTaskInsetRect, true /* ignoreVisibility */);
+ current.getStackDockedModeBounds(
+ tempOtherTaskBounds /* currentTempTaskBounds */,
+ tempRect /* outStackBounds */,
+ otherTaskRect /* outTempTaskBounds */, true /* ignoreVisibility */);
+
resizeStackLocked(i, tempRect,
- !tempOtherTaskRect.isEmpty() ? tempOtherTaskRect :
- tempOtherTaskBounds,
- !tempOtherTaskInsetRect.isEmpty() ? tempOtherTaskInsetRect :
- tempOtherTaskInsetBounds,
- preserveWindows, true /* allowResizeInDockedMode */, deferResume);
+ !otherTaskRect.isEmpty() ? otherTaskRect : tempOtherTaskBounds,
+ tempOtherTaskInsetBounds, preserveWindows,
+ true /* allowResizeInDockedMode */, deferResume);
}
}
}
@@ -2480,7 +2521,8 @@
* @return Returns true if the given task was found and removed.
*/
boolean removeTaskByIdLocked(int taskId, boolean killProcess, boolean removeFromRecents) {
- final TaskRecord tr = anyTaskForIdLocked(taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID);
+ final TaskRecord tr = anyTaskForIdLocked(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS,
+ INVALID_STACK_ID);
if (tr != null) {
tr.removeTaskActivitiesLocked();
cleanUpRemovedTaskLocked(tr, killProcess, removeFromRecents);
@@ -4771,7 +4813,8 @@
mWindowManager.prepareAppTransition(TRANSIT_DOCK_TASK_FROM_RECENTS, false);
}
- task = anyTaskForIdLocked(taskId, RESTORE_FROM_RECENTS, launchStackId);
+ task = anyTaskForIdLocked(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE,
+ launchStackId);
if (task == null) {
continueUpdateBounds(HOME_STACK_ID);
mWindowManager.executeAppTransition();
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 33889ba..2bbfc21 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1562,9 +1562,14 @@
// activity. Well that should not be too hard...
// Note: we must persist the {@link TaskRecord} first as intentActivity could be
// removed from calling performClearTaskLocked (For example, if it is being brought out
- // of history or if it is finished immediately), thus disassociating the task.
- mReuseTask = intentActivity.task;
- mReuseTask.performClearTaskLocked();
+ // of history or if it is finished immediately), thus disassociating the task. Also note
+ // that mReuseTask is reset as a result of {@link TaskRecord#performClearTaskLocked}
+ // launching another activity.
+ // TODO(b/36119896): We shouldn't trigger activity launches in this path since we are
+ // already launching one.
+ final TaskRecord task = intentActivity.task;
+ task.performClearTaskLocked();
+ mReuseTask = task;
mReuseTask.setIntent(mStartActivity);
// When we clear the task - focus will be adjusted, which will bring another task
diff --git a/services/core/java/com/android/server/am/BroadcastFilter.java b/services/core/java/com/android/server/am/BroadcastFilter.java
index 986b8ea..f96b06f 100644
--- a/services/core/java/com/android/server/am/BroadcastFilter.java
+++ b/services/core/java/com/android/server/am/BroadcastFilter.java
@@ -29,15 +29,20 @@
final String requiredPermission;
final int owningUid;
final int owningUserId;
+ final boolean instantApp;
+ final boolean visibleToInstantApp;
BroadcastFilter(IntentFilter _filter, ReceiverList _receiverList,
- String _packageName, String _requiredPermission, int _owningUid, int _userId) {
+ String _packageName, String _requiredPermission, int _owningUid, int _userId,
+ boolean _instantApp, boolean _visibleToInstantApp) {
super(_filter);
receiverList = _receiverList;
packageName = _packageName;
requiredPermission = _requiredPermission;
owningUid = _owningUid;
owningUserId = _userId;
+ instantApp = _instantApp;
+ visibleToInstantApp = _visibleToInstantApp;
}
public void dump(PrintWriter pw, String prefix) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index c9d19cb..2787895 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -623,6 +623,37 @@
skip = true;
}
+ // Ensure that broadcasts are only sent to other Instant Apps if they are marked as
+ // visible to Instant Apps.
+ final boolean visibleToInstantApps =
+ (r.intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) != 0;
+
+ if (!skip && !visibleToInstantApps && filter.instantApp
+ && filter.receiverList.uid != r.callingUid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent.toString()
+ + " to " + filter.receiverList.app
+ + " (pid=" + filter.receiverList.pid
+ + ", uid=" + filter.receiverList.uid + ")"
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")"
+ + " not specifying FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS");
+ skip = true;
+ }
+
+ if (!skip && !filter.visibleToInstantApp && r.callerInstantApp
+ && filter.receiverList.uid != r.callingUid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent.toString()
+ + " to " + filter.receiverList.app
+ + " (pid=" + filter.receiverList.pid
+ + ", uid=" + filter.receiverList.uid + ")"
+ + " requires receiver be visible to instant apps"
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")");
+ skip = true;
+ }
+
if (skip) {
r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED;
return;
@@ -1121,6 +1152,30 @@
skip = true;
}
}
+ final boolean visibleToInstantApps =
+ (r.intent.getFlags() & Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS) != 0;
+ if (!skip && info.activityInfo.applicationInfo.isInstantApp()
+ && !visibleToInstantApps
+ && r.callingUid != info.activityInfo.applicationInfo.uid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent
+ + " to " + component.flattenToShortString()
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")"
+ + " not specifying FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS");
+ skip = true;
+ }
+ if (!skip && r.callerInstantApp
+ && (info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0
+ && r.callingUid != info.activityInfo.applicationInfo.uid) {
+ Slog.w(TAG, "Instant App Denial: receiving "
+ + r.intent
+ + " to " + component.flattenToShortString()
+ + " requires receiver have visibleToInstantApps set"
+ + " due to sender " + r.callerPackage
+ + " (uid " + r.callingUid + ")");
+ skip = true;
+ }
if (!skip) {
r.manifestCount++;
} else {
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 1e7911a..7764be7 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -48,6 +48,7 @@
final String callerPackage; // who sent this
final int callingPid; // the pid of who sent this
final int callingUid; // the uid of who sent this
+ final boolean callerInstantApp; // caller is an Instant App?
final boolean ordered; // serialize the send to receivers?
final boolean sticky; // originated from existing sticky data?
final boolean initialSticky; // initial broadcast from register to sticky?
@@ -214,11 +215,10 @@
BroadcastRecord(BroadcastQueue _queue,
Intent _intent, ProcessRecord _callerApp, String _callerPackage,
- int _callingPid, int _callingUid, String _resolvedType, String[] _requiredPermissions,
- int _appOp, BroadcastOptions _options, List _receivers, IIntentReceiver _resultTo,
- int _resultCode, String _resultData, Bundle _resultExtras, boolean _serialized,
- boolean _sticky, boolean _initialSticky,
- int _userId) {
+ int _callingPid, int _callingUid, boolean _callerInstantApp, String _resolvedType,
+ String[] _requiredPermissions, int _appOp, BroadcastOptions _options, List _receivers,
+ IIntentReceiver _resultTo, int _resultCode, String _resultData, Bundle _resultExtras,
+ boolean _serialized, boolean _sticky, boolean _initialSticky, int _userId) {
if (_intent == null) {
throw new NullPointerException("Can't construct with a null intent");
}
@@ -229,6 +229,7 @@
callerPackage = _callerPackage;
callingPid = _callingPid;
callingUid = _callingUid;
+ callerInstantApp = _callerInstantApp;
resolvedType = _resolvedType;
requiredPermissions = _requiredPermissions;
appOp = _appOp;
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index aa7ab15..1708fe5 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -52,4 +52,8 @@
void setPictureInPictureActions(List<RemoteAction> actions) {
getWindowContainerController().setPictureInPictureActions(actions);
}
+
+ boolean isBoundsAnimatingToFullscreen() {
+ return getWindowContainerController().isBoundsAnimatingToFullscreen();
+ }
}
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index 9dde39e..9deabb3 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -55,6 +55,9 @@
import java.util.List;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
+import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
public class TaskPersister {
static final String TAG = "TaskPersister";
@@ -452,7 +455,8 @@
final int taskId = task.taskId;
if (mStackSupervisor.anyTaskForIdLocked(taskId,
- /* restoreFromRecents= */ false, HOME_STACK_ID) != null) {
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS,
+ INVALID_STACK_ID) != null) {
// Should not happen.
Slog.wtf(TAG, "Existing task with taskId " + taskId + "found");
} else if (userId != task.userId) {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 3f33f41..c0c433e 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -690,6 +690,11 @@
}
kept = resize(bounds, RESIZE_MODE_FORCED, !mightReplaceWindow, deferResume);
} else if (stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID) {
+ if (stackId == DOCKED_STACK_ID && moveStackMode == REPARENT_KEEP_STACK_AT_FRONT) {
+ // Move recents to front so it is not behind home stack when going into docked
+ // mode
+ mService.mStackSupervisor.moveRecentsStackToFront(reason);
+ }
kept = resize(toStack.mBounds, RESIZE_MODE_SYSTEM, !mightReplaceWindow,
deferResume);
}
@@ -713,7 +718,12 @@
supervisor.handleNonResizableTaskIfNeeded(this, preferredStackId, stackId);
- return (preferredStackId == stackId);
+ boolean successful = (preferredStackId == stackId);
+ if (successful && stackId == DOCKED_STACK_ID) {
+ // If task moved to docked stack - show recents if needed.
+ mService.mWindowManager.showRecentApps(false /* fromHome */);
+ }
+ return successful;
}
void cancelWindowTransition() {
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index f15543a..cf6c1e1 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -53,6 +53,7 @@
int change;
int processState;
boolean ephemeral;
+ long procStateSeq;
}
ChangeItem pendingChange;
diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java
index 445f606..da56a07 100644
--- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java
+++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java
@@ -201,12 +201,18 @@
for (IpConnectivityEvent ev : IpConnectivityEventBuilder.toProto(events)) {
pw.print(ev.toString());
}
+ if (mNetdListener != null) {
+ mNetdListener.listAsProtos(pw);
+ }
return;
}
for (ConnectivityMetricsEvent ev : events) {
pw.println(ev.toString());
}
+ if (mNetdListener != null) {
+ mNetdListener.list(pw);
+ }
}
private void cmdStats(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
index f555f08..7b9c60c 100644
--- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
+++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
@@ -204,10 +204,15 @@
// TODO: migrate DnsEventBatch to IpConnectivityLogClass.DNSLatencies
}
- private IpConnectivityEvent flushConnectStats() {
+ private IpConnectivityEvent connectStatsProto() {
+ // TODO: add transport information
IpConnectivityEvent ev = new IpConnectivityEvent();
ev.setConnectStatistics(mConnectStats.toProto());
- // TODO: add transport information
+ return ev;
+ }
+
+ private IpConnectivityEvent flushConnectStats() {
+ IpConnectivityEvent ev = connectStatsProto();
mConnectStats = makeConnectStats();
return ev;
}
@@ -216,11 +221,19 @@
IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
pw.println(TAG + ":");
pw.increaseIndent();
+ list(pw);
+ pw.decreaseIndent();
+ }
+
+ public synchronized void list(PrintWriter pw) {
for (DnsEventBatch batch : mEventBatches.values()) {
pw.println(batch.toString());
}
- // TODO: also dump ConnectStats
- pw.decreaseIndent();
+ pw.println(mConnectStats.toString());
+ }
+
+ public synchronized void listAsProtos(PrintWriter pw) {
+ pw.println(connectStatsProto().toString());
}
private ConnectStats makeConnectStats() {
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 60357c2..5258b87 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -78,8 +78,8 @@
import com.android.server.connectivity.tethering.IPv6TetheringCoordinator;
import com.android.server.connectivity.tethering.IPv6TetheringInterfaceServices;
import com.android.server.connectivity.tethering.OffloadController;
-import com.android.server.connectivity.tethering.TetheringConfiguration;
import com.android.server.connectivity.tethering.TetherInterfaceStateMachine;
+import com.android.server.connectivity.tethering.TetheringConfiguration;
import com.android.server.connectivity.tethering.UpstreamNetworkMonitor;
import com.android.server.net.BaseNetworkObserver;
@@ -103,8 +103,7 @@
*/
public class Tethering extends BaseNetworkObserver implements IControlsTethering {
- private final Context mContext;
- private final static String TAG = "Tethering";
+ private final static String TAG = Tethering.class.getSimpleName();
private final static boolean DBG = false;
private final static boolean VDBG = false;
@@ -116,48 +115,43 @@
private static final SparseArray<String> sMagicDecoderRing =
MessageUtils.findMessageNames(messageClasses);
- private volatile TetheringConfiguration mConfig;
+ // {@link ComponentName} of the Service used to run tether provisioning.
+ private static final ComponentName TETHER_SERVICE = ComponentName.unflattenFromString(Resources
+ .getSystem().getString(com.android.internal.R.string.config_wifi_tether_enable));
+
+ private static class TetherState {
+ public final TetherInterfaceStateMachine stateMachine;
+ public int lastState;
+ public int lastError;
+ public TetherState(TetherInterfaceStateMachine sm) {
+ stateMachine = sm;
+ // Assume all state machines start out available and with no errors.
+ lastState = IControlsTethering.STATE_AVAILABLE;
+ lastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+ }
+ }
// used to synchronize public access to members
private final Object mPublicSync;
-
+ private final Context mContext;
+ private final ArrayMap<String, TetherState> mTetherStates;
+ private final BroadcastReceiver mStateReceiver;
private final INetworkManagementService mNMService;
private final INetworkStatsService mStatsService;
private final INetworkPolicyManager mPolicyManager;
private final Looper mLooper;
private final MockableSystemProperties mSystemProperties;
-
- private static class TetherState {
- public final TetherInterfaceStateMachine mStateMachine;
- public int mLastState;
- public int mLastError;
- public TetherState(TetherInterfaceStateMachine sm) {
- mStateMachine = sm;
- // Assume all state machines start out available and with no errors.
- mLastState = IControlsTethering.STATE_AVAILABLE;
- mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
- }
- }
- private final ArrayMap<String, TetherState> mTetherStates;
-
- private final BroadcastReceiver mStateReceiver;
-
- // {@link ComponentName} of the Service used to run tether provisioning.
- private static final ComponentName TETHER_SERVICE = ComponentName.unflattenFromString(Resources
- .getSystem().getString(com.android.internal.R.string.config_wifi_tether_enable));
-
private final StateMachine mTetherMasterSM;
private final OffloadController mOffloadController;
private final UpstreamNetworkMonitor mUpstreamNetworkMonitor;
- private String mCurrentUpstreamIface;
+ private volatile TetheringConfiguration mConfig;
+ private String mCurrentUpstreamIface;
private Notification.Builder mTetheredNotificationBuilder;
private int mLastNotificationId;
-
private boolean mRndisEnabled; // track the RNDIS function enabled state
private boolean mUsbTetherRequested; // true if USB tethering should be started
// when RNDIS is enabled
-
// True iff WiFi tethering should be started when soft AP is ready.
private boolean mWifiTetherRequested;
@@ -228,7 +222,7 @@
}
} else {
if (interfaceType == ConnectivityManager.TETHERING_BLUETOOTH) {
- tetherState.mStateMachine.sendMessage(
+ tetherState.stateMachine.sendMessage(
TetherInterfaceStateMachine.CMD_INTERFACE_DOWN);
mTetherStates.remove(iface);
} else {
@@ -290,13 +284,12 @@
}
return;
}
- tetherState.mStateMachine.sendMessage(TetherInterfaceStateMachine.CMD_INTERFACE_DOWN);
+ tetherState.stateMachine.sendMessage(TetherInterfaceStateMachine.CMD_INTERFACE_DOWN);
mTetherStates.remove(iface);
}
}
- public void startTethering(int type, ResultReceiver receiver,
- boolean showProvisioningUi) {
+ public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi) {
if (!isTetherProvisioningRequired()) {
enableTetheringInternal(type, true, receiver);
return;
@@ -528,11 +521,11 @@
}
// Ignore the error status of the interface. If the interface is available,
// the errors are referring to past tethering attempts anyway.
- if (tetherState.mLastState != IControlsTethering.STATE_AVAILABLE) {
+ if (tetherState.lastState != IControlsTethering.STATE_AVAILABLE) {
Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
- tetherState.mStateMachine.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_REQUESTED);
+ tetherState.stateMachine.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_REQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
}
@@ -545,11 +538,11 @@
Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
- if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) {
+ if (tetherState.lastState != IControlsTethering.STATE_TETHERED) {
Log.e(TAG, "Tried to untether an untethered iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
- tetherState.mStateMachine.sendMessage(
+ tetherState.stateMachine.sendMessage(
TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
@@ -569,7 +562,7 @@
", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
- return tetherState.mLastError;
+ return tetherState.lastError;
}
}
@@ -590,11 +583,11 @@
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
String iface = mTetherStates.keyAt(i);
- if (tetherState.mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
erroredList.add(iface);
- } else if (tetherState.mLastState == IControlsTethering.STATE_AVAILABLE) {
+ } else if (tetherState.lastState == IControlsTethering.STATE_AVAILABLE) {
availableList.add(iface);
- } else if (tetherState.mLastState == IControlsTethering.STATE_TETHERED) {
+ } else if (tetherState.lastState == IControlsTethering.STATE_TETHERED) {
if (cfg.isUsb(iface)) {
usbTethered = true;
} else if (cfg.isWifi(iface)) {
@@ -768,7 +761,7 @@
// themselves down.
for (int i = 0; i < mTetherStates.size(); i++) {
TetherInterfaceStateMachine tism =
- mTetherStates.valueAt(i).mStateMachine;
+ mTetherStates.valueAt(i).stateMachine;
if (tism.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
tism.sendMessage(
TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
@@ -883,7 +876,7 @@
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
- if (tetherState.mLastState == IControlsTethering.STATE_TETHERED) {
+ if (tetherState.lastState == IControlsTethering.STATE_TETHERED) {
list.add(mTetherStates.keyAt(i));
}
}
@@ -896,7 +889,7 @@
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
- if (tetherState.mLastState == IControlsTethering.STATE_AVAILABLE) {
+ if (tetherState.lastState == IControlsTethering.STATE_AVAILABLE) {
list.add(mTetherStates.keyAt(i));
}
}
@@ -913,7 +906,7 @@
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
- if (tetherState.mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
list.add(mTetherStates.keyAt(i));
}
}
@@ -1315,7 +1308,7 @@
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
- if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) {
+ if (tetherState.lastState != IControlsTethering.STATE_TETHERED) {
continue; // Skip interfaces that aren't tethered.
}
String iface = mTetherStates.keyAt(i);
@@ -1603,7 +1596,7 @@
final TetherState tetherState = mTetherStates.valueAt(i);
pw.print(iface + " - ");
- switch (tetherState.mLastState) {
+ switch (tetherState.lastState) {
case IControlsTethering.STATE_UNAVAILABLE:
pw.print("UnavailableState");
break;
@@ -1617,7 +1610,7 @@
pw.print("UnknownState");
break;
}
- pw.println(" - lastError = " + tetherState.mLastError);
+ pw.println(" - lastError = " + tetherState.lastError);
}
pw.decreaseIndent();
}
@@ -1629,9 +1622,9 @@
int state, int error) {
synchronized (mPublicSync) {
TetherState tetherState = mTetherStates.get(iface);
- if (tetherState != null && tetherState.mStateMachine.equals(who)) {
- tetherState.mLastState = state;
- tetherState.mLastError = error;
+ if (tetherState != null && tetherState.stateMachine.equals(who)) {
+ tetherState.lastState = state;
+ tetherState.lastError = error;
} else {
if (DBG) Log.d(TAG, "got notification from stale iface " + iface);
}
@@ -1675,7 +1668,7 @@
interfaceType, mNMService, mStatsService, this,
new IPv6TetheringInterfaceServices(iface, mNMService)));
mTetherStates.put(iface, tetherState);
- tetherState.mStateMachine.start();
+ tetherState.stateMachine.start();
}
private static String[] copy(String[] strarray) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index d81e092..a50ec49f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -72,7 +72,8 @@
@ServiceThreadOnly
private boolean mArcEstablished = false;
- // Stores whether ARC feature is enabled per port. True by default for all the ARC-enabled ports.
+ // Stores whether ARC feature is enabled per port.
+ // True by default for all the ARC-enabled ports.
private final SparseBooleanArray mArcFeatureEnabled = new SparseBooleanArray();
// Whether System audio mode is activated or not.
@@ -80,6 +81,10 @@
@GuardedBy("mLock")
private boolean mSystemAudioActivated = false;
+ // Whether the System Audio Control feature is enabled or not. True by default.
+ @GuardedBy("mLock")
+ private boolean mSystemAudioControlFeatureEnabled;
+
// The previous port id (input) before switching to the new one. This is remembered in order to
// be able to switch to it upon receiving <Inactive Source> from currently active source.
// This remains valid only when the active source was switched via one touch play operation
@@ -186,6 +191,8 @@
mAutoDeviceOff = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
true);
mAutoWakeup = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED, true);
+ mSystemAudioControlFeatureEnabled =
+ mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);
mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
}
@@ -778,14 +785,11 @@
addAndStartAction(new HotplugDetectionAction(HdmiCecLocalDeviceTv.this));
addAndStartAction(new PowerStatusMonitorAction(HdmiCecLocalDeviceTv.this));
- // If there is AVR, initiate System Audio Auto initiation action,
- // which turns on and off system audio according to last system
- // audio setting.
HdmiDeviceInfo avr = getAvrDeviceInfo();
if (avr != null) {
onNewAvrAdded(avr);
} else {
- setSystemAudioMode(false, true);
+ setSystemAudioMode(false);
}
}
});
@@ -818,13 +822,13 @@
void changeSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {
assertRunOnServiceThread();
if (!mService.isControlEnabled() || hasAction(DeviceDiscoveryAction.class)) {
- setSystemAudioMode(false, true);
+ setSystemAudioMode(false);
invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
return;
}
HdmiDeviceInfo avr = getAvrDeviceInfo();
if (avr == null) {
- setSystemAudioMode(false, true);
+ setSystemAudioMode(false);
invokeCallback(callback, HdmiControlManager.RESULT_TARGET_NOT_AVAILABLE);
return;
}
@@ -834,12 +838,13 @@
}
// # Seq 25
- void setSystemAudioMode(boolean on, boolean updateSetting) {
- HdmiLogger.debug("System Audio Mode change[old:%b new:%b]", mSystemAudioActivated, on);
-
- if (updateSetting) {
- mService.writeBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, on);
+ void setSystemAudioMode(boolean on) {
+ if (!isSystemAudioControlFeatureEnabled() && on) {
+ HdmiLogger.debug("Cannot turn on system audio mode "
+ + "because the System Audio Control feature is disabled.");
+ return;
}
+ HdmiLogger.debug("System Audio Mode change[old:%b new:%b]", mSystemAudioActivated, on);
updateAudioManagerForSystemAudio(on);
synchronized (mLock) {
if (mSystemAudioActivated != on) {
@@ -863,8 +868,21 @@
}
}
- boolean getSystemAudioModeSetting() {
- return mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_ENABLED, false);
+ @ServiceThreadOnly
+ void setSystemAudioControlFeatureEnabled(boolean enabled) {
+ assertRunOnServiceThread();
+ synchronized (mLock) {
+ mSystemAudioControlFeatureEnabled = enabled;
+ }
+ if (hasSystemAudioDevice()) {
+ changeSystemAudioMode(enabled, null);
+ }
+ }
+
+ boolean isSystemAudioControlFeatureEnabled() {
+ synchronized (mLock) {
+ return mSystemAudioControlFeatureEnabled;
+ }
}
/**
@@ -1112,6 +1130,7 @@
@ServiceThreadOnly
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) {
assertRunOnServiceThread();
+ boolean systemAudioStatus = HdmiUtils.parseCommandParamSystemAudioStatus(message);
if (!isMessageForSystemAudio(message)) {
if (getAvrDeviceInfo() == null) {
// AVR may not have been discovered yet. Delay the message processing.
@@ -1121,10 +1140,15 @@
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
}
return true;
+ } else if (systemAudioStatus && !isSystemAudioControlFeatureEnabled()) {
+ HdmiLogger.debug("Ignoring <Set System Audio Mode> message "
+ + "because the System Audio Control feature is disabled: %s", message);
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ return true;
}
removeAction(SystemAudioAutoInitiationAction.class);
SystemAudioActionFromAvr action = new SystemAudioActionFromAvr(this,
- message.getSource(), HdmiUtils.parseCommandParamSystemAudioStatus(message), null);
+ message.getSource(), systemAudioStatus, null);
addAndStartAction(action);
return true;
}
@@ -1138,7 +1162,7 @@
// Ignore this message.
return true;
}
- setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message), true);
+ setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message));
return true;
}
@@ -1882,6 +1906,7 @@
pw.println("mArcFeatureEnabled: " + mArcFeatureEnabled);
pw.println("mSystemAudioActivated: " + mSystemAudioActivated);
pw.println("mSystemAudioMute: " + mSystemAudioMute);
+ pw.println("mSystemAudioControlFeatureEnabled: " + mSystemAudioControlFeatureEnabled);
pw.println("mAutoDeviceOff: " + mAutoDeviceOff);
pw.println("mAutoWakeup: " + mAutoWakeup);
pw.println("mSkipRoutingControl: " + mSkipRoutingControl);
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index fc86d68..6864e1e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -486,6 +486,7 @@
Global.HDMI_CONTROL_ENABLED,
Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
+ Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
Global.MHL_INPUT_SWITCHING_ENABLED,
Global.MHL_POWER_CHARGE_ENABLED
};
@@ -524,6 +525,11 @@
}
// No need to propagate to HAL.
break;
+ case Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED:
+ if (isTvDeviceEnabled()) {
+ tv().setSystemAudioControlFeatureEnabled(enabled);
+ }
+ break;
case Global.MHL_INPUT_SWITCHING_ENABLED:
setMhlInputChangeEnabled(enabled);
break;
diff --git a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
index e1bcd99..7670dcc 100644
--- a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
+++ b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
@@ -262,8 +262,7 @@
return;
}
- // Turn off system audio mode and update settings.
- tv().setSystemAudioMode(false, true);
+ tv().setSystemAudioMode(false);
if (tv().isArcEstablished()) {
tv().enableAudioReturnChannel(false);
addAndStartAction(new RequestArcTerminationAction(localDevice(), address));
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
index af1a85d..449b208 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
@@ -133,7 +133,7 @@
}
protected void setSystemAudioMode(boolean mode) {
- tv().setSystemAudioMode(mode, true);
+ tv().setSystemAudioMode(mode);
}
@Override
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
index 01063b7..d347a91 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
@@ -50,7 +50,7 @@
@Override
public void onSendCompleted(int error) {
if (error != SendMessageResult.SUCCESS) {
- tv().setSystemAudioMode(false, true);
+ tv().setSystemAudioMode(false);
finish();
}
}
@@ -71,18 +71,24 @@
return false;
}
- private void handleSystemAudioModeStatusMessage(boolean isSystemAudioModeOn) {
+ private void handleSystemAudioModeStatusMessage(boolean currentSystemAudioMode) {
if (!canChangeSystemAudio()) {
HdmiLogger.debug("Cannot change system audio mode in auto initiation action.");
finish();
return;
}
- boolean systemAudioModeSetting = tv().getSystemAudioModeSetting();
- if (systemAudioModeSetting && !isSystemAudioModeOn) {
- addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, systemAudioModeSetting, null));
+ // If System Audio Control feature is enabled, turn on system audio mode when new AVR is
+ // detected. Otherwise, turn off system audio mode.
+ boolean targetSystemAudioMode = tv().isSystemAudioControlFeatureEnabled();
+ if (currentSystemAudioMode != targetSystemAudioMode) {
+ // Start System Audio Control feature actions only if necessary.
+ addAndStartAction(
+ new SystemAudioActionFromTv(tv(), mAvrAddress, targetSystemAudioMode, null));
} else {
- tv().setSystemAudioMode(isSystemAudioModeOn, true);
+ // If AVR already has correct system audio mode, update target system audio mode
+ // immediately rather than starting feature action.
+ tv().setSystemAudioMode(targetSystemAudioMode);
}
finish();
}
@@ -101,13 +107,15 @@
}
private void handleSystemAudioModeStatusTimeout() {
- if (tv().getSystemAudioModeSetting()) {
- if (canChangeSystemAudio()) {
- addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, true, null));
- }
- } else {
- tv().setSystemAudioMode(false, true);
+ if (!canChangeSystemAudio()) {
+ HdmiLogger.debug("Cannot change system audio mode in auto initiation action.");
+ finish();
+ return;
}
+ // If we can't get the current system audio mode status, just try to turn on/off system
+ // audio mode according to the system audio control setting.
+ addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress,
+ tv().isSystemAudioControlFeatureEnabled(), null));
finish();
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c973911..b316a3b 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -518,7 +518,8 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
updateUidState(uid, procState);
}
diff --git a/services/core/java/com/android/server/location/ContextHubService.java b/services/core/java/com/android/server/location/ContextHubService.java
index 258fb6d..0a15db6 100644
--- a/services/core/java/com/android/server/location/ContextHubService.java
+++ b/services/core/java/com/android/server/location/ContextHubService.java
@@ -93,6 +93,8 @@
public int registerCallback(IContextHubCallback callback) throws RemoteException {
checkPermissions();
mCallbacksList.register(callback);
+ Log.d(TAG, "Added callback, total callbacks " +
+ mCallbacksList.getRegisteredCallbackCount());
return 0;
}
@@ -101,6 +103,7 @@
checkPermissions();
int[] returnArray = new int[mContextHubInfo.length];
+ Log.d(TAG, "System supports " + returnArray.length + " hubs");
for (int i = 0; i < returnArray.length; ++i) {
returnArray[i] = i;
Log.d(TAG, String.format("Hub %s is mapped to %d",
@@ -114,6 +117,7 @@
public ContextHubInfo getContextHubInfo(int contextHubHandle) throws RemoteException {
checkPermissions();
if (!(contextHubHandle >= 0 && contextHubHandle < mContextHubInfo.length)) {
+ Log.e(TAG, "Invalid context hub handle " + contextHubHandle);
return null; // null means fail
}
@@ -129,6 +133,7 @@
return -1;
}
if (app == null) {
+ Log.e(TAG, "Invalid null app");
return -1;
}
@@ -158,6 +163,7 @@
checkPermissions();
NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstanceHandle);
if (info == null) {
+ Log.e(TAG, "Cannot find app with handle " + nanoAppInstanceHandle);
return -1; //means failed
}
@@ -171,6 +177,7 @@
byte msg[] = new byte[0];
if (nativeSendMessage(msgHeader, msg) != 0) {
+ Log.e(TAG, "native send message fails");
return -1;
}
@@ -187,6 +194,7 @@
if (mNanoAppHash.containsKey(nanoAppInstanceHandle)) {
return mNanoAppHash.get(nanoAppInstanceHandle);
} else {
+ Log.e(TAG, "Could not find nanoApp with handle " + nanoAppInstanceHandle);
return null;
}
}
@@ -209,6 +217,7 @@
retArray[i] = foundInstances.get(i).intValue();
}
+ Log.w(TAG, "Found " + retArray.length + " apps on hub handle " + hubHandle);
return retArray;
}
@@ -265,22 +274,26 @@
if (header == null || data == null || header.length < MSG_HEADER_SIZE) {
return -1;
}
+
int callbacksCount = mCallbacksList.beginBroadcast();
+ int msgType = header[HEADER_FIELD_MSG_TYPE];
+ int msgVersion = header[HEADER_FIELD_MSG_VERSION];
+ int hubHandle = header[HEADER_FIELD_HUB_HANDLE];
+ int appInstance = header[HEADER_FIELD_APP_INSTANCE];
+
+ Log.d(TAG, "Sending message " + msgType + " version " + msgVersion + " from hubHandle " +
+ hubHandle + ", appInstance " + appInstance + ", callBackCount " + callbacksCount);
+
if (callbacksCount < 1) {
Log.v(TAG, "No message callbacks registered.");
return 0;
}
- ContextHubMessage msg = new ContextHubMessage(header[HEADER_FIELD_MSG_TYPE],
- header[HEADER_FIELD_MSG_VERSION],
- data);
+ ContextHubMessage msg = new ContextHubMessage(msgType, msgVersion, data);
for (int i = 0; i < callbacksCount; ++i) {
IContextHubCallback callback = mCallbacksList.getBroadcastItem(i);
try {
- callback.onMessageReceipt(
- header[HEADER_FIELD_HUB_HANDLE],
- header[HEADER_FIELD_APP_INSTANCE],
- msg);
+ callback.onMessageReceipt(hubHandle, appInstance, msg);
} catch (RemoteException e) {
Log.i(TAG, "Exception (" + e + ") calling remote callback (" + callback + ").");
continue;
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index ed558aa..ea9128f 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -30,6 +30,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.media.AudioManagerInternal;
@@ -64,6 +65,7 @@
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.view.KeyEvent;
import android.view.ViewConfiguration;
@@ -90,12 +92,11 @@
private static final int WAKELOCK_TIMEOUT = 5000;
private static final int MEDIA_KEY_LISTENER_TIMEOUT = 1000;
- /* package */final IBinder mICallback = new Binder();
-
private final SessionManagerImpl mSessionManagerImpl;
- private final MediaSessionStack mPriorityStack;
- private final SparseArray<UserRecord> mUserRecords = new SparseArray<UserRecord>();
+ // Keeps the full user id for each user.
+ private final SparseIntArray mFullUserIds = new SparseIntArray();
+ private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<FullUserRecord>();
private final ArrayList<SessionsListenerRecord> mSessionsListeners
= new ArrayList<SessionsListenerRecord>();
private final Object mLock = new Object();
@@ -108,11 +109,11 @@
private AudioManagerInternal mAudioManagerInternal;
private ContentResolver mContentResolver;
private SettingsObserver mSettingsObserver;
- private ICallback mCallback;
- // List of user IDs running in the foreground.
- // Multiple users can be in the foreground if the work profile is on.
- private final List<Integer> mCurrentUserIdList = new ArrayList<>();
+ // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
+ // It's always not null after the MediaSessionService is started.
+ private FullUserRecord mCurrentFullUserRecord;
+ private MediaSessionRecord mGlobalPrioritySession;
// Used to notify system UI when remote volume was changed. TODO find a
// better way to handle this.
@@ -121,7 +122,6 @@
public MediaSessionService(Context context) {
super(context);
mSessionManagerImpl = new SessionManagerImpl();
- mPriorityStack = new MediaSessionStack();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
@@ -147,14 +147,21 @@
return IAudioService.Stub.asInterface(b);
}
+ private boolean isGlobalPriorityActiveLocked() {
+ return mGlobalPrioritySession != null && mGlobalPrioritySession.isActive();
+ }
+
public void updateSession(MediaSessionRecord record) {
synchronized (mLock) {
- UserRecord user = mUserRecords.get(record.getUserId());
- if (user == null || !user.mSessions.contains(record)) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null || !user.mPriorityStack.contains(record)) {
Log.d(TAG, "Unknown session updated. Ignoring.");
return;
}
- mPriorityStack.onSessionStateChange(record);
+ user.mPriorityStack.onSessionStateChange(record);
+ if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
+ mGlobalPrioritySession = record;
+ }
}
mHandler.post(MessageHandler.MSG_SESSIONS_CHANGED, record.getUserId(), 0);
}
@@ -176,12 +183,12 @@
public void onSessionPlaystateChange(MediaSessionRecord record, int oldState, int newState) {
boolean updateSessions = false;
synchronized (mLock) {
- UserRecord user = mUserRecords.get(record.getUserId());
- if (user == null || !user.mSessions.contains(record)) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null || !user.mPriorityStack.contains(record)) {
Log.d(TAG, "Unknown session changed playback state. Ignoring.");
return;
}
- updateSessions = mPriorityStack.onPlaystateChange(record, oldState, newState);
+ updateSessions = user.mPriorityStack.onPlaystateChange(record, oldState, newState);
}
if (updateSessions) {
mHandler.post(MessageHandler.MSG_SESSIONS_CHANGED, record.getUserId(), 0);
@@ -190,8 +197,8 @@
public void onSessionPlaybackTypeChanged(MediaSessionRecord record) {
synchronized (mLock) {
- UserRecord user = mUserRecords.get(record.getUserId());
- if (user == null || !user.mSessions.contains(record)) {
+ FullUserRecord user = getFullUserRecordLocked(record.getUserId());
+ if (user == null || !user.mPriorityStack.contains(record)) {
Log.d(TAG, "Unknown session changed playback type. Ignoring.");
return;
}
@@ -215,9 +222,14 @@
public void onStopUser(int userId) {
if (DEBUG) Log.d(TAG, "onStopUser: " + userId);
synchronized (mLock) {
- UserRecord user = mUserRecords.get(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
if (user != null) {
- destroyUserLocked(user);
+ if (user.mFullUserId == userId) {
+ user.destroySessionsForUserLocked(UserHandle.USER_ALL);
+ mUserRecords.remove(userId);
+ } else {
+ user.destroySessionsForUserLocked(userId);
+ }
}
updateUser();
}
@@ -252,24 +264,29 @@
private void updateUser() {
synchronized (mLock) {
UserManager manager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
- int currentUser = ActivityManager.getCurrentUser();
- // Include all profiles even though they aren't yet enabled to handle work profile case.
- int[] userIds = manager.getProfileIdsWithDisabled(currentUser);
- mCurrentUserIdList.clear();
- if (userIds != null && userIds.length > 0) {
- for (int userId : userIds) {
- mCurrentUserIdList.add(userId);
- }
- } else {
- // This shouldn't happen.
- Log.w(TAG, "Failed to get enabled profiles.");
- mCurrentUserIdList.add(currentUser);
- }
- for (int userId : mCurrentUserIdList) {
- if (mUserRecords.get(userId) == null) {
- mUserRecords.put(userId, new UserRecord(getContext(), userId));
+ mFullUserIds.clear();
+ List<UserInfo> allUsers = manager.getUsers();
+ if (allUsers != null) {
+ for (UserInfo userInfo : allUsers) {
+ if (userInfo.isManagedProfile()) {
+ mFullUserIds.put(userInfo.id, userInfo.profileGroupId);
+ } else {
+ mFullUserIds.put(userInfo.id, userInfo.id);
+ if (mUserRecords.get(userInfo.id) == null) {
+ mUserRecords.put(userInfo.id, new FullUserRecord(userInfo.id));
+ }
+ }
}
}
+ // Ensure that the current full user exists.
+ int currentFullUserId = ActivityManager.getCurrentUser();
+ mCurrentFullUserRecord = mUserRecords.get(currentFullUserId);
+ if (mCurrentFullUserRecord == null) {
+ Log.w(TAG, "Cannot find FullUserInfo for the current user " + currentFullUserId);
+ mCurrentFullUserRecord = new FullUserRecord(currentFullUserId);
+ mUserRecords.put(currentFullUserId, mCurrentFullUserRecord);
+ }
+ mFullUserIds.put(currentFullUserId, currentFullUserId);
}
}
@@ -295,16 +312,6 @@
}
}
- /**
- * Stop the user and unbind from everything.
- *
- * @param user The user to dispose of
- */
- private void destroyUserLocked(UserRecord user) {
- user.destroyLocked();
- mUserRecords.remove(user.mUserId);
- }
-
/*
* When a session is removed several things need to happen.
* 1. We need to remove it from the relevant user.
@@ -319,12 +326,13 @@
Log.d(TAG, "Destroying " + session);
}
int userId = session.getUserId();
- UserRecord user = mUserRecords.get(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
if (user != null) {
user.removeSessionLocked(session);
}
-
- mPriorityStack.removeSession(session);
+ if (mGlobalPrioritySession == session) {
+ mGlobalPrioritySession = null;
+ }
try {
session.getCallback().asBinder().unlinkToDeath(session, 0);
@@ -446,8 +454,7 @@
*/
private MediaSessionRecord createSessionLocked(int callerPid, int callerUid, int userId,
String callerPackageName, ISessionCallback cb, String tag) {
-
- UserRecord user = mUserRecords.get(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
if (user == null) {
Log.wtf(TAG, "Request from invalid user: " + userId);
throw new RuntimeException("Session request from invalid user.");
@@ -461,7 +468,6 @@
throw new RuntimeException("Media Session owner died prematurely.", e);
}
- mPriorityStack.addSession(session, mCurrentUserIdList.contains(userId));
user.addSessionLocked(session);
mHandler.post(MessageHandler.MSG_SESSIONS_CHANGED, userId, 0);
@@ -483,12 +489,17 @@
private void pushSessionsChanged(int userId) {
synchronized (mLock) {
- List<MediaSessionRecord> records = mPriorityStack.getActiveSessions(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId);
+ return;
+ }
+ List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId);
int size = records.size();
if (size > 0 && records.get(0).isPlaybackActive(false)) {
- rememberMediaButtonReceiverLocked(records.get(0));
+ user.rememberMediaButtonReceiverLocked(records.get(0));
}
- pushAddressedPlayerChangedLocked();
+ user.pushAddressedPlayerChangedLocked();
ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
for (int i = 0; i < size; i++) {
tokens.add(new MediaSession.Token(records.get(i).getControllerBinder()));
@@ -512,7 +523,12 @@
private void pushRemoteVolumeUpdateLocked(int userId) {
if (mRvc != null) {
try {
- MediaSessionRecord record = mPriorityStack.getDefaultRemoteSession(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "pushRemoteVolumeUpdateLocked failed. No user with id=" + userId);
+ return;
+ }
+ MediaSessionRecord record = user.mPriorityStack.getDefaultRemoteSession(userId);
mRvc.updateRemoteController(record == null ? null : record.getControllerBinder());
} catch (RemoteException e) {
Log.wtf(TAG, "Error sending default remote volume to sys ui.", e);
@@ -520,66 +536,6 @@
}
}
- private MediaSessionRecord getMediaButtonSessionLocked() {
- // If we don't have a media button receiver to fall back on
- // include non-playing sessions for dispatching.
- boolean useNotPlayingSessions = true;
- for (int userId : mCurrentUserIdList) {
- UserRecord ur = mUserRecords.get(userId);
- if (ur.mLastMediaButtonReceiver != null
- || ur.mRestoredMediaButtonReceiver != null) {
- useNotPlayingSessions = false;
- break;
- }
- }
- return mPriorityStack.getDefaultMediaButtonSession(
- mCurrentUserIdList, useNotPlayingSessions);
- }
-
- private void pushAddressedPlayerChangedLocked() {
- if (mCallback == null) {
- return;
- }
- try {
- MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
- if (mediaButtonSession != null) {
- mCallback.onAddressedPlayerChangedToMediaSession(
- new MediaSession.Token(mediaButtonSession.getControllerBinder()));
- } else {
- for (int userId : mCurrentUserIdList) {
- UserRecord user = mUserRecords.get(userId);
- if (user.mLastMediaButtonReceiver == null
- && user.mRestoredMediaButtonReceiver == null) {
- continue;
- }
- ComponentName componentName = user.mLastMediaButtonReceiver != null
- ? user.mLastMediaButtonReceiver.getIntent().getComponent()
- : user.mRestoredMediaButtonReceiver;
- mCallback.onAddressedPlayerChangedToMediaButtonReceiver(componentName);
- return;
- }
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
- }
- }
-
- // Remember media button receiver and keep it in the persistent storage.
- // This should be called whenever there's no media session to receive media button event.
- private void rememberMediaButtonReceiverLocked(MediaSessionRecord record) {
- PendingIntent receiver = record.getMediaButtonReceiver();
- UserRecord user = mUserRecords.get(record.getUserId());
- if (receiver != null && user != null) {
- user.mLastMediaButtonReceiver = receiver;
- ComponentName component = receiver.getIntent().getComponent();
- if (component != null && record.getPackageName().equals(component.getPackageName())) {
- Settings.Secure.putStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER, component.flattenToString(),
- record.getUserId());
- }
- }
- }
-
private String getCallingPackageName(int uid) {
String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
if (packages != null && packages.length > 0) {
@@ -589,25 +545,36 @@
}
private void dispatchVolumeKeyLongPressLocked(KeyEvent keyEvent) {
- // Only consider full user.
- UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
try {
- user.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
+ mCurrentFullUserRecord.mOnVolumeKeyLongPressListener.onVolumeKeyLongPress(keyEvent);
} catch (RemoteException e) {
Log.w(TAG, "Failed to send " + keyEvent + " to volume key long-press listener");
}
}
+ private FullUserRecord getFullUserRecordLocked(int userId) {
+ int fullUserId = mFullUserIds.get(userId, -1);
+ if (fullUserId < 0) {
+ return null;
+ }
+ return mUserRecords.get(fullUserId);
+ }
+
/**
- * Information about a particular user. The contents of this object is
- * guarded by mLock.
+ * Information about a full user and its corresponding managed profiles.
+ *
+ * <p>Since the full user runs together with its managed profiles, a user wouldn't differentiate
+ * them when he/she presses a media/volume button. So keeping media sessions for them in one
+ * place makes more sense and increases the readability.</p>
+ * <p>The contents of this object is guarded by {@link #mLock}.
*/
- final class UserRecord {
- private final int mUserId;
- private final ArrayList<MediaSessionRecord> mSessions = new ArrayList<MediaSessionRecord>();
- private final Context mContext;
+ final class FullUserRecord {
+ private static final String COMPONENT_NAME_USER_ID_DELIM = ",";
+ private final int mFullUserId;
+ private final MediaSessionStack mPriorityStack = new MediaSessionStack();
private PendingIntent mLastMediaButtonReceiver;
private ComponentName mRestoredMediaButtonReceiver;
+ private int mRestoredMediaButtonReceiverUserId;
private IOnVolumeKeyLongPressListener mOnVolumeKeyLongPressListener;
private int mOnVolumeKeyLongPressListenerUid;
@@ -617,63 +584,112 @@
private IOnMediaKeyListener mOnMediaKeyListener;
private int mOnMediaKeyListenerUid;
+ private ICallback mCallback;
- public UserRecord(Context context, int userId) {
- mContext = context;
- mUserId = userId;
- restoreMediaButtonReceiver();
+ public FullUserRecord(int fullUserId) {
+ mFullUserId = fullUserId;
+ // Restore the remembered media button receiver before the boot.
+ String mediaButtonReceiver = Settings.Secure.getStringForUser(mContentResolver,
+ Settings.System.MEDIA_BUTTON_RECEIVER, mFullUserId);
+ if (mediaButtonReceiver == null) {
+ return;
+ }
+ String[] tokens = mediaButtonReceiver.split(COMPONENT_NAME_USER_ID_DELIM);
+ if (tokens == null || tokens.length != 2) {
+ return;
+ }
+ mRestoredMediaButtonReceiver = ComponentName.unflattenFromString(tokens[0]);
+ mRestoredMediaButtonReceiverUserId = Integer.parseInt(tokens[1]);
}
- public void destroyLocked() {
- for (int i = mSessions.size() - 1; i >= 0; i--) {
- MediaSessionRecord session = mSessions.get(i);
+ public void destroySessionsForUserLocked(int userId) {
+ List<MediaSessionRecord> sessions = mPriorityStack.getPriorityList(false, 0, userId);
+ for (MediaSessionRecord session : sessions) {
MediaSessionService.this.destroySessionLocked(session);
}
}
- public ArrayList<MediaSessionRecord> getSessionsLocked() {
- return mSessions;
- }
-
public void addSessionLocked(MediaSessionRecord session) {
- mSessions.add(session);
+ mPriorityStack.addSession(session,
+ mFullUserId == mFullUserIds.get(session.getUserId()));
}
public void removeSessionLocked(MediaSessionRecord session) {
- mSessions.remove(session);
+ mPriorityStack.removeSession(session);
}
public void dumpLocked(PrintWriter pw, String prefix) {
- pw.println(prefix + "Record for user " + mUserId);
+ pw.print(prefix + "Record for full_user=" + mFullUserId);
+ // Dump managed profile user ids associated with this user.
+ int size = mFullUserIds.size();
+ for (int i = 0; i < size; i++) {
+ if (mFullUserIds.keyAt(i) != mFullUserIds.valueAt(i)
+ && mFullUserIds.valueAt(i) == mFullUserId) {
+ pw.print(", profile_user=" + mFullUserIds.keyAt(i));
+ }
+ }
+ pw.println();
String indent = prefix + " ";
- pw.println(indent + "MediaButtonReceiver:" + mLastMediaButtonReceiver);
- pw.println(indent + "Restored ButtonReceiver:" + mRestoredMediaButtonReceiver);
- pw.println(indent + "Volume key long-press listener:" + mOnVolumeKeyLongPressListener);
- pw.println(indent + "Volume key long-press listener package:" +
+ pw.println(indent + "Volume key long-press listener: " + mOnVolumeKeyLongPressListener);
+ pw.println(indent + "Volume key long-press listener package: " +
getCallingPackageName(mOnVolumeKeyLongPressListenerUid));
pw.println(indent + "Media key listener: " + mOnMediaKeyListener);
pw.println(indent + "Media key listener package: " +
getCallingPackageName(mOnMediaKeyListenerUid));
- int size = mSessions.size();
- pw.println(indent + size + " Sessions:");
- for (int i = 0; i < size; i++) {
- // Just print the short version, the full session dump will
- // already be in the list of all sessions.
- pw.println(indent + mSessions.get(i).toString());
+ pw.println(indent + "Callback: " + mCallback);
+ pw.println(indent + "Last MediaButtonReceiver: " + mLastMediaButtonReceiver);
+ pw.println(indent + "Restored MediaButtonReceiver: " + mRestoredMediaButtonReceiver);
+ mPriorityStack.dump(pw, indent);
+ }
+
+ // Remember the media button receiver and keep it in the persistent storage.
+ private void rememberMediaButtonReceiverLocked(MediaSessionRecord record) {
+ PendingIntent receiver = record.getMediaButtonReceiver();
+ if (receiver == null) {
+ return;
+ }
+ mLastMediaButtonReceiver = receiver;
+ ComponentName component = receiver.getIntent().getComponent();
+ if (component != null && record.getPackageName().equals(component.getPackageName())) {
+ String componentName = component.flattenToString();
+ Settings.Secure.putStringForUser(mContentResolver,
+ Settings.System.MEDIA_BUTTON_RECEIVER,
+ componentName + COMPONENT_NAME_USER_ID_DELIM + record.getUserId(),
+ mFullUserId);
}
}
- private void restoreMediaButtonReceiver() {
- String receiverName = Settings.Secure.getStringForUser(mContentResolver,
- Settings.System.MEDIA_BUTTON_RECEIVER, mUserId);
- if (!TextUtils.isEmpty(receiverName)) {
- ComponentName eventReceiver = ComponentName.unflattenFromString(receiverName);
- if (eventReceiver == null) {
- // an invalid name was persisted
- return;
- }
- mRestoredMediaButtonReceiver = eventReceiver;
+ private void pushAddressedPlayerChangedLocked() {
+ if (mCallback == null) {
+ return;
}
+ try {
+ MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
+ if (mediaButtonSession != null) {
+ mCallback.onAddressedPlayerChangedToMediaSession(
+ new MediaSession.Token(mediaButtonSession.getControllerBinder()));
+ } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
+ mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
+ mCurrentFullUserRecord.mLastMediaButtonReceiver
+ .getIntent().getComponent());
+ } else if (mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
+ mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
+ mCurrentFullUserRecord.mRestoredMediaButtonReceiver);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
+ }
+ }
+
+ private MediaSessionRecord getMediaButtonSessionLocked() {
+ if (isGlobalPriorityActiveLocked()) {
+ return mGlobalPrioritySession;
+ }
+ // If we don't have a media button receiver to fall back on
+ // include non-playing sessions for dispatching.
+ boolean useNotPlayingSessions = (mLastMediaButtonReceiver == null
+ && mRestoredMediaButtonReceiver == null);
+ return mPriorityStack.getDefaultMediaButtonSession(useNotPlayingSessions);
}
}
@@ -759,11 +775,27 @@
int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
ArrayList<IBinder> binders = new ArrayList<IBinder>();
synchronized (mLock) {
- ArrayList<MediaSessionRecord> records = mPriorityStack
- .getActiveSessions(resolvedUserId);
- int size = records.size();
- for (int i = 0; i < size; i++) {
- binders.add(records.get(i).getControllerBinder().asBinder());
+ if (resolvedUserId == UserHandle.USER_ALL) {
+ int size = mUserRecords.size();
+ for (int i = 0; i < size; i++) {
+ List<MediaSessionRecord> records =
+ mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(
+ resolvedUserId);
+ for (MediaSessionRecord record : records) {
+ binders.add(record.getControllerBinder().asBinder());
+ }
+ }
+ } else {
+ FullUserRecord user = getFullUserRecordLocked(resolvedUserId);
+ if (user == null) {
+ Log.w(TAG, "getSessions failed. Unknown user " + userId);
+ return binders;
+ }
+ List<MediaSessionRecord> records = user.mPriorityStack
+ .getActiveSessions(resolvedUserId);
+ for (MediaSessionRecord record : records) {
+ binders.add(record.getControllerBinder().asBinder());
+ }
}
}
return binders;
@@ -852,7 +884,7 @@
}
synchronized (mLock) {
- boolean isGlobalPriorityActive = mPriorityStack.isGlobalPriorityActive();
+ boolean isGlobalPriorityActive = isGlobalPriorityActiveLocked();
if (isGlobalPriorityActive && uid != Process.SYSTEM_UID) {
// Prevent dispatching key event through reflection while the global
// priority session is active.
@@ -861,18 +893,17 @@
return;
}
if (!isGlobalPriorityActive) {
- // Only consider full user.
- UserRecord user = mUserRecords.get(mCurrentUserIdList.get(0));
- if (user.mOnMediaKeyListener != null) {
+ if (mCurrentFullUserRecord.mOnMediaKeyListener != null) {
if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Send " + keyEvent + " to media key listener");
+ Log.d(TAG, "Send " + keyEvent + " to the media key listener");
}
try {
- user.mOnMediaKeyListener.onMediaKey(keyEvent,
+ mCurrentFullUserRecord.mOnMediaKeyListener.onMediaKey(keyEvent,
new MediaKeyListenerResultReceiver(keyEvent, needWakeLock));
return;
} catch (RemoteException e) {
- Log.w(TAG, "Failed to send " + keyEvent + " to media key listener");
+ Log.w(TAG, "Failed to send " + keyEvent
+ + " to the media key listener");
}
}
}
@@ -898,26 +929,33 @@
+ " Callback");
}
synchronized (mLock) {
- Log.d(TAG, "Callback + " + mCallback
+ int userId = UserHandle.getUserId(uid);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the callback"
+ + ", userId=" + userId);
+ return;
+ }
+ user.mCallback = callback;
+ Log.d(TAG, "The callback " + user.mCallback
+ " is set by " + getCallingPackageName(uid));
- mCallback = callback;
- if (mCallback == null) {
+ if (user.mCallback == null) {
return;
}
try {
- mCallback.asBinder().linkToDeath(
+ user.mCallback.asBinder().linkToDeath(
new IBinder.DeathRecipient() {
@Override
public void binderDied() {
synchronized (mLock) {
- mCallback = null;
+ user.mCallback = null;
}
}
}, 0);
- pushAddressedPlayerChangedLocked();
+ user.pushAddressedPlayerChangedLocked();
} catch (RemoteException e) {
Log.w(TAG, "Failed to set callback", e);
- mCallback = null;
+ user.mCallback = null;
}
}
} finally {
@@ -940,17 +978,26 @@
}
synchronized (mLock) {
- UserRecord user = mUserRecords.get(UserHandle.getUserId(uid));
+ int userId = UserHandle.getUserId(uid);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the volume key long-press listener"
+ + ", userId=" + userId);
+ return;
+ }
if (user.mOnVolumeKeyLongPressListener != null &&
user.mOnVolumeKeyLongPressListenerUid != uid) {
- Log.w(TAG, "Volume key long-press listener cannot be reset by another app");
+ Log.w(TAG, "The volume key long-press listener cannot be reset"
+ + " by another app , mOnVolumeKeyLongPressListener="
+ + user.mOnVolumeKeyLongPressListenerUid
+ + ", uid=" + uid);
return;
}
user.mOnVolumeKeyLongPressListener = listener;
user.mOnVolumeKeyLongPressListenerUid = uid;
- Log.d(TAG, "Volume key long-press listener "
+ Log.d(TAG, "The volume key long-press listener "
+ listener + " is set by " + getCallingPackageName(uid));
if (user.mOnVolumeKeyLongPressListener != null) {
@@ -992,16 +1039,23 @@
synchronized (mLock) {
int userId = UserHandle.getUserId(uid);
- UserRecord user = mUserRecords.get(userId);
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can set the media key listener"
+ + ", userId=" + userId);
+ return;
+ }
if (user.mOnMediaKeyListener != null && user.mOnMediaKeyListenerUid != uid) {
- Log.w(TAG, "Media key listener cannot be reset by another app");
+ Log.w(TAG, "The media key listener cannot be reset by another app. "
+ + ", mOnMediaKeyListenerUid=" + user.mOnMediaKeyListenerUid
+ + ", uid=" + uid);
return;
}
user.mOnMediaKeyListener = listener;
user.mOnMediaKeyListenerUid = uid;
- Log.d(TAG, "Media key listener " + user.mOnMediaKeyListener
+ Log.d(TAG, "The media key listener " + user.mOnMediaKeyListener
+ " is set by " + getCallingPackageName(uid));
if (user.mOnMediaKeyListener != null) {
@@ -1060,12 +1114,8 @@
try {
synchronized (mLock) {
- // Only consider full user.
- int userId = mCurrentUserIdList.get(0);
- UserRecord user = mUserRecords.get(userId);
-
- if (mPriorityStack.isGlobalPriorityActive()
- || user.mOnVolumeKeyLongPressListener == null) {
+ if (isGlobalPriorityActiveLocked()
+ || mCurrentFullUserRecord.mOnVolumeKeyLongPressListener == null) {
dispatchVolumeKeyEventLocked(keyEvent, stream, musicOnly);
} else {
// TODO: Consider the case when both volume up and down keys are pressed
@@ -1073,34 +1123,36 @@
if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
if (keyEvent.getRepeatCount() == 0) {
// Keeps the copy of the KeyEvent because it can be reused.
- user.mInitialDownVolumeKeyEvent = KeyEvent.obtain(keyEvent);
- user.mInitialDownVolumeStream = stream;
- user.mInitialDownMusicOnly = musicOnly;
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent =
+ KeyEvent.obtain(keyEvent);
+ mCurrentFullUserRecord.mInitialDownVolumeStream = stream;
+ mCurrentFullUserRecord.mInitialDownMusicOnly = musicOnly;
mHandler.sendMessageDelayed(
mHandler.obtainMessage(
- MessageHandler.MSG_VOLUME_INITIAL_DOWN, userId, 0),
+ MessageHandler.MSG_VOLUME_INITIAL_DOWN,
+ mCurrentFullUserRecord.mFullUserId, 0),
mLongPressTimeout);
}
if (keyEvent.getRepeatCount() > 0 || keyEvent.isLongPress()) {
mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
- if (user.mInitialDownVolumeKeyEvent != null) {
+ if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null) {
dispatchVolumeKeyLongPressLocked(
- user.mInitialDownVolumeKeyEvent);
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent);
// Mark that the key is already handled.
- user.mInitialDownVolumeKeyEvent = null;
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent = null;
}
dispatchVolumeKeyLongPressLocked(keyEvent);
}
} else { // if up
mHandler.removeMessages(MessageHandler.MSG_VOLUME_INITIAL_DOWN);
- if (user.mInitialDownVolumeKeyEvent != null
- && user.mInitialDownVolumeKeyEvent.getDownTime()
- == keyEvent.getDownTime()) {
+ if (mCurrentFullUserRecord.mInitialDownVolumeKeyEvent != null
+ && mCurrentFullUserRecord.mInitialDownVolumeKeyEvent
+ .getDownTime() == keyEvent.getDownTime()) {
// Short-press. Should change volume.
dispatchVolumeKeyEventLocked(
- user.mInitialDownVolumeKeyEvent,
- user.mInitialDownVolumeStream,
- user.mInitialDownMusicOnly);
+ mCurrentFullUserRecord.mInitialDownVolumeKeyEvent,
+ mCurrentFullUserRecord.mInitialDownVolumeStream,
+ mCurrentFullUserRecord.mInitialDownMusicOnly);
dispatchVolumeKeyEventLocked(keyEvent, stream, musicOnly);
} else {
dispatchVolumeKeyLongPressLocked(keyEvent);
@@ -1185,7 +1237,7 @@
@Override
public boolean isGlobalPriorityActive() {
synchronized (mLock) {
- return mPriorityStack.isGlobalPriorityActive();
+ return isGlobalPriorityActiveLocked();
}
}
@@ -1204,13 +1256,11 @@
synchronized (mLock) {
pw.println(mSessionsListeners.size() + " sessions listeners.");
- mPriorityStack.dump(pw, "");
-
+ pw.println("Global priority session is " + mGlobalPrioritySession);
pw.println("User Records:");
int count = mUserRecords.size();
for (int i = 0; i < count; i++) {
- UserRecord user = mUserRecords.get(mUserRecords.keyAt(i));
- user.dumpLocked(pw, "");
+ mUserRecords.valueAt(i).dumpLocked(pw, "");
}
}
}
@@ -1235,7 +1285,8 @@
}
private void dispatchAdjustVolumeLocked(int suggestedStream, int direction, int flags) {
- MediaSessionRecord session = mPriorityStack.getDefaultVolumeSession(mCurrentUserIdList);
+ MediaSessionRecord session = isGlobalPriorityActiveLocked() ? mGlobalPrioritySession
+ : mCurrentFullUserRecord.mPriorityStack.getDefaultVolumeSession();
boolean preferSuggestedStream = false;
if (isValidLocalStreamType(suggestedStream)
@@ -1304,7 +1355,7 @@
}
private void dispatchMediaKeyEventLocked(KeyEvent keyEvent, boolean needWakeLock) {
- MediaSessionRecord session = getMediaButtonSessionLocked();
+ MediaSessionRecord session = mCurrentFullUserRecord.getMediaButtonSessionLocked();
if (session != null) {
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "Sending " + keyEvent + " to " + session);
@@ -1317,68 +1368,65 @@
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mKeyEventReceiver, Process.SYSTEM_UID,
getContext().getPackageName());
- if (mCallback != null) {
+ if (mCurrentFullUserRecord.mCallback != null) {
try {
- mCallback.onMediaKeyEventDispatchedToMediaSession(keyEvent,
+ mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession(
+ keyEvent,
new MediaSession.Token(session.getControllerBinder()));
} catch (RemoteException e) {
Log.w(TAG, "Failed to send callback", e);
}
}
- } else {
- // Launch the last PendingIntent we had with priority
- for (int userId : mCurrentUserIdList) {
- UserRecord user = mUserRecords.get(userId);
- if (user.mLastMediaButtonReceiver == null
- && user.mRestoredMediaButtonReceiver == null) {
- continue;
- }
- if (needWakeLock) {
- mKeyEventReceiver.aquireWakeLockLocked();
- }
- Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
- mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
- try {
- if (user.mLastMediaButtonReceiver != null) {
- PendingIntent receiver = user.mLastMediaButtonReceiver;
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Sending " + keyEvent
- + " to the last known pendingIntent " + receiver);
- }
- receiver.send(getContext(),
- needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
- mediaButtonIntent, mKeyEventReceiver, mHandler);
- if (mCallback != null) {
- ComponentName componentName =
- user.mLastMediaButtonReceiver.getIntent().getComponent();
- if (componentName != null) {
- mCallback.onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, componentName);
- }
- }
- } else {
- ComponentName receiver = user.mRestoredMediaButtonReceiver;
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
- + receiver);
- }
- mediaButtonIntent.setComponent(receiver);
- getContext().sendBroadcastAsUser(mediaButtonIntent,
- UserHandle.of(userId));
- if (mCallback != null) {
- mCallback.onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, receiver);
+ } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null
+ || mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
+ if (needWakeLock) {
+ mKeyEventReceiver.aquireWakeLockLocked();
+ }
+ Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+ mediaButtonIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
+ try {
+ if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
+ PendingIntent receiver = mCurrentFullUserRecord.mLastMediaButtonReceiver;
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Sending " + keyEvent
+ + " to the last known pendingIntent " + receiver);
+ }
+ receiver.send(getContext(),
+ needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
+ mediaButtonIntent, mKeyEventReceiver, mHandler);
+ if (mCurrentFullUserRecord.mCallback != null) {
+ ComponentName componentName = mCurrentFullUserRecord
+ .mLastMediaButtonReceiver.getIntent().getComponent();
+ if (componentName != null) {
+ mCurrentFullUserRecord.mCallback
+ .onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, componentName);
}
}
- } catch (CanceledException e) {
- Log.i(TAG, "Error sending key event to media button receiver "
- + user.mLastMediaButtonReceiver, e);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send callback", e);
+ } else {
+ ComponentName receiver =
+ mCurrentFullUserRecord.mRestoredMediaButtonReceiver;
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Sending " + keyEvent + " to the restored intent "
+ + receiver);
+ }
+ mediaButtonIntent.setComponent(receiver);
+ getContext().sendBroadcastAsUser(mediaButtonIntent,
+ UserHandle.of(mCurrentFullUserRecord.mRestoredMediaButtonReceiverUserId));
+ if (mCurrentFullUserRecord.mCallback != null) {
+ mCurrentFullUserRecord.mCallback
+ .onMediaKeyEventDispatchedToMediaButtonReceiver(
+ keyEvent, receiver);
+ }
}
- return;
+ } catch (CanceledException e) {
+ Log.i(TAG, "Error sending key event to media button receiver "
+ + mCurrentFullUserRecord.mLastMediaButtonReceiver, e);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
}
+ } else {
if (DEBUG) {
Log.d(TAG, "Sending media key ordered broadcast");
}
@@ -1486,7 +1534,7 @@
mHandled = true;
mHandler.removeCallbacks(this);
synchronized (mLock) {
- if (!mPriorityStack.isGlobalPriorityActive()
+ if (!isGlobalPriorityActiveLocked()
&& isVoiceKey(mKeyEvent.getKeyCode())) {
handleVoiceKeyEventLocked(mKeyEvent, mNeedWakeLock);
} else {
@@ -1598,7 +1646,7 @@
break;
case MSG_VOLUME_INITIAL_DOWN:
synchronized (mLock) {
- UserRecord user = mUserRecords.get((int) msg.arg1);
+ FullUserRecord user = mUserRecords.get((int) msg.arg1);
if (user != null && user.mInitialDownVolumeKeyEvent != null) {
dispatchVolumeKeyLongPressLocked(user.mInitialDownVolumeKeyEvent);
// Mark that the key is already handled.
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index d8fd6e2..8b80734 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -30,6 +30,7 @@
/**
* Keeps track of media sessions and their priority for notifications, media
* button dispatch, etc.
+ * <p>This class isn't thread-safe. The caller should take care of the synchronization.
*/
class MediaSessionStack {
/**
@@ -52,8 +53,6 @@
private final ArrayList<MediaSessionRecord> mSessions = new ArrayList<MediaSessionRecord>();
- private MediaSessionRecord mGlobalPrioritySession;
-
// The last record that either entered one of the playing states or was
// added.
private MediaSessionRecord mLastInterestingRecord;
@@ -112,13 +111,17 @@
*/
public void removeSession(MediaSessionRecord record) {
mSessions.remove(record);
- if (record == mGlobalPrioritySession) {
- mGlobalPrioritySession = null;
- }
clearCache();
}
/**
+ * Return if the record exists in the priority tracker.
+ */
+ public boolean contains(MediaSessionRecord record) {
+ return mSessions.contains(record);
+ }
+
+ /**
* Notify the priority tracker that a session's state changed.
*
* @param record The record that changed.
@@ -149,9 +152,6 @@
* @param record The record that changed.
*/
public void onSessionStateChange(MediaSessionRecord record) {
- if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
- mGlobalPrioritySession = record;
- }
// For now just clear the cache. Eventually we'll selectively clear
// depending on what changed.
clearCache();
@@ -166,63 +166,24 @@
*/
public ArrayList<MediaSessionRecord> getActiveSessions(int userId) {
if (mCachedActiveList == null) {
- mCachedActiveList = getPriorityListLocked(true, 0, userId);
+ mCachedActiveList = getPriorityList(true, 0, userId);
}
return mCachedActiveList;
}
/**
- * Get the current priority sorted list of active sessions that use
- * transport controls. The most important session is at index 0 and the
- * least important at size -1.
- *
- * @param userId The user to check.
- * @return All the active sessions that handle transport controls in
- * priority order.
- */
- public ArrayList<MediaSessionRecord> getTransportControlSessions(int userId) {
- if (mCachedTransportControlList == null) {
- mCachedTransportControlList = getPriorityListLocked(true,
- MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS, userId);
- }
- return mCachedTransportControlList;
- }
-
- /**
- * Get the highest priority active session.
- *
- * @param userId The user to check.
- * @return The current highest priority session or null.
- */
- public MediaSessionRecord getDefaultSession(int userId) {
- if (mCachedDefault != null) {
- return mCachedDefault;
- }
- ArrayList<MediaSessionRecord> records = getPriorityListLocked(true, 0, userId);
- if (records.size() > 0) {
- return records.get(0);
- }
- return null;
- }
-
- /**
* Get the highest priority session that can handle media buttons.
*
- * @param userIdList The user lists to check.
* @param includeNotPlaying Return a non-playing session if nothing else is
* available
* @return The default media button session or null.
*/
- public MediaSessionRecord getDefaultMediaButtonSession(
- List<Integer> userIdList, boolean includeNotPlaying) {
- if (mGlobalPrioritySession != null && mGlobalPrioritySession.isActive()) {
- return mGlobalPrioritySession;
- }
+ public MediaSessionRecord getDefaultMediaButtonSession(boolean includeNotPlaying) {
if (mCachedButtonReceiver != null) {
return mCachedButtonReceiver;
}
- ArrayList<MediaSessionRecord> records = getPriorityListLocked(true,
- MediaSession.FLAG_HANDLES_MEDIA_BUTTONS, userIdList);
+ ArrayList<MediaSessionRecord> records = getPriorityList(true,
+ MediaSession.FLAG_HANDLES_MEDIA_BUTTONS, UserHandle.USER_ALL);
if (records.size() > 0) {
MediaSessionRecord record = records.get(0);
if (record.isPlaybackActive(false)) {
@@ -247,14 +208,11 @@
return mCachedButtonReceiver;
}
- public MediaSessionRecord getDefaultVolumeSession(List<Integer> userIdList) {
- if (mGlobalPrioritySession != null && mGlobalPrioritySession.isActive()) {
- return mGlobalPrioritySession;
- }
+ public MediaSessionRecord getDefaultVolumeSession() {
if (mCachedVolumeDefault != null) {
return mCachedVolumeDefault;
}
- ArrayList<MediaSessionRecord> records = getPriorityListLocked(true, 0, userIdList);
+ ArrayList<MediaSessionRecord> records = getPriorityList(true, 0, UserHandle.USER_ALL);
int size = records.size();
for (int i = 0; i < size; i++) {
MediaSessionRecord record = records.get(i);
@@ -267,7 +225,7 @@
}
public MediaSessionRecord getDefaultRemoteSession(int userId) {
- ArrayList<MediaSessionRecord> records = getPriorityListLocked(true, 0, userId);
+ ArrayList<MediaSessionRecord> records = getPriorityList(true, 0, userId);
int size = records.size();
for (int i = 0; i < size; i++) {
@@ -279,15 +237,10 @@
return null;
}
- public boolean isGlobalPriorityActive() {
- return mGlobalPrioritySession == null ? false : mGlobalPrioritySession.isActive();
- }
-
public void dump(PrintWriter pw, String prefix) {
- ArrayList<MediaSessionRecord> sortedSessions = getPriorityListLocked(false, 0,
+ ArrayList<MediaSessionRecord> sortedSessions = getPriorityList(false, 0,
UserHandle.USER_ALL);
int count = sortedSessions.size();
- pw.println(prefix + "Global priority session is " + mGlobalPrioritySession);
pw.println(prefix + "Sessions Stack - have " + count + " sessions:");
String indent = prefix + " ";
for (int i = 0; i < count; i++) {
@@ -297,13 +250,6 @@
}
}
- private ArrayList<MediaSessionRecord> getPriorityListLocked(boolean activeOnly, int withFlags,
- int userId) {
- List<Integer> userIdList = new ArrayList<>();
- userIdList.add(userId);
- return getPriorityListLocked(activeOnly, withFlags, userIdList);
- }
-
/**
* Get a priority sorted list of sessions. Can filter to only return active
* sessions or sessions with specific flags.
@@ -312,23 +258,22 @@
* all sessions.
* @param withFlags Only return sessions with all the specified flags set. 0
* returns all sessions.
- * @param userIdList The user to get sessions for. {@link UserHandle#USER_ALL}
+ * @param userId The user to get sessions for. {@link UserHandle#USER_ALL}
* will return sessions for all users.
* @return The priority sorted list of sessions.
*/
- private ArrayList<MediaSessionRecord> getPriorityListLocked(boolean activeOnly, int withFlags,
- List<Integer> userIdList) {
+ public ArrayList<MediaSessionRecord> getPriorityList(boolean activeOnly, int withFlags,
+ int userId) {
ArrayList<MediaSessionRecord> result = new ArrayList<MediaSessionRecord>();
int lastLocalIndex = 0;
int lastActiveIndex = 0;
int lastPublishedIndex = 0;
- boolean filterUser = !userIdList.contains(UserHandle.USER_ALL);
int size = mSessions.size();
for (int i = 0; i < size; i++) {
final MediaSessionRecord session = mSessions.get(i);
- if (filterUser && !userIdList.contains(session.getUserId())) {
+ if (userId != UserHandle.USER_ALL && userId != session.getUserId()) {
// Filter out sessions for the wrong user
continue;
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 4e9d838..9d93cc7 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -719,7 +719,8 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState,
+ long procStateSeq) throws RemoteException {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "onUidStateChanged");
try {
synchronized (mUidRulesFirstLock) {
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 6097071..4b1804c 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -510,9 +510,6 @@
if (r == null) {
throw new IllegalArgumentException("Invalid package");
}
- if (IMPORTANCE_NONE == r.importance) {
- throw new IllegalArgumentException("Package blocked");
- }
if (channel.getGroup() != null && !r.groups.containsKey(channel.getGroup())) {
throw new IllegalArgumentException("NotificationChannelGroup doesn't exist");
}
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 6365d15..bb7ffda 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -207,9 +207,35 @@
}
public void grantDefaultPermissions(int userId) {
- grantPermissionsToSysComponentsAndPrivApps(userId);
- grantDefaultSystemHandlerPermissions(userId);
- grantDefaultPermissionExceptions(userId);
+ if (mService.hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
+ grantAllRuntimePermissions(userId);
+ } else {
+ grantPermissionsToSysComponentsAndPrivApps(userId);
+ grantDefaultSystemHandlerPermissions(userId);
+ grantDefaultPermissionExceptions(userId);
+ }
+ }
+
+ private void grantRuntimePermissionsForPackageLocked(int userId, PackageParser.Package pkg) {
+ Set<String> permissions = new ArraySet<>();
+ for (String permission : pkg.requestedPermissions) {
+ BasePermission bp = mService.mSettings.mPermissions.get(permission);
+ if (bp != null && bp.isRuntime()) {
+ permissions.add(permission);
+ }
+ }
+ if (!permissions.isEmpty()) {
+ grantRuntimePermissionsLPw(pkg, permissions, true, userId);
+ }
+ }
+
+ private void grantAllRuntimePermissions(int userId) {
+ Log.i(TAG, "Granting all runtime permissions for user " + userId);
+ synchronized (mService.mPackages) {
+ for (PackageParser.Package pkg : mService.mPackages.values()) {
+ grantRuntimePermissionsForPackageLocked(userId, pkg);
+ }
+ }
}
public void scheduleReadDefaultPermissionExceptions() {
@@ -226,18 +252,7 @@
|| pkg.requestedPermissions.isEmpty()) {
continue;
}
- Set<String> permissions = new ArraySet<>();
- final int permissionCount = pkg.requestedPermissions.size();
- for (int i = 0; i < permissionCount; i++) {
- String permission = pkg.requestedPermissions.get(i);
- BasePermission bp = mService.mSettings.mPermissions.get(permission);
- if (bp != null && bp.isRuntime()) {
- permissions.add(permission);
- }
- }
- if (!permissions.isEmpty()) {
- grantRuntimePermissionsLPw(pkg, permissions, true, userId);
- }
+ grantRuntimePermissionsForPackageLocked(userId, pkg);
}
}
}
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 5abdb60..7eef7ad 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -121,6 +121,10 @@
if (binder != null) {
mInstalld = IInstalld.Stub.asInterface(binder);
+ try {
+ invalidateMounts();
+ } catch (InstallerException ignored) {
+ }
} else {
Slog.w(TAG, "installd not found; trying again");
BackgroundThread.getHandler().postDelayed(() -> {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index fd731c3..0ec85aa 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -56,7 +56,9 @@
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
+import android.os.ProxyFileDescriptorCallback;
import android.os.RemoteException;
+import android.os.RevocableFileDescriptor;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.system.ErrnoException;
@@ -148,7 +150,9 @@
private String mFinalMessage;
@GuardedBy("mLock")
- private ArrayList<FileBridge> mBridges = new ArrayList<>();
+ private final ArrayList<RevocableFileDescriptor> mFds = new ArrayList<>();
+ @GuardedBy("mLock")
+ private final ArrayList<FileBridge> mBridges = new ArrayList<>();
@GuardedBy("mLock")
private IPackageInstallObserver2 mRemoteObserver;
@@ -430,12 +434,20 @@
// Quick sanity check of state, and allocate a pipe for ourselves. We
// then do heavy disk allocation outside the lock, but this open pipe
// will block any attempted install transitions.
+ final RevocableFileDescriptor fd;
final FileBridge bridge;
synchronized (mLock) {
assertPreparedAndNotSealed("openWrite");
- bridge = new FileBridge();
- mBridges.add(bridge);
+ if (PackageInstaller.ENABLE_REVOCABLE_FD) {
+ fd = new RevocableFileDescriptor();
+ bridge = null;
+ mFds.add(fd);
+ } else {
+ fd = null;
+ bridge = new FileBridge();
+ mBridges.add(bridge);
+ }
}
try {
@@ -468,9 +480,14 @@
Libcore.os.lseek(targetFd, offsetBytes, OsConstants.SEEK_SET);
}
- bridge.setTargetFile(targetFd);
- bridge.start();
- return new ParcelFileDescriptor(bridge.getClientSocket());
+ if (PackageInstaller.ENABLE_REVOCABLE_FD) {
+ fd.init(mContext, targetFd);
+ return fd.getRevocableFileDescriptor();
+ } else {
+ bridge.setTargetFile(targetFd);
+ bridge.start();
+ return new ParcelFileDescriptor(bridge.getClientSocket());
+ }
} catch (ErrnoException e) {
throw e.rethrowAsIOException();
@@ -512,6 +529,11 @@
wasSealed = mSealed;
if (!mSealed) {
// Verify that all writers are hands-off
+ for (RevocableFileDescriptor fd : mFds) {
+ if (!fd.isRevoked()) {
+ throw new SecurityException("Files still open");
+ }
+ }
for (FileBridge bridge : mBridges) {
if (!bridge.isClosed()) {
throw new SecurityException("Files still open");
@@ -1170,6 +1192,9 @@
mDestroyed = true;
// Force shut down all bridges
+ for (RevocableFileDescriptor fd : mFds) {
+ fd.revoke();
+ }
for (FileBridge bridge : mBridges) {
bridge.forceClose();
}
@@ -1211,6 +1236,7 @@
pw.printPair("mPermissionsAccepted", mPermissionsAccepted);
pw.printPair("mRelinquished", mRelinquished);
pw.printPair("mDestroyed", mDestroyed);
+ pw.printPair("mFds", mFds.size());
pw.printPair("mBridges", mBridges.size());
pw.printPair("mFinalStatus", mFinalStatus);
pw.printPair("mFinalMessage", mFinalMessage);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e2358c2..c27806d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -266,6 +266,7 @@
import com.android.server.FgThread;
import com.android.server.IntentResolver;
import com.android.server.LocalServices;
+import com.android.server.LockGuard;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
import com.android.server.SystemServerInitThreadPool;
@@ -2212,6 +2213,7 @@
public PackageManagerService(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
+ LockGuard.installLock(mPackages, LockGuard.INDEX_PACKAGES);
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "create package manager");
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
SystemClock.uptimeMillis());
@@ -7649,7 +7651,7 @@
logCriticalInfo(priority, msg);
}
- static void logCriticalInfo(int priority, String msg) {
+ public static void logCriticalInfo(int priority, String msg) {
Slog.println(priority, TAG, msg);
EventLogTags.writePmCriticalInfo(msg);
try {
diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java
index 188e66f..f0ce3c9 100644
--- a/services/core/java/com/android/server/pm/SELinuxMMAC.java
+++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java
@@ -62,8 +62,8 @@
/** Path to MAC permissions on system image */
private static final File[] MAC_PERMISSIONS =
- { new File(Environment.getRootDirectory(), "/etc/security/plat_mac_permissions.xml"),
- new File(Environment.getRootDirectory(), "/etc/security/nonplat_mac_permissions.xml") };
+ { new File(Environment.getRootDirectory(), "/etc/selinux/plat_mac_permissions.xml"),
+ new File(Environment.getVendorDirectory(), "/etc/selinux/nonplat_mac_permissions.xml") };
// Append privapp to existing seinfo label
private static final String PRIVILEGED_APP_STR = ":privapp";
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 1aaec1a..8998212 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -476,7 +476,8 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState) throws RemoteException {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq)
+ throws RemoteException {
handleOnUidStateChanged(uid, procState);
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 627fa54..b9fcf4e 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -94,6 +94,7 @@
import com.android.internal.util.XmlUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
+import com.android.server.LockGuard;
import com.android.server.SystemService;
import com.android.server.am.UserState;
import com.android.server.storage.DeviceStorageMonitorInternal;
@@ -227,7 +228,7 @@
private final Object mPackagesLock;
private final UserDataPreparer mUserDataPreparer;
// Short-term lock for internal state, when interaction/sync with PM is not required
- private final Object mUsersLock = new Object();
+ private final Object mUsersLock = LockGuard.installNewLock(LockGuard.INDEX_USER);
private final Object mRestrictionsLock = new Object();
private final Handler mHandler;
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 755c486..83dd392 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -432,7 +432,7 @@
// Ignore framework code.
// TODO(calin): is there a better way to detect it?
if (dexPath.startsWith("/system/framework/")) {
- new DexSearchResult("framework", DEX_SEARCH_NOT_FOUND);
+ return new DexSearchResult("framework", DEX_SEARCH_NOT_FOUND);
}
// First, check if the package which loads the dex file actually owns it.
diff --git a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
index eec1fef..cd55f50 100644
--- a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
+++ b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java
@@ -29,6 +29,7 @@
import android.media.RingtoneManager;
import android.os.Handler;
import android.os.UserHandle;
+import android.os.Vibrator;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Slog;
@@ -48,6 +49,11 @@
*/
public class AccessibilityShortcutController {
private static final String TAG = "AccessibilityShortcutController";
+ private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
+ .build();
+
private final Context mContext;
private AlertDialog mAlertDialog;
@@ -100,6 +106,8 @@
final int userId = ActivityManager.getCurrentUser();
final int dialogAlreadyShown = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, userId);
+
+ // Play a notification tone
final Ringtone tone =
RingtoneManager.getRingtone(mContext, Settings.System.DEFAULT_NOTIFICATION_URI);
if (tone != null) {
@@ -108,6 +116,18 @@
.build());
tone.play();
}
+
+ // Play a notification vibration
+ Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+ if ((vibrator != null) && vibrator.hasVibrator()) {
+ // Don't check if haptics are disabled, as we need to alert the user that their
+ // way of interacting with the phone may change if they activate the shortcut
+ long[] vibePattern = PhoneWindowManager.getLongIntArray(mContext.getResources(),
+ R.array.config_safeModeDisabledVibePattern);
+ vibrator.vibrate(vibePattern, -1, VIBRATION_ATTRIBUTES);
+ }
+
+
if (dialogAlreadyShown == 0) {
// The first time, we show a warning rather than toggle the service to give the user a
// chance to turn off this feature before stuff gets enabled.
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 4f1754a..548fa1e 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -26,7 +26,7 @@
import static android.content.Context.DISPLAY_SERVICE;
import static android.content.Context.WINDOW_SERVICE;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
-import static android.content.pm.PackageManager.FEATURE_TELEVISION;
+import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_WATCH;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.EMPTY;
@@ -416,6 +416,7 @@
BurnInProtectionHelper mBurnInProtectionHelper;
AppOpsManager mAppOpsManager;
private boolean mHasFeatureWatch;
+ private boolean mHasFeatureLeanback;
// Assigned on main thread, accessed on UI thread
volatile VrManagerInternal mVrManagerInternal;
@@ -767,6 +768,12 @@
private boolean mScreenshotChordPowerKeyTriggered;
private long mScreenshotChordPowerKeyTime;
+ private static final long BUGREPORT_TV_GESTURE_TIMEOUT_MILLIS = 1000;
+
+ private boolean mBugreportTvKey1Pressed;
+ private boolean mBugreportTvKey2Pressed;
+ private boolean mBugreportTvScheduled;
+
/* The number of steps between min and max brightness */
private static final int BRIGHTNESS_STEPS = 10;
@@ -810,6 +817,7 @@
private static final int MSG_DISPOSE_INPUT_CONSUMER = 19;
private static final int MSG_BACK_DELAYED_PRESS = 20;
private static final int MSG_ACCESSIBILITY_SHORTCUT = 21;
+ private static final int MSG_BUGREPORT_TV = 22;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -888,6 +896,9 @@
case MSG_ACCESSIBILITY_SHORTCUT:
accessibilityShortcutActivated();
break;
+ case MSG_BUGREPORT_TV:
+ takeBugreport();
+ break;
}
}
}
@@ -1753,6 +1764,7 @@
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mHasFeatureWatch = mContext.getPackageManager().hasSystemFeature(FEATURE_WATCH);
+ mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK);
mAccessibilityShortcutController =
new AccessibilityShortcutController(mContext, new Handler());
// Init display burn-in protection
@@ -1794,7 +1806,7 @@
mWakeGestureListener = new MyWakeGestureListener(mContext, mHandler);
mOrientationListener = new MyOrientationListener(mContext, mHandler);
try {
- mOrientationListener.setCurrentRotation(windowManager.getRotation());
+ mOrientationListener.setCurrentRotation(windowManager.getDefaultDisplayRotation());
} catch (RemoteException ex) { }
mSettingsObserver = new SettingsObserver(mHandler);
mSettingsObserver.observe();
@@ -3482,6 +3494,8 @@
} else if (keyCode == KeyEvent.KEYCODE_TAB && event.isMetaPressed()) {
// Pass through keyboard navigation keys.
return 0;
+ } else if (mHasFeatureLeanback && interceptBugreportGestureTv(keyCode, down)) {
+ return -1;
}
// Toggle Caps Lock on META-ALT.
@@ -3674,6 +3688,45 @@
return 0;
}
+ /**
+ * TV only: recognizes a remote control gesture for capturing a bug report.
+ */
+ private boolean interceptBugreportGestureTv(int keyCode, boolean down) {
+ // The bugreport capture chord is a long press on DPAD CENTER and BACK simultaneously.
+ if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+ mBugreportTvKey1Pressed = down;
+ } else if (keyCode == KeyEvent.KEYCODE_BACK) {
+ mBugreportTvKey2Pressed = down;
+ }
+
+ if (mBugreportTvKey1Pressed && mBugreportTvKey2Pressed) {
+ if (!mBugreportTvScheduled) {
+ mBugreportTvScheduled = true;
+ Message msg = Message.obtain(mHandler, MSG_BUGREPORT_TV);
+ msg.setAsynchronous(true);
+ mHandler.sendMessageDelayed(msg, BUGREPORT_TV_GESTURE_TIMEOUT_MILLIS);
+ }
+ } else if (mBugreportTvScheduled) {
+ mHandler.removeMessages(MSG_BUGREPORT_TV);
+ mBugreportTvScheduled = false;
+ }
+
+ return mBugreportTvScheduled;
+ }
+
+ private void takeBugreport() {
+ if ("1".equals(SystemProperties.get("ro.debuggable"))
+ || Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1) {
+ try {
+ ActivityManager.getService()
+ .requestBugReport(ActivityManager.BUGREPORT_OPTION_INTERACTIVE);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error taking bugreport", e);
+ }
+ }
+ }
+
/** {@inheritDoc} */
@Override
public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) {
@@ -7083,7 +7136,7 @@
@Override public void run() {
if (mBootMsgDialog == null) {
int theme;
- if (mContext.getPackageManager().hasSystemFeature(FEATURE_TELEVISION)) {
+ if (mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK)) {
theme = com.android.internal.R.style.Theme_Leanback_Dialog_Alert;
} else {
theme = 0;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index c58b527..4f67e8c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -72,9 +72,11 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.server.EventLogTags;
+import com.android.server.LockGuard;
import com.android.server.RescueParty;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
@@ -194,6 +196,7 @@
private final Context mContext;
private final ServiceThread mHandlerThread;
private final PowerManagerHandler mHandler;
+ private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private final BatterySaverPolicy mBatterySaverPolicy;
private LightsManager mLightsManager;
@@ -208,7 +211,7 @@
private DreamManagerInternal mDreamManager;
private Light mAttentionLight;
- private final Object mLock = new Object();
+ private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_POWER);
// A bitfield that indicates what parts of the power state have
// changed and need to be recalculated.
@@ -516,6 +519,9 @@
// True if theater mode is enabled
private boolean mTheaterModeEnabled;
+ // True if always on display is enabled
+ private boolean mAlwaysOnEnabled;
+
// True if double tap to wake is enabled
private boolean mDoubleTapWakeEnabled;
@@ -608,6 +614,7 @@
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
+ mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
mBatterySaverPolicy = new BatterySaverPolicy(mHandler);
synchronized (mLock) {
@@ -640,6 +647,7 @@
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
+ mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
mDisplaySuspendBlocker = null;
mWakeLockSuspendBlocker = null;
}
@@ -766,6 +774,9 @@
Settings.Global.THEATER_MODE_ON),
false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.DOZE_ALWAYS_ON),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.DOUBLE_TAP_TO_WAKE),
false, mSettingsObserver, UserHandle.USER_ALL);
IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
@@ -863,6 +874,7 @@
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.THEATER_MODE_ON, 0) == 1;
+ mAlwaysOnEnabled = mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
if (mSupportsDoubleTapWakeConfig) {
boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver,
@@ -1702,6 +1714,11 @@
return false;
}
+ // On Always On Display, SystemUI shows the charging indicator
+ if (mAlwaysOnEnabled && mWakefulness == WAKEFULNESS_DOZING) {
+ return false;
+ }
+
// Otherwise wake up!
return true;
}
diff --git a/services/core/java/com/android/server/storage/AppCollector.java b/services/core/java/com/android/server/storage/AppCollector.java
index 25880fb..a77d33f 100644
--- a/services/core/java/com/android/server/storage/AppCollector.java
+++ b/services/core/java/com/android/server/storage/AppCollector.java
@@ -116,33 +116,33 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START_LOADING_SIZES: {
- final List<ApplicationInfo> apps = mPm.getInstalledApplications(
- PackageManager.GET_UNINSTALLED_PACKAGES
- | PackageManager.GET_DISABLED_COMPONENTS);
-
- final List<ApplicationInfo> volumeApps = new ArrayList<>();
- for (ApplicationInfo app : apps) {
- if (Objects.equals(app.volumeUuid, mVolume.getFsUuid())) {
- volumeApps.add(app);
- }
- }
-
- List<UserInfo> users = mUm.getUsers();
- final int count = users.size() * volumeApps.size();
- if (count == 0) {
- mStats.complete(new ArrayList<>());
- }
-
List<PackageStats> stats = new ArrayList<>();
- for (UserInfo user : users) {
- for (ApplicationInfo app : volumeApps) {
- PackageStats packageStats = new PackageStats(app.packageName, user.id);
- StorageStats storageStats = mStorageStatsManager.queryStatsForPackage(
- app.volumeUuid, app.packageName, user.getUserHandle());
- packageStats.cacheSize = storageStats.getCacheBytes();
- packageStats.codeSize = storageStats.getCodeBytes();
- packageStats.dataSize = storageStats.getDataBytes();
- stats.add(packageStats);
+ List<UserInfo> users = mUm.getUsers();
+ for (int userCount = 0, userSize = users.size();
+ userCount < userSize; userCount++) {
+ UserInfo user = users.get(userCount);
+ final List<ApplicationInfo> apps = mPm.getInstalledApplicationsAsUser(
+ PackageManager.MATCH_DISABLED_COMPONENTS, user.id);
+
+ for (int appCount = 0, size = apps.size(); appCount < size; appCount++) {
+ ApplicationInfo app = apps.get(appCount);
+ if (!Objects.equals(app.volumeUuid, mVolume.getFsUuid())) {
+ continue;
+ }
+
+ try {
+ StorageStats storageStats =
+ mStorageStatsManager.queryStatsForPackage(app.volumeUuid,
+ app.packageName, user.getUserHandle());
+ PackageStats packageStats = new PackageStats(app.packageName,
+ user.id);
+ packageStats.cacheSize = storageStats.getCacheBytes();
+ packageStats.codeSize = storageStats.getCodeBytes();
+ packageStats.dataSize = storageStats.getDataBytes();
+ stats.add(packageStats);
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "An exception occurred while fetching app size", e);
+ }
}
}
diff --git a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
index c064392..7720e24 100644
--- a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
+++ b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
@@ -41,6 +41,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Pair;
import android.util.Slog;
import android.util.Xml;
@@ -64,6 +65,7 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* CacheQuotaStrategy is a strategy for determining cache quotas using usage stats and foreground
@@ -85,15 +87,18 @@
private final Context mContext;
private final UsageStatsManagerInternal mUsageStats;
private final Installer mInstaller;
+ private final Map<String, Map<Integer, Long>> mQuotaMap;
private ServiceConnection mServiceConnection;
private ICacheQuotaService mRemoteService;
private AtomicFile mPreviousValuesFile;
public CacheQuotaStrategy(
- Context context, UsageStatsManagerInternal usageStatsManager, Installer installer) {
+ Context context, UsageStatsManagerInternal usageStatsManager, Installer installer,
+ Map<String, Map<Integer, Long>> quotaMap) {
mContext = Preconditions.checkNotNull(context);
mUsageStats = Preconditions.checkNotNull(usageStatsManager);
mInstaller = Preconditions.checkNotNull(installer);
+ mQuotaMap = Preconditions.checkNotNull(quotaMap);
mPreviousValuesFile = new AtomicFile(new File(
new File(Environment.getDataDirectory(), "system"), "cachequota.xml"));
}
@@ -221,6 +226,9 @@
mInstaller.setAppQuota(request.getVolumeUuid(),
UserHandle.getUserId(uid),
UserHandle.getAppId(uid), proposedQuota);
+ insertIntoQuotaMap(request.getVolumeUuid(),
+ UserHandle.getUserId(uid),
+ UserHandle.getAppId(uid), proposedQuota);
} catch (Installer.InstallerException ex) {
Slog.w(TAG,
"Failed to set cache quota for " + request.getUid(),
@@ -231,6 +239,15 @@
disconnectService();
}
+ private void insertIntoQuotaMap(String volumeUuid, int userId, int appId, long quota) {
+ Map<Integer, Long> volumeMap = mQuotaMap.get(volumeUuid);
+ if (volumeMap == null) {
+ volumeMap = new ArrayMap<>();
+ mQuotaMap.put(volumeUuid, volumeMap);
+ }
+ volumeMap.put(UserHandle.getUid(userId, appId), quota);
+ }
+
private void disconnectService() {
if (mServiceConnection != null) {
mContext.unbindService(mServiceConnection);
diff --git a/services/core/java/com/android/server/vr/CompatibilityDisplay.java b/services/core/java/com/android/server/vr/CompatibilityDisplay.java
index 15edaaf..5e17daa 100644
--- a/services/core/java/com/android/server/vr/CompatibilityDisplay.java
+++ b/services/core/java/com/android/server/vr/CompatibilityDisplay.java
@@ -2,8 +2,10 @@
package com.android.server.vr;
import android.app.Service;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.os.Build;
@@ -14,6 +16,7 @@
import android.service.vr.IVrStateCallbacks;
import android.service.vr.IVrManager;
import android.util.Log;
+import android.view.Surface;
import com.android.server.vr.VrManagerService;
@@ -26,10 +29,19 @@
private final static boolean DEBUG = false;
// TODO: Go over these values and figure out what is best
- private final static int HEIGHT = 960;
- private final static int WIDTH = 720;
+ private final static int HEIGHT = 1800;
+ private final static int WIDTH = 1400;
private final static int DPI = 320;
+ private final static String DEBUG_ACTION_SET_MODE =
+ "com.android.server.vr.CompatibilityDisplay.SET_MODE";
+ private final static String DEBUG_EXTRA_MODE_ON =
+ "com.android.servier.vr.CompatibilityDisplay.EXTRA_MODE_ON";
+ private final static String DEBUG_ACTION_SET_SURFACE =
+ "com.android.server.vr.CompatibilityDisplay.SET_SURFACE";
+ private final static String DEBUG_EXTRA_SURFACE =
+ "com.android.server.vr.CompatibilityDisplay.EXTRA_SURFACE";
+
private final DisplayManager mDisplayManager;
private final IVrManager mVrManager;
@@ -42,18 +54,14 @@
public void onVrStateChanged(boolean enabled) {
if (enabled != mIsVrModeEnabled) {
mIsVrModeEnabled = enabled;
- if (enabled) {
- // TODO: Consider not creating the display until ActivityManager needs one on
- // which to display a 2D application.
- startVirtualDisplay();
- } else {
- stopVirtualDisplay();
- }
+ updateVirtualDisplay();
}
}
};
private VirtualDisplay mVirtualDisplay;
+ private Surface mSurface;
+ private boolean mIsDebugOverrideEnabled;
private boolean mIsVrModeEnabled;
public CompatibilityDisplay(DisplayManager displayManager, IVrManager vrManager) {
@@ -64,8 +72,60 @@
/**
* Initializes the compabilitiy display by listening to VR mode changes.
*/
- public void init() {
+ public void init(Context context) {
startVrModeListener();
+ startDebugOnlyBroadcastReceiver(context);
+ }
+
+ private void updateVirtualDisplay() {
+ if (mIsVrModeEnabled || (DEBUG && mIsDebugOverrideEnabled)) {
+ // TODO: Consider not creating the display until ActivityManager needs one on
+ // which to display a 2D application.
+ // TODO: STOPSHIP Remove DEBUG conditional before launching.
+ if (DEBUG) {
+ startVirtualDisplay();
+ }
+ } else {
+ // TODO: Remove conditional when launching apps 2D doesn't force VrMode to stop.
+ if (!DEBUG) {
+ stopVirtualDisplay();
+ }
+ }
+ }
+
+ private void startDebugOnlyBroadcastReceiver(Context context) {
+ if (DEBUG) {
+ IntentFilter intentFilter = new IntentFilter(DEBUG_ACTION_SET_MODE);
+ intentFilter.addAction(DEBUG_ACTION_SET_SURFACE);
+
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (DEBUG_ACTION_SET_MODE.equals(action)) {
+ mIsDebugOverrideEnabled =
+ intent.getBooleanExtra(DEBUG_EXTRA_MODE_ON, false);
+ updateVirtualDisplay();
+ } else if (DEBUG_ACTION_SET_SURFACE.equals(action)) {
+ if (mVirtualDisplay != null) {
+ final Surface newSurface =
+ intent.getParcelableExtra(DEBUG_EXTRA_SURFACE);
+
+ Log.i(TAG, "Setting the new surface from " + mSurface + " to " + newSurface);
+ if (newSurface != mSurface) {
+ mVirtualDisplay.setSurface(newSurface);
+ if (mSurface != null) {
+ mSurface.release();
+ }
+ mSurface = newSurface;
+ }
+ } else {
+ Log.w(TAG, "Cannot set the surface because the VD is null.");
+ }
+ }
+ }
+ }, intentFilter);
+ }
}
private void startVrModeListener() {
@@ -80,7 +140,7 @@
private void startVirtualDisplay() {
if (DEBUG) {
- Log.d(TAG, "Starting VD, DM:" + mDisplayManager);
+ Log.d(TAG, "Request to start VD, DM:" + mDisplayManager);
}
if (mDisplayManager == null) {
@@ -90,13 +150,16 @@
synchronized (vdLock) {
if (mVirtualDisplay != null) {
- Log.e(TAG, "Starting the virtual display when one already exists", new Exception());
+ Log.i(TAG, "VD already exists, ignoring request");
return;
}
mVirtualDisplay = mDisplayManager.createVirtualDisplay("VR 2D Display", WIDTH, HEIGHT,
- DPI,
- null /* Surface */, 0 /* flags */);
+ DPI, null /* Surface */, 0 /* flags */);
+ if (mVirtualDisplay != null && mSurface != null && mSurface.isValid()) {
+ // TODO: Need to protect all setSurface calls with a lock.
+ mVirtualDisplay.setSurface(mSurface);
+ }
}
if (DEBUG) {
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 3df4d24..8a23173 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -26,6 +26,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.hardware.display.DisplayManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -131,6 +132,7 @@
private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager();
/** Tracks the state of the screen and keyguard UI.*/
private int mSystemSleepFlags = FLAG_AWAKE;
+ private CompatibilityDisplay mCompatibilityDisplay;
private static final int MSG_VR_STATE_CHANGE = 0;
private static final int MSG_PENDING_VR_STATE_CHANGE = 1;
@@ -537,6 +539,11 @@
} else {
Slog.i(TAG, "No default vr listener service found.");
}
+
+ DisplayManager dm =
+ (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+ mCompatibilityDisplay = new CompatibilityDisplay(dm, mVrManager);
+ mCompatibilityDisplay.init(getContext());
} else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
synchronized (mLock) {
mVrModeAllowed = true;
@@ -680,10 +687,10 @@
}
}
+ mCurrentVrModeComponent = calling;
if (calling != null && !Objects.equals(calling, mCurrentVrModeComponent)) {
sendUpdatedCaller = true;
}
- mCurrentVrModeComponent = calling;
if (mCurrentVrModeUser != userId) {
mCurrentVrModeUser = userId;
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
index 83e77ec..114c362 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
@@ -18,20 +18,14 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
-import android.os.Handler;
import android.os.UserHandle;
-import android.util.Base64;
import android.util.Slog;
import android.webkit.UserPackage;
-import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -104,7 +98,7 @@
// userPackages can contain null objects.
List<UserPackage> userPackages =
mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider);
- if (isInstalledAndEnabledForAllUsers(userPackages) &&
+ if (WebViewUpdater.isInstalledAndEnabledForAllUsers(userPackages) &&
// Checking validity of the package for the system user (rather than all
// users) since package validity depends not on the user but on the package
// itself.
@@ -211,7 +205,7 @@
mSystemInterface.uninstallAndDisablePackageForAllUsers(mContext,
fallbackProvider.packageName);
} else if (!existsValidNonFallbackProvider
- && !isInstalledAndEnabledForAllUsers(userPackages)) {
+ && !WebViewUpdater.isInstalledAndEnabledForAllUsers(userPackages)) {
// Enable the fallback package for all users.
mSystemInterface.enablePackageForAllUsers(mContext,
fallbackProvider.packageName, true);
@@ -271,520 +265,6 @@
}
}
- /**
- * Class that decides what WebView implementation to use and prepares that implementation for
- * use.
- */
- private static class WebViewUpdater {
- private Context mContext;
- private SystemInterface mSystemInterface;
- private int mMinimumVersionCode = -1;
-
- public WebViewUpdater(Context context, SystemInterface systemInterface) {
- mContext = context;
- mSystemInterface = systemInterface;
- }
-
- private static class WebViewPackageMissingException extends Exception {
- public WebViewPackageMissingException(String message) { super(message); }
- public WebViewPackageMissingException(Exception e) { super(e); }
- }
-
- private static final int WAIT_TIMEOUT_MS = 1000; // KEY_DISPATCHING_TIMEOUT is 5000.
-
- // Keeps track of the number of running relro creations
- private int mNumRelroCreationsStarted = 0;
- private int mNumRelroCreationsFinished = 0;
- // Implies that we need to rerun relro creation because we are using an out-of-date package
- private boolean mWebViewPackageDirty = false;
- private boolean mAnyWebViewInstalled = false;
-
- private int NUMBER_OF_RELROS_UNKNOWN = Integer.MAX_VALUE;
-
- // The WebView package currently in use (or the one we are preparing).
- private PackageInfo mCurrentWebViewPackage = null;
-
- private Object mLock = new Object();
-
- public void packageStateChanged(String packageName, int changedState) {
- for (WebViewProviderInfo provider : mSystemInterface.getWebViewPackages()) {
- String webviewPackage = provider.packageName;
-
- if (webviewPackage.equals(packageName)) {
- boolean updateWebView = false;
- boolean removedOrChangedOldPackage = false;
- String oldProviderName = null;
- PackageInfo newPackage = null;
- synchronized(mLock) {
- try {
- newPackage = findPreferredWebViewPackage();
- if (mCurrentWebViewPackage != null) {
- oldProviderName = mCurrentWebViewPackage.packageName;
- if (changedState == WebViewUpdateService.PACKAGE_CHANGED
- && newPackage.packageName.equals(oldProviderName)) {
- // If we don't change package name we should only rerun the
- // preparation phase if the current package has been replaced
- // (not if it has been enabled/disabled).
- return;
- }
- if (newPackage.packageName.equals(oldProviderName)
- && (newPackage.lastUpdateTime
- == mCurrentWebViewPackage.lastUpdateTime)) {
- // If the chosen package hasn't been updated, then early-out
- return;
- }
- }
- // Only trigger update actions if the updated package is the one
- // that will be used, or the one that was in use before the
- // update, or if we haven't seen a valid WebView package before.
- updateWebView =
- provider.packageName.equals(newPackage.packageName)
- || provider.packageName.equals(oldProviderName)
- || mCurrentWebViewPackage == null;
- // We removed the old package if we received an intent to remove
- // or replace the old package.
- removedOrChangedOldPackage =
- provider.packageName.equals(oldProviderName);
- if (updateWebView) {
- onWebViewProviderChanged(newPackage);
- }
- } catch (WebViewPackageMissingException e) {
- mCurrentWebViewPackage = null;
- Slog.e(TAG, "Could not find valid WebView package to create " +
- "relro with " + e);
- }
- }
- if(updateWebView && !removedOrChangedOldPackage
- && oldProviderName != null) {
- // If the provider change is the result of adding or replacing a
- // package that was not the previous provider then we must kill
- // packages dependent on the old package ourselves. The framework
- // only kills dependents of packages that are being removed.
- mSystemInterface.killPackageDependents(oldProviderName);
- }
- return;
- }
- }
- }
-
- public void prepareWebViewInSystemServer() {
- try {
- synchronized(mLock) {
- mCurrentWebViewPackage = findPreferredWebViewPackage();
- // Don't persist the user-chosen setting across boots if the package being
- // chosen is not used (could be disabled or uninstalled) so that the user won't
- // be surprised by the device switching to using a certain webview package,
- // that was uninstalled/disabled a long time ago, if it is installed/enabled
- // again.
- mSystemInterface.updateUserSetting(mContext,
- mCurrentWebViewPackage.packageName);
- onWebViewProviderChanged(mCurrentWebViewPackage);
- }
- } catch (Throwable t) {
- // Log and discard errors at this stage as we must not crash the system server.
- Slog.e(TAG, "error preparing webview provider from system server", t);
- }
- }
-
- /**
- * Change WebView provider and provider setting and kill packages using the old provider.
- * Return the new provider (in case we are in the middle of creating relro files, or
- * replacing that provider it will not be in use directly, but will be used when the relros
- * or the replacement are done).
- */
- public String changeProviderAndSetting(String newProviderName) {
- PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName);
- if (newPackage == null) return "";
- return newPackage.packageName;
- }
-
- /**
- * This is called when we change WebView provider, either when the current provider is
- * updated or a new provider is chosen / takes precedence.
- */
- private void onWebViewProviderChanged(PackageInfo newPackage) {
- synchronized(mLock) {
- mAnyWebViewInstalled = true;
- if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
- mCurrentWebViewPackage = newPackage;
-
- // The relro creations might 'finish' (not start at all) before
- // WebViewFactory.onWebViewProviderChanged which means we might not know the
- // number of started creations before they finish.
- mNumRelroCreationsStarted = NUMBER_OF_RELROS_UNKNOWN;
- mNumRelroCreationsFinished = 0;
- mNumRelroCreationsStarted =
- mSystemInterface.onWebViewProviderChanged(newPackage);
- // If the relro creations finish before we know the number of started creations
- // we will have to do any cleanup/notifying here.
- checkIfRelrosDoneLocked();
- } else {
- mWebViewPackageDirty = true;
- }
- }
- }
-
- private ProviderAndPackageInfo[] getValidWebViewPackagesAndInfos() {
- WebViewProviderInfo[] allProviders = mSystemInterface.getWebViewPackages();
- List<ProviderAndPackageInfo> providers = new ArrayList<>();
- for(int n = 0; n < allProviders.length; n++) {
- try {
- PackageInfo packageInfo =
- mSystemInterface.getPackageInfoForProvider(allProviders[n]);
- if (isValidProvider(allProviders[n], packageInfo)) {
- providers.add(new ProviderAndPackageInfo(allProviders[n], packageInfo));
- }
- } catch (NameNotFoundException e) {
- // Don't add non-existent packages
- }
- }
- return providers.toArray(new ProviderAndPackageInfo[providers.size()]);
- }
-
- /**
- * Fetch only the currently valid WebView packages.
- **/
- public WebViewProviderInfo[] getValidWebViewPackages() {
- ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos();
- WebViewProviderInfo[] providers =
- new WebViewProviderInfo[providersAndPackageInfos.length];
- for(int n = 0; n < providersAndPackageInfos.length; n++) {
- providers[n] = providersAndPackageInfos[n].provider;
- }
- return providers;
- }
-
-
- private static class ProviderAndPackageInfo {
- public final WebViewProviderInfo provider;
- public final PackageInfo packageInfo;
-
- public ProviderAndPackageInfo(WebViewProviderInfo provider, PackageInfo packageInfo) {
- this.provider = provider;
- this.packageInfo = packageInfo;
- }
- }
-
- /**
- * Returns either the package info of the WebView provider determined in the following way:
- * If the user has chosen a provider then use that if it is valid,
- * otherwise use the first package in the webview priority list that is valid.
- *
- */
- private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException {
- ProviderAndPackageInfo[] providers = getValidWebViewPackagesAndInfos();
-
- String userChosenProvider = mSystemInterface.getUserChosenWebViewProvider(mContext);
-
- // If the user has chosen provider, use that (if it's installed and enabled for all
- // users).
- for (ProviderAndPackageInfo providerAndPackage : providers) {
- if (providerAndPackage.provider.packageName.equals(userChosenProvider)) {
- // userPackages can contain null objects.
- List<UserPackage> userPackages =
- mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
- providerAndPackage.provider);
- if (isInstalledAndEnabledForAllUsers(userPackages)) {
- return providerAndPackage.packageInfo;
- }
- }
- }
-
- // User did not choose, or the choice failed; use the most stable provider that is
- // installed and enabled for all users, and available by default (not through
- // user choice).
- for (ProviderAndPackageInfo providerAndPackage : providers) {
- if (providerAndPackage.provider.availableByDefault) {
- // userPackages can contain null objects.
- List<UserPackage> userPackages =
- mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
- providerAndPackage.provider);
- if (isInstalledAndEnabledForAllUsers(userPackages)) {
- return providerAndPackage.packageInfo;
- }
- }
- }
-
- // Could not find any installed and enabled package either, use the most stable and
- // default-available provider.
- // TODO(gsennton) remove this when we have a functional WebView stub.
- for (ProviderAndPackageInfo providerAndPackage : providers) {
- if (providerAndPackage.provider.availableByDefault) {
- return providerAndPackage.packageInfo;
- }
- }
-
- // This should never happen during normal operation (only with modified system images).
- mAnyWebViewInstalled = false;
- throw new WebViewPackageMissingException("Could not find a loadable WebView package");
- }
-
- public void notifyRelroCreationCompleted() {
- synchronized (mLock) {
- mNumRelroCreationsFinished++;
- checkIfRelrosDoneLocked();
- }
- }
-
- public WebViewProviderResponse waitForAndGetProvider() {
- PackageInfo webViewPackage = null;
- final long NS_PER_MS = 1000000;
- final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS;
- boolean webViewReady = false;
- int webViewStatus = WebViewFactory.LIBLOAD_SUCCESS;
- synchronized (mLock) {
- webViewReady = webViewIsReadyLocked();
- while (!webViewReady) {
- final long timeNowMs = System.nanoTime() / NS_PER_MS;
- if (timeNowMs >= timeoutTimeMs) break;
- try {
- mLock.wait(timeoutTimeMs - timeNowMs);
- } catch (InterruptedException e) {}
- webViewReady = webViewIsReadyLocked();
- }
- // Make sure we return the provider that was used to create the relro file
- webViewPackage = mCurrentWebViewPackage;
- if (webViewReady) {
- } else if (!mAnyWebViewInstalled) {
- webViewStatus = WebViewFactory.LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES;
- } else {
- // Either the current relro creation isn't done yet, or the new relro creatioin
- // hasn't kicked off yet (the last relro creation used an out-of-date WebView).
- webViewStatus = WebViewFactory.LIBLOAD_FAILED_WAITING_FOR_RELRO;
- Slog.e(TAG, "Timed out waiting for relro creation, relros started "
- + mNumRelroCreationsStarted
- + " relros finished " + mNumRelroCreationsFinished
- + " package dirty? " + mWebViewPackageDirty);
- }
- }
- if (!webViewReady) Slog.w(TAG, "creating relro file timed out");
- return new WebViewProviderResponse(webViewPackage, webViewStatus);
- }
-
- public PackageInfo getCurrentWebViewPackage() {
- synchronized(mLock) {
- return mCurrentWebViewPackage;
- }
- }
-
- /**
- * Returns whether WebView is ready and is not going to go through its preparation phase
- * again directly.
- */
- private boolean webViewIsReadyLocked() {
- return !mWebViewPackageDirty
- && (mNumRelroCreationsStarted == mNumRelroCreationsFinished)
- // The current package might be replaced though we haven't received an intent
- // declaring this yet, the following flag makes anyone loading WebView to wait in
- // this case.
- && mAnyWebViewInstalled;
- }
-
- private void checkIfRelrosDoneLocked() {
- if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
- if (mWebViewPackageDirty) {
- mWebViewPackageDirty = false;
- // If we have changed provider since we started the relro creation we need to
- // redo the whole process using the new package instead.
- try {
- PackageInfo newPackage = findPreferredWebViewPackage();
- onWebViewProviderChanged(newPackage);
- } catch (WebViewPackageMissingException e) {
- mCurrentWebViewPackage = null;
- // If we can't find any valid WebView package we are now in a state where
- // mAnyWebViewInstalled is false, so loading WebView will be blocked and we
- // should simply wait until we receive an intent declaring a new package was
- // installed.
- }
- } else {
- mLock.notifyAll();
- }
- }
- }
-
- /**
- * Both versionCodes should be from a WebView provider package implemented by Chromium.
- * VersionCodes from other kinds of packages won't make any sense in this method.
- *
- * An introduction to Chromium versionCode scheme:
- * "BBBBPPPAX"
- * BBBB: 4 digit branch number. It monotonically increases over time.
- * PPP: patch number in the branch. It is padded with zeroes to the left. These three digits
- * may change their meaning in the future.
- * A: architecture digit.
- * X: A digit to differentiate APKs for other reasons.
- *
- * This method takes the "BBBB" of versionCodes and compare them.
- *
- * @return true if versionCode1 is higher than or equal to versionCode2.
- */
- private static boolean versionCodeGE(int versionCode1, int versionCode2) {
- int v1 = versionCode1 / 100000;
- int v2 = versionCode2 / 100000;
-
- return v1 >= v2;
- }
-
- /**
- * Returns whether this provider is valid for use as a WebView provider.
- */
- public boolean isValidProvider(WebViewProviderInfo configInfo,
- PackageInfo packageInfo) {
- // Ensure the provider targets this framework release (or a later one).
- if (!UserPackage.hasCorrectTargetSdkVersion(packageInfo)) {
- return false;
- }
- if (!versionCodeGE(packageInfo.versionCode, getMinimumVersionCode())
- && !mSystemInterface.systemIsDebuggable()) {
- // Webview providers may be downgraded arbitrarily low, prevent that by enforcing
- // minimum version code. This check is only enforced for user builds.
- return false;
- }
- if (providerHasValidSignature(configInfo, packageInfo, mSystemInterface) &&
- WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo) != null) {
- return true;
- }
- return false;
- }
-
- /**
- * Gets the minimum version code allowed for a valid provider. It is the minimum versionCode
- * of all available-by-default and non-fallback WebView provider packages. If there is no
- * such WebView provider package on the system, then return -1, which means all positive
- * versionCode WebView packages are accepted.
- *
- * Note that this is a private method in WebViewUpdater that handles a variable
- * (mMinimumVersionCode) which is shared between threads. Furthermore, this method does not
- * hold mLock meaning that we must take extra care to ensure this method is thread-safe.
- */
- private int getMinimumVersionCode() {
- if (mMinimumVersionCode > 0) {
- return mMinimumVersionCode;
- }
-
- int minimumVersionCode = -1;
- for (WebViewProviderInfo provider : mSystemInterface.getWebViewPackages()) {
- if (provider.availableByDefault && !provider.isFallback) {
- try {
- int versionCode =
- mSystemInterface.getFactoryPackageVersion(provider.packageName);
- if (minimumVersionCode < 0 || versionCode < minimumVersionCode) {
- minimumVersionCode = versionCode;
- }
- } catch (NameNotFoundException e) {
- // Safe to ignore.
- }
- }
- }
-
- mMinimumVersionCode = minimumVersionCode;
- return mMinimumVersionCode;
- }
-
- public void dumpState(PrintWriter pw) {
- synchronized (mLock) {
- if (mCurrentWebViewPackage == null) {
- pw.println(" Current WebView package is null");
- } else {
- pw.println(String.format(" Current WebView package (name, version): (%s, %s)",
- mCurrentWebViewPackage.packageName,
- mCurrentWebViewPackage.versionName));
- }
- pw.println(String.format(" Minimum WebView version code: %d",
- mMinimumVersionCode));
- pw.println(String.format(" Number of relros started: %d",
- mNumRelroCreationsStarted));
- pw.println(String.format(" Number of relros finished: %d",
- mNumRelroCreationsFinished));
- pw.println(String.format(" WebView package dirty: %b", mWebViewPackageDirty));
- pw.println(String.format(" Any WebView package installed: %b",
- mAnyWebViewInstalled));
- }
- }
-
- /**
- * Update the current WebView package.
- * @param newProviderName the package to switch to, null if no package has been explicitly
- * chosen.
- */
- public PackageInfo updateCurrentWebViewPackage(String newProviderName) {
- PackageInfo oldPackage = null;
- PackageInfo newPackage = null;
- boolean providerChanged = false;
- synchronized(mLock) {
- oldPackage = mCurrentWebViewPackage;
-
- if (newProviderName != null) {
- mSystemInterface.updateUserSetting(mContext, newProviderName);
- }
-
- try {
- newPackage = findPreferredWebViewPackage();
- providerChanged = (oldPackage == null)
- || !newPackage.packageName.equals(oldPackage.packageName);
- } catch (WebViewPackageMissingException e) {
- // If updated the Setting but don't have an installed WebView package, the
- // Setting will be used when a package is available.
- mCurrentWebViewPackage = null;
- Slog.e(TAG, "Couldn't find WebView package to use " + e);
- return null;
- }
- // Perform the provider change if we chose a new provider
- if (providerChanged) {
- onWebViewProviderChanged(newPackage);
- }
- }
- // Kill apps using the old provider only if we changed provider
- if (providerChanged && oldPackage != null) {
- mSystemInterface.killPackageDependents(oldPackage.packageName);
- }
- // Return the new provider, this is not necessarily the one we were asked to switch to,
- // but the persistent setting will now be pointing to the provider we were asked to
- // switch to anyway.
- return newPackage;
- }
- }
-
- private static boolean providerHasValidSignature(WebViewProviderInfo provider,
- PackageInfo packageInfo, SystemInterface systemInterface) {
- if (systemInterface.systemIsDebuggable()) {
- return true;
- }
- Signature[] packageSignatures;
- // If no signature is declared, instead check whether the package is included in the
- // system.
- if (provider.signatures == null || provider.signatures.length == 0) {
- return packageInfo.applicationInfo.isSystemApp();
- }
- packageSignatures = packageInfo.signatures;
- if (packageSignatures.length != 1)
- return false;
-
- final byte[] packageSignature = packageSignatures[0].toByteArray();
- // Return whether the package signature matches any of the valid signatures
- for (String signature : provider.signatures) {
- final byte[] validSignature = Base64.decode(signature, Base64.DEFAULT);
- if (Arrays.equals(packageSignature, validSignature))
- return true;
- }
- return false;
- }
-
- /**
- * Return true iff {@param packageInfos} point to only installed and enabled packages.
- * The given packages {@param packageInfos} should all be pointing to the same package, but each
- * PackageInfo representing a different user's package.
- */
- private static boolean isInstalledAndEnabledForAllUsers(
- List<UserPackage> userPackages) {
- for (UserPackage userPackage : userPackages) {
- if (!userPackage.isInstalledPackage() || !userPackage.isEnabledPackage()) {
- return false;
- }
- }
- return true;
- }
-
private static boolean isDisabledForAllUsers(List<UserPackage> userPackages) {
for (UserPackage userPackage : userPackages) {
if (userPackage.getPackageInfo() != null && userPackage.isEnabledPackage()) {
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdater.java b/services/core/java/com/android/server/webkit/WebViewUpdater.java
new file mode 100644
index 0000000..56311a3
--- /dev/null
+++ b/services/core/java/com/android/server/webkit/WebViewUpdater.java
@@ -0,0 +1,622 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.webkit;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.Signature;
+import android.os.UserHandle;
+import android.util.Base64;
+import android.util.Slog;
+import android.webkit.UserPackage;
+import android.webkit.WebViewFactory;
+import android.webkit.WebViewProviderInfo;
+import android.webkit.WebViewProviderResponse;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Class that decides what WebView implementation to use and prepares that implementation for
+ * use.
+ */
+class WebViewUpdater {
+ private static final String TAG = WebViewUpdater.class.getSimpleName();
+
+ private static class WebViewPackageMissingException extends Exception {
+ public WebViewPackageMissingException(String message) { super(message); }
+ public WebViewPackageMissingException(Exception e) { super(e); }
+ }
+
+ private static final int WAIT_TIMEOUT_MS = 1000; // KEY_DISPATCHING_TIMEOUT is 5000.
+
+ private final static int VALIDITY_OK = 0;
+ private final static int VALIDITY_INCORRECT_SDK_VERSION = 1;
+ private final static int VALIDITY_INCORRECT_VERSION_CODE = 2;
+ private final static int VALIDITY_INCORRECT_SIGNATURE = 3;
+ private final static int VALIDITY_NO_LIBRARY_FLAG = 4;
+
+ private Context mContext;
+ private SystemInterface mSystemInterface;
+ private int mMinimumVersionCode = -1;
+
+ // Keeps track of the number of running relro creations
+ private int mNumRelroCreationsStarted = 0;
+ private int mNumRelroCreationsFinished = 0;
+ // Implies that we need to rerun relro creation because we are using an out-of-date package
+ private boolean mWebViewPackageDirty = false;
+ private boolean mAnyWebViewInstalled = false;
+
+ private int NUMBER_OF_RELROS_UNKNOWN = Integer.MAX_VALUE;
+
+ // The WebView package currently in use (or the one we are preparing).
+ private PackageInfo mCurrentWebViewPackage = null;
+
+ private Object mLock = new Object();
+
+ WebViewUpdater(Context context, SystemInterface systemInterface) {
+ mContext = context;
+ mSystemInterface = systemInterface;
+ }
+
+ void packageStateChanged(String packageName, int changedState) {
+ for (WebViewProviderInfo provider : mSystemInterface.getWebViewPackages()) {
+ String webviewPackage = provider.packageName;
+
+ if (webviewPackage.equals(packageName)) {
+ boolean updateWebView = false;
+ boolean removedOrChangedOldPackage = false;
+ String oldProviderName = null;
+ PackageInfo newPackage = null;
+ synchronized(mLock) {
+ try {
+ newPackage = findPreferredWebViewPackage();
+ if (mCurrentWebViewPackage != null) {
+ oldProviderName = mCurrentWebViewPackage.packageName;
+ if (changedState == WebViewUpdateService.PACKAGE_CHANGED
+ && newPackage.packageName.equals(oldProviderName)) {
+ // If we don't change package name we should only rerun the
+ // preparation phase if the current package has been replaced
+ // (not if it has been enabled/disabled).
+ return;
+ }
+ if (newPackage.packageName.equals(oldProviderName)
+ && (newPackage.lastUpdateTime
+ == mCurrentWebViewPackage.lastUpdateTime)) {
+ // If the chosen package hasn't been updated, then early-out
+ return;
+ }
+ }
+ // Only trigger update actions if the updated package is the one
+ // that will be used, or the one that was in use before the
+ // update, or if we haven't seen a valid WebView package before.
+ updateWebView =
+ provider.packageName.equals(newPackage.packageName)
+ || provider.packageName.equals(oldProviderName)
+ || mCurrentWebViewPackage == null;
+ // We removed the old package if we received an intent to remove
+ // or replace the old package.
+ removedOrChangedOldPackage =
+ provider.packageName.equals(oldProviderName);
+ if (updateWebView) {
+ onWebViewProviderChanged(newPackage);
+ }
+ } catch (WebViewPackageMissingException e) {
+ mCurrentWebViewPackage = null;
+ Slog.e(TAG, "Could not find valid WebView package to create " +
+ "relro with " + e);
+ }
+ }
+ if(updateWebView && !removedOrChangedOldPackage
+ && oldProviderName != null) {
+ // If the provider change is the result of adding or replacing a
+ // package that was not the previous provider then we must kill
+ // packages dependent on the old package ourselves. The framework
+ // only kills dependents of packages that are being removed.
+ mSystemInterface.killPackageDependents(oldProviderName);
+ }
+ return;
+ }
+ }
+ }
+
+ void prepareWebViewInSystemServer() {
+ try {
+ synchronized(mLock) {
+ mCurrentWebViewPackage = findPreferredWebViewPackage();
+ // Don't persist the user-chosen setting across boots if the package being
+ // chosen is not used (could be disabled or uninstalled) so that the user won't
+ // be surprised by the device switching to using a certain webview package,
+ // that was uninstalled/disabled a long time ago, if it is installed/enabled
+ // again.
+ mSystemInterface.updateUserSetting(mContext,
+ mCurrentWebViewPackage.packageName);
+ onWebViewProviderChanged(mCurrentWebViewPackage);
+ }
+ } catch (Throwable t) {
+ // Log and discard errors at this stage as we must not crash the system server.
+ Slog.e(TAG, "error preparing webview provider from system server", t);
+ }
+ }
+
+ /**
+ * Change WebView provider and provider setting and kill packages using the old provider.
+ * Return the new provider (in case we are in the middle of creating relro files, or
+ * replacing that provider it will not be in use directly, but will be used when the relros
+ * or the replacement are done).
+ */
+ String changeProviderAndSetting(String newProviderName) {
+ PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName);
+ if (newPackage == null) return "";
+ return newPackage.packageName;
+ }
+
+ /**
+ * Update the current WebView package.
+ * @param newProviderName the package to switch to, null if no package has been explicitly
+ * chosen.
+ */
+ PackageInfo updateCurrentWebViewPackage(String newProviderName) {
+ PackageInfo oldPackage = null;
+ PackageInfo newPackage = null;
+ boolean providerChanged = false;
+ synchronized(mLock) {
+ oldPackage = mCurrentWebViewPackage;
+
+ if (newProviderName != null) {
+ mSystemInterface.updateUserSetting(mContext, newProviderName);
+ }
+
+ try {
+ newPackage = findPreferredWebViewPackage();
+ providerChanged = (oldPackage == null)
+ || !newPackage.packageName.equals(oldPackage.packageName);
+ } catch (WebViewPackageMissingException e) {
+ // If updated the Setting but don't have an installed WebView package, the
+ // Setting will be used when a package is available.
+ mCurrentWebViewPackage = null;
+ Slog.e(TAG, "Couldn't find WebView package to use " + e);
+ return null;
+ }
+ // Perform the provider change if we chose a new provider
+ if (providerChanged) {
+ onWebViewProviderChanged(newPackage);
+ }
+ }
+ // Kill apps using the old provider only if we changed provider
+ if (providerChanged && oldPackage != null) {
+ mSystemInterface.killPackageDependents(oldPackage.packageName);
+ }
+ // Return the new provider, this is not necessarily the one we were asked to switch to,
+ // but the persistent setting will now be pointing to the provider we were asked to
+ // switch to anyway.
+ return newPackage;
+ }
+
+ /**
+ * This is called when we change WebView provider, either when the current provider is
+ * updated or a new provider is chosen / takes precedence.
+ */
+ private void onWebViewProviderChanged(PackageInfo newPackage) {
+ synchronized(mLock) {
+ mAnyWebViewInstalled = true;
+ if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
+ mCurrentWebViewPackage = newPackage;
+
+ // The relro creations might 'finish' (not start at all) before
+ // WebViewFactory.onWebViewProviderChanged which means we might not know the
+ // number of started creations before they finish.
+ mNumRelroCreationsStarted = NUMBER_OF_RELROS_UNKNOWN;
+ mNumRelroCreationsFinished = 0;
+ mNumRelroCreationsStarted =
+ mSystemInterface.onWebViewProviderChanged(newPackage);
+ // If the relro creations finish before we know the number of started creations
+ // we will have to do any cleanup/notifying here.
+ checkIfRelrosDoneLocked();
+ } else {
+ mWebViewPackageDirty = true;
+ }
+ }
+ }
+
+ /**
+ * Fetch only the currently valid WebView packages.
+ **/
+ WebViewProviderInfo[] getValidWebViewPackages() {
+ ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos();
+ WebViewProviderInfo[] providers =
+ new WebViewProviderInfo[providersAndPackageInfos.length];
+ for(int n = 0; n < providersAndPackageInfos.length; n++) {
+ providers[n] = providersAndPackageInfos[n].provider;
+ }
+ return providers;
+ }
+
+ private static class ProviderAndPackageInfo {
+ public final WebViewProviderInfo provider;
+ public final PackageInfo packageInfo;
+
+ public ProviderAndPackageInfo(WebViewProviderInfo provider, PackageInfo packageInfo) {
+ this.provider = provider;
+ this.packageInfo = packageInfo;
+ }
+ }
+
+ private ProviderAndPackageInfo[] getValidWebViewPackagesAndInfos() {
+ WebViewProviderInfo[] allProviders = mSystemInterface.getWebViewPackages();
+ List<ProviderAndPackageInfo> providers = new ArrayList<>();
+ for(int n = 0; n < allProviders.length; n++) {
+ try {
+ PackageInfo packageInfo =
+ mSystemInterface.getPackageInfoForProvider(allProviders[n]);
+ if (isValidProvider(allProviders[n], packageInfo)) {
+ providers.add(new ProviderAndPackageInfo(allProviders[n], packageInfo));
+ }
+ } catch (NameNotFoundException e) {
+ // Don't add non-existent packages
+ }
+ }
+ return providers.toArray(new ProviderAndPackageInfo[providers.size()]);
+ }
+
+ /**
+ * Returns either the package info of the WebView provider determined in the following way:
+ * If the user has chosen a provider then use that if it is valid,
+ * otherwise use the first package in the webview priority list that is valid.
+ *
+ */
+ private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException {
+ ProviderAndPackageInfo[] providers = getValidWebViewPackagesAndInfos();
+
+ String userChosenProvider = mSystemInterface.getUserChosenWebViewProvider(mContext);
+
+ // If the user has chosen provider, use that (if it's installed and enabled for all
+ // users).
+ for (ProviderAndPackageInfo providerAndPackage : providers) {
+ if (providerAndPackage.provider.packageName.equals(userChosenProvider)) {
+ // userPackages can contain null objects.
+ List<UserPackage> userPackages =
+ mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
+ providerAndPackage.provider);
+ if (isInstalledAndEnabledForAllUsers(userPackages)) {
+ return providerAndPackage.packageInfo;
+ }
+ }
+ }
+
+ // User did not choose, or the choice failed; use the most stable provider that is
+ // installed and enabled for all users, and available by default (not through
+ // user choice).
+ for (ProviderAndPackageInfo providerAndPackage : providers) {
+ if (providerAndPackage.provider.availableByDefault) {
+ // userPackages can contain null objects.
+ List<UserPackage> userPackages =
+ mSystemInterface.getPackageInfoForProviderAllUsers(mContext,
+ providerAndPackage.provider);
+ if (isInstalledAndEnabledForAllUsers(userPackages)) {
+ return providerAndPackage.packageInfo;
+ }
+ }
+ }
+
+ // Could not find any installed and enabled package either, use the most stable and
+ // default-available provider.
+ // TODO(gsennton) remove this when we have a functional WebView stub.
+ for (ProviderAndPackageInfo providerAndPackage : providers) {
+ if (providerAndPackage.provider.availableByDefault) {
+ return providerAndPackage.packageInfo;
+ }
+ }
+
+ // This should never happen during normal operation (only with modified system images).
+ mAnyWebViewInstalled = false;
+ throw new WebViewPackageMissingException("Could not find a loadable WebView package");
+ }
+
+ /**
+ * Return true iff {@param packageInfos} point to only installed and enabled packages.
+ * The given packages {@param packageInfos} should all be pointing to the same package, but each
+ * PackageInfo representing a different user's package.
+ */
+ static boolean isInstalledAndEnabledForAllUsers(
+ List<UserPackage> userPackages) {
+ for (UserPackage userPackage : userPackages) {
+ if (!userPackage.isInstalledPackage() || !userPackage.isEnabledPackage()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ void notifyRelroCreationCompleted() {
+ synchronized (mLock) {
+ mNumRelroCreationsFinished++;
+ checkIfRelrosDoneLocked();
+ }
+ }
+
+ WebViewProviderResponse waitForAndGetProvider() {
+ PackageInfo webViewPackage = null;
+ final long NS_PER_MS = 1000000;
+ final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS;
+ boolean webViewReady = false;
+ int webViewStatus = WebViewFactory.LIBLOAD_SUCCESS;
+ synchronized (mLock) {
+ webViewReady = webViewIsReadyLocked();
+ while (!webViewReady) {
+ final long timeNowMs = System.nanoTime() / NS_PER_MS;
+ if (timeNowMs >= timeoutTimeMs) break;
+ try {
+ mLock.wait(timeoutTimeMs - timeNowMs);
+ } catch (InterruptedException e) {}
+ webViewReady = webViewIsReadyLocked();
+ }
+ // Make sure we return the provider that was used to create the relro file
+ webViewPackage = mCurrentWebViewPackage;
+ if (webViewReady) {
+ } else if (!mAnyWebViewInstalled) {
+ webViewStatus = WebViewFactory.LIBLOAD_FAILED_LISTING_WEBVIEW_PACKAGES;
+ } else {
+ // Either the current relro creation isn't done yet, or the new relro creatioin
+ // hasn't kicked off yet (the last relro creation used an out-of-date WebView).
+ webViewStatus = WebViewFactory.LIBLOAD_FAILED_WAITING_FOR_RELRO;
+ Slog.e(TAG, "Timed out waiting for relro creation, relros started "
+ + mNumRelroCreationsStarted
+ + " relros finished " + mNumRelroCreationsFinished
+ + " package dirty? " + mWebViewPackageDirty);
+ }
+ }
+ if (!webViewReady) Slog.w(TAG, "creating relro file timed out");
+ return new WebViewProviderResponse(webViewPackage, webViewStatus);
+ }
+
+ PackageInfo getCurrentWebViewPackage() {
+ synchronized(mLock) {
+ return mCurrentWebViewPackage;
+ }
+ }
+
+ /**
+ * Returns whether WebView is ready and is not going to go through its preparation phase
+ * again directly.
+ */
+ private boolean webViewIsReadyLocked() {
+ return !mWebViewPackageDirty
+ && (mNumRelroCreationsStarted == mNumRelroCreationsFinished)
+ // The current package might be replaced though we haven't received an intent
+ // declaring this yet, the following flag makes anyone loading WebView to wait in
+ // this case.
+ && mAnyWebViewInstalled;
+ }
+
+ private void checkIfRelrosDoneLocked() {
+ if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
+ if (mWebViewPackageDirty) {
+ mWebViewPackageDirty = false;
+ // If we have changed provider since we started the relro creation we need to
+ // redo the whole process using the new package instead.
+ try {
+ PackageInfo newPackage = findPreferredWebViewPackage();
+ onWebViewProviderChanged(newPackage);
+ } catch (WebViewPackageMissingException e) {
+ mCurrentWebViewPackage = null;
+ // If we can't find any valid WebView package we are now in a state where
+ // mAnyWebViewInstalled is false, so loading WebView will be blocked and we
+ // should simply wait until we receive an intent declaring a new package was
+ // installed.
+ }
+ } else {
+ mLock.notifyAll();
+ }
+ }
+ }
+
+ /**
+ * Returns whether this provider is valid for use as a WebView provider.
+ */
+ boolean isValidProvider(WebViewProviderInfo configInfo, PackageInfo packageInfo) {
+ return VALIDITY_OK == validityResult(configInfo, packageInfo);
+ }
+
+ private int validityResult(WebViewProviderInfo configInfo, PackageInfo packageInfo) {
+ // Ensure the provider targets this framework release (or a later one).
+ if (!UserPackage.hasCorrectTargetSdkVersion(packageInfo)) {
+ return VALIDITY_INCORRECT_SDK_VERSION;
+ }
+ if (!versionCodeGE(packageInfo.versionCode, getMinimumVersionCode())
+ && !mSystemInterface.systemIsDebuggable()) {
+ // Webview providers may be downgraded arbitrarily low, prevent that by enforcing
+ // minimum version code. This check is only enforced for user builds.
+ return VALIDITY_INCORRECT_VERSION_CODE;
+ }
+ if (!providerHasValidSignature(configInfo, packageInfo, mSystemInterface)) {
+ return VALIDITY_INCORRECT_SIGNATURE;
+ }
+ if (WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo) == null) {
+ return VALIDITY_NO_LIBRARY_FLAG;
+ }
+ return VALIDITY_OK;
+ }
+
+ /**
+ * Both versionCodes should be from a WebView provider package implemented by Chromium.
+ * VersionCodes from other kinds of packages won't make any sense in this method.
+ *
+ * An introduction to Chromium versionCode scheme:
+ * "BBBBPPPAX"
+ * BBBB: 4 digit branch number. It monotonically increases over time.
+ * PPP: patch number in the branch. It is padded with zeroes to the left. These three digits
+ * may change their meaning in the future.
+ * A: architecture digit.
+ * X: A digit to differentiate APKs for other reasons.
+ *
+ * This method takes the "BBBB" of versionCodes and compare them.
+ *
+ * @return true if versionCode1 is higher than or equal to versionCode2.
+ */
+ private static boolean versionCodeGE(int versionCode1, int versionCode2) {
+ int v1 = versionCode1 / 100000;
+ int v2 = versionCode2 / 100000;
+
+ return v1 >= v2;
+ }
+
+ /**
+ * Gets the minimum version code allowed for a valid provider. It is the minimum versionCode
+ * of all available-by-default and non-fallback WebView provider packages. If there is no
+ * such WebView provider package on the system, then return -1, which means all positive
+ * versionCode WebView packages are accepted.
+ *
+ * Note that this is a private method in WebViewUpdater that handles a variable
+ * (mMinimumVersionCode) which is shared between threads. Furthermore, this method does not
+ * hold mLock meaning that we must take extra care to ensure this method is thread-safe.
+ */
+ private int getMinimumVersionCode() {
+ if (mMinimumVersionCode > 0) {
+ return mMinimumVersionCode;
+ }
+
+ int minimumVersionCode = -1;
+ for (WebViewProviderInfo provider : mSystemInterface.getWebViewPackages()) {
+ if (provider.availableByDefault && !provider.isFallback) {
+ try {
+ int versionCode =
+ mSystemInterface.getFactoryPackageVersion(provider.packageName);
+ if (minimumVersionCode < 0 || versionCode < minimumVersionCode) {
+ minimumVersionCode = versionCode;
+ }
+ } catch (NameNotFoundException e) {
+ // Safe to ignore.
+ }
+ }
+ }
+
+ mMinimumVersionCode = minimumVersionCode;
+ return mMinimumVersionCode;
+ }
+
+ private static boolean providerHasValidSignature(WebViewProviderInfo provider,
+ PackageInfo packageInfo, SystemInterface systemInterface) {
+ if (systemInterface.systemIsDebuggable()) {
+ return true;
+ }
+ Signature[] packageSignatures;
+ // If no signature is declared, instead check whether the package is included in the
+ // system.
+ if (provider.signatures == null || provider.signatures.length == 0) {
+ return packageInfo.applicationInfo.isSystemApp();
+ }
+ packageSignatures = packageInfo.signatures;
+ if (packageSignatures.length != 1)
+ return false;
+
+ final byte[] packageSignature = packageSignatures[0].toByteArray();
+ // Return whether the package signature matches any of the valid signatures
+ for (String signature : provider.signatures) {
+ final byte[] validSignature = Base64.decode(signature, Base64.DEFAULT);
+ if (Arrays.equals(packageSignature, validSignature))
+ return true;
+ }
+ return false;
+ }
+
+ void dumpState(PrintWriter pw) {
+ synchronized (mLock) {
+ if (mCurrentWebViewPackage == null) {
+ pw.println(" Current WebView package is null");
+ } else {
+ pw.println(String.format(" Current WebView package (name, version): (%s, %s)",
+ mCurrentWebViewPackage.packageName,
+ mCurrentWebViewPackage.versionName));
+ }
+ pw.println(String.format(" Minimum WebView version code: %d",
+ mMinimumVersionCode));
+ pw.println(String.format(" Number of relros started: %d",
+ mNumRelroCreationsStarted));
+ pw.println(String.format(" Number of relros finished: %d",
+ mNumRelroCreationsFinished));
+ pw.println(String.format(" WebView package dirty: %b", mWebViewPackageDirty));
+ pw.println(String.format(" Any WebView package installed: %b",
+ mAnyWebViewInstalled));
+
+ try {
+ PackageInfo preferredWebViewPackage = findPreferredWebViewPackage();
+ pw.println(String.format(
+ " Preferred WebView package (name, version): (%s, %s)",
+ preferredWebViewPackage.packageName,
+ preferredWebViewPackage.versionName));
+ } catch (WebViewPackageMissingException e) {
+ pw.println(String.format(" Preferred WebView package: none"));
+ }
+
+ dumpAllPackageInformationLocked(pw);
+ }
+ }
+
+ private void dumpAllPackageInformationLocked(PrintWriter pw) {
+ WebViewProviderInfo[] allProviders = mSystemInterface.getWebViewPackages();
+ pw.println(" WebView packages:");
+ for (WebViewProviderInfo provider : allProviders) {
+ List<UserPackage> userPackages =
+ mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider);
+ PackageInfo systemUserPackageInfo =
+ userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo();
+ if (systemUserPackageInfo == null) {
+ continue;
+ }
+
+ int validity = validityResult(provider, systemUserPackageInfo);
+ String packageDetails = String.format(
+ "versionName: %s, versionCode: %d, targetSdkVersion: %d",
+ systemUserPackageInfo.versionName,
+ systemUserPackageInfo.versionCode,
+ systemUserPackageInfo.applicationInfo.targetSdkVersion);
+ if (validity == VALIDITY_OK) {
+ boolean installedForAllUsers = isInstalledAndEnabledForAllUsers(
+ mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider));
+ pw.println(String.format(
+ " Valid package %s (%s) is %s installed/enabled for all users",
+ systemUserPackageInfo.packageName,
+ packageDetails,
+ installedForAllUsers ? "" : "NOT"));
+ } else {
+ pw.println(String.format(" Invalid package %s (%s), reason: %s",
+ systemUserPackageInfo.packageName,
+ packageDetails,
+ getInvalidityReason(validity)));
+ }
+ }
+ }
+
+ private static String getInvalidityReason(int invalidityReason) {
+ switch (invalidityReason) {
+ case VALIDITY_INCORRECT_SDK_VERSION:
+ return "SDK version too low";
+ case VALIDITY_INCORRECT_VERSION_CODE:
+ return "Version code too low";
+ case VALIDITY_INCORRECT_SIGNATURE:
+ return "Incorrect signature";
+ case VALIDITY_NO_LIBRARY_FLAG:
+ return "No WebView-library manifest flag";
+ default:
+ return "Unexcepted validity-reason";
+ }
+ }
+
+}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index b7479da..1510dd1 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -156,9 +156,9 @@
}
}
- public void onRotationChangedLocked(DisplayContent displayContent, int rotation) {
+ public void onRotationChangedLocked(DisplayContent displayContent) {
if (mDisplayMagnifier != null) {
- mDisplayMagnifier.onRotationChangedLocked(displayContent, rotation);
+ mDisplayMagnifier.onRotationChangedLocked(displayContent);
}
if (mWindowsForAccessibilityObserver != null) {
mWindowsForAccessibilityObserver.scheduleComputeChangedWindowsLocked();
@@ -312,9 +312,10 @@
mWindowManagerService.scheduleAnimationLocked();
}
- public void onRotationChangedLocked(DisplayContent displayContent, int rotation) {
+ public void onRotationChangedLocked(DisplayContent displayContent) {
if (DEBUG_ROTATION) {
- Slog.i(LOG_TAG, "Rotaton: " + Surface.rotationToString(rotation)
+ final int rotation = displayContent.getRotation();
+ Slog.i(LOG_TAG, "Rotation: " + Surface.rotationToString(rotation)
+ " displayId: " + displayContent.getDisplayId());
}
mMagnifedViewport.onRotationChangedLocked();
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index b7b419b..efc92cf 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -19,9 +19,9 @@
import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
import static android.content.Context.NOTIFICATION_SERVICE;
-import static android.content.Intent.EXTRA_PACKAGE_NAME;
-import static android.content.Intent.EXTRA_UID;
-import static com.android.server.wm.WindowManagerService.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION;
+import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -35,6 +35,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import com.android.internal.R;
import com.android.server.policy.IconUtilities;
@@ -49,14 +50,12 @@
private String mNotificationTag;
private final NotificationManager mNotificationManager;
private final String mPackageName;
- private final int mUid;
private boolean mCancelled;
private IconUtilities mIconUtilities;
- AlertWindowNotification(WindowManagerService service, String packageName, int uid) {
+ AlertWindowNotification(WindowManagerService service, String packageName) {
mService = service;
mPackageName = packageName;
- mUid = uid;
mNotificationManager =
(NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE);
mNotificationTag = CHANNEL_PREFIX + mPackageName;
@@ -96,7 +95,8 @@
createNotificationChannelIfNeeded(context, appName);
- final String message = context.getString(R.string.alert_windows_notification_message);
+ final String message = context.getString(R.string.alert_windows_notification_message,
+ appName);
final Notification.Builder builder = new Notification.Builder(context, mNotificationTag)
.setOngoing(true)
.setContentTitle(
@@ -106,7 +106,7 @@
.setColor(context.getColor(R.color.system_notification_accent_color))
.setStyle(new Notification.BigTextStyle().bigText(message))
.setLocalOnly(true)
- .addAction(getTurnOffAction(context, mPackageName, mUid));
+ .setContentIntent(getContentIntent(context, mPackageName));
if (aInfo != null) {
final Drawable drawable = pm.getApplicationIcon(aInfo);
@@ -119,17 +119,12 @@
mNotificationManager.notify(mNotificationTag, NOTIFICATION_ID, builder.build());
}
- private Notification.Action getTurnOffAction(Context context, String packageName, int uid) {
- final Intent intent = new Intent(ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION);
- intent.putExtra(EXTRA_PACKAGE_NAME, packageName);
- intent.putExtra(EXTRA_UID, uid);
+ private PendingIntent getContentIntent(Context context, String packageName) {
+ final Intent intent = new Intent(ACTION_MANAGE_OVERLAY_PERMISSION,
+ Uri.fromParts("package", packageName, null));
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
// Calls into activity manager...
- final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, mRequestCode,
- intent, FLAG_CANCEL_CURRENT);
- return new Notification.Action.Builder(R.drawable.alert_window_layer,
- context.getString(R.string.alert_windows_notification_turn_off_action),
- pendingIntent).build();
-
+ return PendingIntent.getActivity(context, mRequestCode, intent, FLAG_CANCEL_CURRENT);
}
private void createNotificationChannelIfNeeded(Context context, String appName) {
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 4eb8e02..4191d31 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -2058,15 +2058,7 @@
* @return whether the transition should show the thumbnail being scaled down.
*/
private boolean shouldScaleDownThumbnailTransition(int uiMode, int orientation) {
- return isTvUiMode(uiMode)
- || mGridLayoutRecentsEnabled
+ return mGridLayoutRecentsEnabled
|| orientation == Configuration.ORIENTATION_PORTRAIT;
}
-
- /**
- * @return whether the specified {@param uiMode} is the TV mode.
- */
- private boolean isTvUiMode(int uiMode) {
- return (uiMode & Configuration.UI_MODE_TYPE_TELEVISION) > 0;
- }
}
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 266ab4c..b90a82a 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -59,6 +59,15 @@
private final IApplicationToken mToken;
private final Handler mHandler;
+ private final Runnable mOnStartingWindowDrawn = () -> {
+ if (mListener == null) {
+ return;
+ }
+ if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting drawn in "
+ + AppWindowContainerController.this.mToken);
+ mListener.onStartingWindowDrawn();
+ };
+
private final Runnable mOnWindowsDrawn = () -> {
if (mListener == null) {
return;
@@ -655,6 +664,9 @@
}
}
+ void reportStartingWindowDrawn() {
+ mHandler.post(mOnStartingWindowDrawn);
+ }
void reportWindowsDrawn() {
mHandler.post(mOnWindowsDrawn);
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerListener.java b/services/core/java/com/android/server/wm/AppWindowContainerListener.java
index 12d4b2f..9d459cf 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerListener.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerListener.java
@@ -24,6 +24,12 @@
void onWindowsVisible();
/** Called when the windows associated app window container are no longer visible. */
void onWindowsGone();
+
+ /**
+ * Called when the starting window for this container is drawn.
+ */
+ void onStartingWindowDrawn();
+
/**
* Called when the key dispatching to a window associated with the app window container
* timed-out.
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 647adbf..2f221df 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -42,7 +42,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN;
-import static com.android.server.wm.WindowManagerService.H.NOTIFY_STARTING_WINDOW_DRAWN;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.logWithStack;
@@ -668,6 +667,15 @@
return (Task) getParent();
}
+ TaskStack getStack() {
+ final Task task = getTask();
+ if (task != null) {
+ return task.mStack;
+ } else {
+ return null;
+ }
+ }
+
@Override
void onParentSet() {
super.onParentSet();
@@ -785,6 +793,16 @@
if (canFreezeBounds()) {
freezeBounds();
}
+
+ // In the process of tearing down before relaunching, the app will
+ // try and clean up it's child surfaces. We need to prevent this from
+ // happening, so we sever the children, transfering their ownership
+ // from the client it-self to the parent surface (owned by us).
+ for (int i = mChildren.size() - 1; i >= 0; i--) {
+ final WindowState w = mChildren.get(i);
+ w.mWinAnimator.detachChildren();
+ }
+
mPendingRelaunchCount++;
}
@@ -1319,7 +1337,9 @@
}
}
} else if (w.isDrawnLw()) {
- mService.mH.sendEmptyMessage(NOTIFY_STARTING_WINDOW_DRAWN);
+ if (getController() != null) {
+ getController().reportStartingWindowDrawn();
+ }
startingDisplayed = true;
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 461c3fa..cb3a663 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -182,6 +182,42 @@
private final Display mDisplay;
private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
+ /**
+ * Current rotation of the display.
+ * Constants as per {@link android.view.Surface.Rotation}.
+ *
+ * @see WindowManagerService#updateRotationUncheckedLocked(boolean, int)
+ */
+ private int mRotation = 0;
+ /**
+ * Last applied orientation of the display.
+ * Constants as per {@link android.content.pm.ActivityInfo.ScreenOrientation}.
+ *
+ * @see WindowManagerService#updateOrientationFromAppTokensLocked(boolean, int)
+ */
+ private int mLastOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ /**
+ * Flag indicating that the application is receiving an orientation that has different metrics
+ * than it expected. E.g. Portrait instead of Landscape.
+ *
+ * @see WindowManagerService#updateRotationUncheckedLocked(boolean, int)
+ */
+ private boolean mAltOrientation = false;
+ /**
+ * Orientation forced by some window. If there is no visible window that specifies orientation
+ * it is set to {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED}.
+ *
+ * @see NonAppWindowContainers#getOrientation()
+ */
+ private int mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ /**
+ * Last orientation forced by the keyguard. It is applied when keyguard is shown and is not
+ * occluded.
+ *
+ * @see NonAppWindowContainers#getOrientation()
+ */
+ private int mLastKeyguardForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+
Rect mBaseDisplayRect = new Rect();
private Rect mContentRect = new Rect();
@@ -764,6 +800,34 @@
return mDisplayMetrics;
}
+ int getRotation() {
+ return mRotation;
+ }
+
+ void setRotation(int newRotation) {
+ mRotation = newRotation;
+ }
+
+ int getLastOrientation() {
+ return mLastOrientation;
+ }
+
+ void setLastOrientation(int orientation) {
+ mLastOrientation = orientation;
+ }
+
+ boolean getAltOrientation() {
+ return mAltOrientation;
+ }
+
+ void setAltOrientation(boolean altOrientation) {
+ mAltOrientation = altOrientation;
+ }
+
+ int getLastWindowForcedOrientation() {
+ return mLastWindowForcedOrientation;
+ }
+
DockedStackDividerController getDockedDividerController() {
return mDividerControllerLocked;
}
@@ -884,14 +948,14 @@
final WindowManagerPolicy policy = mService.mPolicy;
if (mService.mDisplayFrozen) {
- if (mService.mLastWindowForcedOrientation != SCREEN_ORIENTATION_UNSPECIFIED) {
+ if (mLastWindowForcedOrientation != SCREEN_ORIENTATION_UNSPECIFIED) {
if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "Display is frozen, return " + mService.mLastWindowForcedOrientation);
+ "Display is frozen, return " + mLastWindowForcedOrientation);
// If the display is frozen, some activities may be in the middle of restarting, and
// thus have removed their old window. If the window has the flag to hide the lock
// screen, then the lock screen can re-appear and inflict its own orientation on us.
// Keep the orientation stable until this all settles down.
- return mService.mLastWindowForcedOrientation;
+ return mLastWindowForcedOrientation;
} else if (policy.isKeyguardLocked()) {
// Use the last orientation the while the display is frozen with the keyguard
// locked. This could be the keyguard forced orientation or from a SHOW_WHEN_LOCKED
@@ -899,8 +963,8 @@
// things aren't stable while the display is frozen, for example the window could be
// momentarily unavailable due to activity relaunch.
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Display is frozen while keyguard locked, "
- + "return " + mService.mLastOrientation);
- return mService.mLastOrientation;
+ + "return " + mLastOrientation);
+ return mLastOrientation;
}
} else {
final int orientation = mAboveAppWindowsContainers.getOrientation();
@@ -1584,24 +1648,9 @@
// TODO(multidisplay): Needs some serious rethought when the target and IME are not on the
// same display. Or even when the current IME/target are not on the same screen as the next
// IME/target. For now only look for input windows on the main screen.
+ mUpdateImeTarget = updateImeTarget;
+ WindowState target = getWindow(mComputeImeTargetPredicate);
- // The target candidate provided by the IME tells us which window token, but not which
- // window within the token (e.g. child windows...). So, we use the token to look-up the
- // best target window.
- // TODO: Have the input method service report the right window with the token vs. just the
- // base window of the token.
- final WindowState baseWin = mService.getWindow(mService.mInputMethodTargetCandidate);
- final WindowToken targetToken = baseWin != null ? baseWin.mToken : null;
- WindowState target = targetToken != null ?
- targetToken.getWindow(mComputeImeTargetPredicate) : null;
- // If there isn't a better candidate in the token (maybe because they are not visible), then
- // fall back to targeting the base window of the token, so the IME can still maintain the
- // right z-order based on the last person that set it vs. changing its z-order to the very
- // up since there if target is null.
- // TODO: Consider z-ordering IME to bottom instead of top if there is no visible target.
- // Also, consider tying the visible the visibility of the IME to the current target. I.e if
- // target isn't visible, then IME shouldn't be visible.
- target = target == null ? baseWin : target;
// Yet more tricksyness! If this window is a "starting" window, we do actually want
// to be on top of it, but it is not -really- where input will go. So look down below
@@ -2066,7 +2115,7 @@
Slog.v(TAG, "performLayout: needed=" + isLayoutNeeded() + " dw=" + dw + " dh=" + dh);
}
- mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation,
+ mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mRotation,
getConfiguration().uiMode);
if (isDefaultDisplay) {
// Not needed on non-default displays.
@@ -2727,10 +2776,10 @@
}
if (DEBUG_ORIENTATION) Slog.v(TAG_WM,
- "No app is requesting an orientation, return " + mService.mLastOrientation);
+ "No app is requesting an orientation, return " + mLastOrientation);
// The next app has not been requested to be visible, so we keep the current orientation
// to prevent freezing/unfreezing the display too early.
- return mService.mLastOrientation;
+ return mLastOrientation;
}
}
@@ -2781,15 +2830,15 @@
final int req = win.mAttrs.screenOrientation;
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
if (policy.isKeyguardHostWindow(win.mAttrs)) {
- mService.mLastKeyguardForcedOrientation = req;
+ mLastKeyguardForcedOrientation = req;
}
- return (mService.mLastWindowForcedOrientation = req);
+ return (mLastWindowForcedOrientation = req);
}
- mService.mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
if (policy.isKeyguardShowingAndNotOccluded()) {
- return mService.mLastKeyguardForcedOrientation;
+ return mLastKeyguardForcedOrientation;
}
return SCREEN_ORIENTATION_UNSET;
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index aa8e377..fc37797 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -109,7 +109,6 @@
private final Rect mTmpRect2 = new Rect();
private final Rect mTmpRect3 = new Rect();
private final Rect mLastRect = new Rect();
- private final Rect mMiddlePositionDockedStackRect = new Rect();
private boolean mLastVisibility = false;
private final RemoteCallbackList<IDockedStackListener> mDockedStackListeners
= new RemoteCallbackList<>();
@@ -186,16 +185,6 @@
return (int) (minWidth / mDisplayContent.getDisplayMetrics().density);
}
- /**
- * The middlePositionDockedStackRect is half the screen area that sits at the top (portrait) or
- * left (landscape).
- *
- * @return fixed rect for temp stack
- */
- Rect getMiddlePositionDockedStackRect() {
- return mMinimizedDock && isHomeStackResizable() ? mMiddlePositionDockedStackRect : null;
- }
-
void getHomeStackBoundsInDockedMode(Rect outBounds) {
final DisplayInfo di = mDisplayContent.getDisplayInfo();
mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
@@ -264,29 +253,8 @@
initSnapAlgorithmForRotations();
}
- /**
- * Calculates the constant rects {@link mMiddlePositionDockedStackRect} based on orientation,
- * stable insets and display size.
- */
- private void updateConstantRects() {
- final DisplayInfo di = mDisplayContent.getDisplayInfo();
- mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
- mTmpRect);
- int dividerSize = mDividerWindowWidth - 2 * mDividerInsets;
- Configuration configuration = mDisplayContent.getConfiguration();
- boolean isHorizontal = configuration.orientation == Configuration.ORIENTATION_PORTRAIT;
- int middlePosition = DockedDividerUtils.calculateMiddlePosition(isHorizontal, mTmpRect,
- di.logicalWidth, di.logicalHeight, dividerSize);
- if (isHorizontal) {
- mMiddlePositionDockedStackRect.set(0, 0, di.logicalWidth, middlePosition);
- } else {
- mMiddlePositionDockedStackRect.set(0, 0, middlePosition, di.logicalHeight);
- }
- }
-
void onConfigurationChanged() {
loadDimens();
- updateConstantRects();
}
boolean isResizing() {
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index 1d50d0d..0e6b1b6 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -108,6 +108,7 @@
private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
private final Rect mTmpInsets = new Rect();
private final Rect mTmpRect = new Rect();
+ private final Rect mTmpAnimatingBoundsRect = new Rect();
private final Point mTmpDisplaySize = new Point();
/**
@@ -359,7 +360,7 @@
if (isValidPictureInPictureAspectRatio(mAspectRatio)) {
transformBoundsToAspectRatio(normalBounds, mAspectRatio);
}
- final Rect animatingBounds = mTmpRect;
+ final Rect animatingBounds = mTmpAnimatingBoundsRect;
final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
if (pinnedStack != null) {
pinnedStack.getAnimatingBounds(animatingBounds);
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index 71f88de..6a0e353 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -109,6 +109,13 @@
}
/**
+ * @return whether the bounds are currently animating to fullscreen.
+ */
+ public boolean isBoundsAnimatingToFullscreen() {
+ return mContainer.isBoundsAnimatingToFullscreen();
+ }
+
+ /**
* Checks the {@param bounds} and retirms non-null fullscreen bounds for the pinned stack
* animation if necessary.
*/
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 126e080..0222b3d 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -802,6 +802,7 @@
mHoldScreenWindow = null;
mObscuringWindow = null;
+ // TODO(multi-display): Support these features on secondary screens.
if (mService.mWatermark != null) {
mService.mWatermark.positionSurface(defaultDw, defaultDh);
}
@@ -809,11 +810,12 @@
mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh);
}
if (mService.mCircularDisplayMask != null) {
- mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, mService.mRotation);
+ mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh,
+ mService.getDefaultDisplayRotation());
}
if (mService.mEmulatorDisplayOverlay != null) {
mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh,
- mService.mRotation);
+ mService.getDefaultDisplayRotation());
}
boolean focusDisplayed = false;
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 720a454..b7a9e66 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -601,8 +601,7 @@
if (mAlertWindowSurfaces.isEmpty()) {
cancelAlertWindowNotification();
} else if (mAlertWindowNotification == null){
- mAlertWindowNotification = new AlertWindowNotification(
- mService, mPackageName, mUid);
+ mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
}
}
}
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index b0e115b..8186d30 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -199,17 +199,19 @@
}
}
- public void getStackDockedModeBounds(Rect outBounds, Rect outTempBounds,
- Rect outTempInsetBounds, boolean ignoreVisibility) {
+ /**
+ * @see TaskStack.getStackDockedModeBoundsLocked(Rect, Rect, Rect, boolean)
+ */
+ public void getStackDockedModeBounds(Rect currentTempTaskBounds, Rect outStackBounds,
+ Rect outTempTaskBounds, boolean ignoreVisibility) {
synchronized (mWindowMap) {
if (mContainer != null) {
- mContainer.getStackDockedModeBoundsLocked(outBounds, outTempBounds,
- outTempInsetBounds, ignoreVisibility);
+ mContainer.getStackDockedModeBoundsLocked(currentTempTaskBounds, outStackBounds,
+ outTempTaskBounds, ignoreVisibility);
return;
}
- outBounds.setEmpty();
- outTempBounds.setEmpty();
- outTempInsetBounds.setEmpty();
+ outStackBounds.setEmpty();
+ outTempTaskBounds.setEmpty();
}
}
@@ -241,9 +243,9 @@
}
}
- public void getBoundsForNewConfiguration(Rect outBounds, Rect outTempBounds) {
+ public void getBoundsForNewConfiguration(Rect outBounds) {
synchronized(mWindowMap) {
- mContainer.getBoundsForNewConfiguration(outBounds, outTempBounds);
+ mContainer.getBoundsForNewConfiguration(outBounds);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 90106a9..53c24e1 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -215,7 +215,7 @@
: DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT;
mService.mActivityManager.moveTaskToDockedStack(
mTask.mTaskId, createMode, true /*toTop*/, true /* animate */,
- null /* initialBounds */, false /* moveHomeStackFront */);
+ null /* initialBounds */);
}
} catch(RemoteException e) {}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 9f34bd7..c0598ca 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -151,13 +151,7 @@
}
private void drawSnapshot(GraphicBuffer snapshot) {
-
- // TODO: Just wrap the buffer here without any copying.
- final Canvas c = mSurface.lockHardwareCanvas();
- final Bitmap b = Bitmap.createHardwareBitmap(snapshot);
- fillEmptyBackground(c, b);
- c.drawBitmap(b, 0, 0, null);
- mSurface.unlockCanvasAndPost(c);
+ mSurface.attachAndQueueBuffer(snapshot);
final boolean reportNextDraw;
synchronized (mService.mWindowMap) {
mHasDrawn = true;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 7588b71..442cd54 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -429,18 +429,9 @@
return true;
}
- void getBoundsForNewConfiguration(Rect outBounds, Rect outTempBounds) {
+ void getBoundsForNewConfiguration(Rect outBounds) {
outBounds.set(mBoundsAfterRotation);
mBoundsAfterRotation.setEmpty();
- final DockedStackDividerController controller = getDisplayContent()
- .mDividerControllerLocked;
- if (mStackId == DOCKED_STACK_ID) {
- final Rect dockedStackRect = controller.getMiddlePositionDockedStackRect();
-
- if (dockedStackRect != null) {
- outTempBounds.set(dockedStackRect);
- }
- }
}
/**
@@ -686,21 +677,42 @@
super.onDisplayChanged(dc);
}
- void getStackDockedModeBoundsLocked(Rect outBounds, Rect outTempBounds,
- Rect outTempInsetBounds, boolean ignoreVisibility) {
+ /**
+ * Determines the stack and task bounds of the other stack when in docked mode. The current task
+ * bounds is passed in but depending on the stack, the task and stack must match. Only in
+ * minimized mode with resizable launcher, the other stack ignores calculating the stack bounds
+ * and uses the task bounds passed in as the stack and task bounds, otherwise the stack bounds
+ * is calculated and is also used for its task bounds.
+ * If any of the out bounds are empty, it represents default bounds
+ *
+ * @param currentTempTaskBounds the current task bounds of the other stack
+ * @param outStackBounds the calculated stack bounds of the other stack
+ * @param outTempTaskBounds the calculated task bounds of the other stack
+ * @param ignoreVisibility ignore visibility in getting the stack bounds
+ */
+ void getStackDockedModeBoundsLocked(Rect currentTempTaskBounds, Rect outStackBounds,
+ Rect outTempTaskBounds, boolean ignoreVisibility) {
+ outTempTaskBounds.setEmpty();
+
+ // When the home stack is resizable, should always have the same stack and task bounds
if (mStackId == HOME_STACK_ID && findHomeTask().isResizeable()) {
// Calculate the home stack bounds when in docked mode
getDisplayContent().mDividerControllerLocked
- .getHomeStackBoundsInDockedMode(outTempBounds);
- outTempInsetBounds.set(outTempBounds);
- } else {
- outTempBounds.setEmpty();
- outTempInsetBounds.setEmpty();
+ .getHomeStackBoundsInDockedMode(outStackBounds);
+ outTempTaskBounds.set(outStackBounds);
+ return;
+ }
+
+ // When minimized state, the stack bounds for all non-home and docked stack bounds should
+ // match the passed task bounds
+ if (isMinimizedDockAndHomeStackResizable() && currentTempTaskBounds != null) {
+ outStackBounds.set(currentTempTaskBounds);
+ return;
}
if ((mStackId != DOCKED_STACK_ID && !StackId.isResizeableByDockedStack(mStackId))
|| mDisplayContent == null) {
- outBounds.set(mBounds);
+ outStackBounds.set(mBounds);
return;
}
@@ -714,7 +726,7 @@
// The docked stack is being dismissed, but we caught before it finished being
// dismissed. In that case we want to treat it as if it is not occupying any space and
// let others occupy the whole display.
- mDisplayContent.getLogicalDisplayRect(outBounds);
+ mDisplayContent.getLogicalDisplayRect(outStackBounds);
return;
}
@@ -722,14 +734,14 @@
if (dockedSide == DOCKED_INVALID) {
// Not sure how you got here...Only thing we can do is return current bounds.
Slog.e(TAG_WM, "Failed to get valid docked side for docked stack=" + dockedStack);
- outBounds.set(mBounds);
+ outStackBounds.set(mBounds);
return;
}
mDisplayContent.getLogicalDisplayRect(mTmpRect);
dockedStack.getRawBounds(mTmpRect2);
final boolean dockedOnTopOrLeft = dockedSide == DOCKED_TOP || dockedSide == DOCKED_LEFT;
- getStackDockedModeBounds(mTmpRect, outBounds, mStackId, mTmpRect2,
+ getStackDockedModeBounds(mTmpRect, outStackBounds, mStackId, mTmpRect2,
mDisplayContent.mDividerControllerLocked.getContentWidth(), dockedOnTopOrLeft);
}
@@ -812,8 +824,8 @@
final Rect bounds = new Rect();
final Rect tempBounds = new Rect();
- final Rect tempInsetBounds = new Rect();
- getStackDockedModeBoundsLocked(bounds, tempBounds, tempInsetBounds, true /*ignoreVisibility*/);
+ getStackDockedModeBoundsLocked(null /* currentTempTaskBounds */, bounds, tempBounds,
+ true /*ignoreVisibility*/);
getController().requestResize(bounds);
}
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 993a918..57fb81c 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -161,7 +161,7 @@
// We just finished rotation animation which means we did not announce
// the rotation and waited for it to end, announce now.
accessibilityController.onRotationChangedLocked(
- mService.getDefaultDisplayContentLocked(), mService.mRotation);
+ mService.getDefaultDisplayContentLocked());
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 8b859d1..64614fe 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -20,15 +20,11 @@
import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS;
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
-import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.StatusBarManager.DISABLE_MASK;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
import static android.content.Intent.ACTION_USER_REMOVED;
-import static android.content.Intent.EXTRA_PACKAGE_NAME;
-import static android.content.Intent.EXTRA_UID;
import static android.content.Intent.EXTRA_USER_HANDLE;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.os.UserHandle.USER_NULL;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.DOCKED_INVALID;
@@ -217,6 +213,7 @@
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.LocalServices;
+import com.android.server.LockGuard;
import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.input.InputManagerService;
@@ -346,9 +343,6 @@
final private KeyguardDisableHandler mKeyguardDisableHandler;
- static final String ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION =
- "com.android.server.wm.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION";
-
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -364,16 +358,6 @@
}
}
break;
- case ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION:
- final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
- final int uid = intent.getIntExtra(EXTRA_UID, -1);
- if (packageName != null && uid != -1) {
- synchronized (mWindowMap) {
- // Revoke permission.
- mAppOps.setMode(OP_SYSTEM_ALERT_WINDOW, uid, packageName, MODE_IGNORED);
- }
- }
- break;
}
}
};
@@ -536,11 +520,6 @@
// The root of the device window hierarchy.
RootWindowContainer mRoot;
- // TODO: Move several of this states to the RootWindowContainer or DisplayContent
- int mRotation = 0;
- int mLastOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
- boolean mAltOrientation = false;
-
int mDockedStackCreateMode = DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
Rect mDockedStackCreateBounds;
@@ -554,13 +533,17 @@
}
class RotationWatcher {
- IRotationWatcher watcher;
- IBinder.DeathRecipient deathRecipient;
- RotationWatcher(IRotationWatcher w, IBinder.DeathRecipient d) {
- watcher = w;
- deathRecipient = d;
+ IRotationWatcher mWatcher;
+ IBinder.DeathRecipient mDeathRecipient;
+ int mDisplayId;
+ RotationWatcher(IRotationWatcher watcher, IBinder.DeathRecipient deathRecipient,
+ int displayId) {
+ mWatcher = watcher;
+ mDeathRecipient = deathRecipient;
+ mDisplayId = displayId;
}
}
+
ArrayList<RotationWatcher> mRotationWatchers = new ArrayList<>();
int mDeferredRotationPauseCount;
@@ -581,8 +564,6 @@
boolean mClientFreezingScreen = false;
int mAppsFreezingScreen = 0;
- int mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
- int mLastKeyguardForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
int mLayoutSeq = 0;
@@ -623,14 +604,9 @@
WindowState mCurrentFocus = null;
WindowState mLastFocus = null;
- // TODO: All the IME window tracking should be moved to DisplayContent and tracked per display.
- // This just indicates the window the input method is on top of, not necessarily the window its
- // input is going to.
+ /** This just indicates the window the input method is on top of, not
+ * necessarily the window its input is going to. */
WindowState mInputMethodTarget = null;
- // The binder token currently using the IME as determined by the input method service.
- // Window manager uses this to determine the final input method target
- // (almost always this candidate) for z-ordering.
- IBinder mInputMethodTargetCandidate = null;
/** If true hold off on modifying the animation layer of mInputMethodTarget */
boolean mInputMethodTargetWaitingAnim;
@@ -965,6 +941,7 @@
private WindowManagerService(Context context, InputManagerService inputManager,
boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore,
WindowManagerPolicy policy) {
+ LockGuard.installLock(this, LockGuard.INDEX_WINDOW);
mRoot = new RootWindowContainer(this);
mContext = context;
mHaveInputMethods = haveInputMethods;
@@ -1070,7 +1047,6 @@
filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
// Listen to user removal broadcasts so that we can remove the user-specific data.
filter.addAction(Intent.ACTION_USER_REMOVED);
- filter.addAction(ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION);
mContext.registerReceiver(mBroadcastReceiver, filter);
mSettingsObserver = new SettingsObserver();
@@ -1464,7 +1440,7 @@
} else {
taskBounds = null;
}
- if (mPolicy.getInsetHintLw(win.mAttrs, taskBounds, mRotation,
+ if (mPolicy.getInsetHintLw(win.mAttrs, taskBounds, displayInfo.rotation,
displayInfo.logicalWidth, displayInfo.logicalHeight, outContentInsets,
outStableInsets, outOutsets)) {
res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_NAV_BAR;
@@ -2212,6 +2188,15 @@
if (mAccessibilityController != null && win.getDisplayId() == DEFAULT_DISPLAY) {
mAccessibilityController.onWindowTransitionLocked(win, transit);
}
+
+ // When we start the exit animation we take the Surface from the client
+ // so it will stop perturbing it. We need to likewise takeaway the SurfaceFlinger
+ // side child surfaces, so they will remain preserved in their current state
+ // (rather than be cleaned up immediately by the app code).
+ SurfaceControl.openTransaction();
+ winAnimator.detachChildren();
+ SurfaceControl.closeTransaction();
+
return focusMayChange;
}
@@ -2510,12 +2495,16 @@
boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
long ident = Binder.clearCallingIdentity();
try {
- final int req = mRoot.getDisplayContent(displayId).getOrientation();
- if (req != mLastOrientation) {
- mLastOrientation = req;
+ final DisplayContent dc = mRoot.getDisplayContent(displayId);
+ final int req = dc.getOrientation();
+ if (req != dc.getLastOrientation()) {
+ dc.setLastOrientation(req);
//send a message to Policy indicating orientation change to take
//action like disabling/enabling sensors etc.,
- mPolicy.setCurrentOrientationLw(req);
+ // TODO(multi-display): Implement policy for secondary displays.
+ if (dc.isDefaultDisplay) {
+ mPolicy.setCurrentOrientationLw(req);
+ }
if (updateRotationUncheckedLocked(inTransaction, displayId)) {
// changed
return true;
@@ -2532,10 +2521,18 @@
// changed the real orientation our applied our screen rotation animation.
// For example, because a previous screen rotation was in progress.
boolean rotationNeedsUpdateLocked() {
- int rotation = mPolicy.rotationForOrientationLw(mLastOrientation, mRotation);
+ // TODO(multi-display): Check for updates on all displays. Need to have per-display policy
+ // to implement WindowManagerPolicy#rotationForOrientationLw() correctly.
+ final DisplayContent defaultDisplayContent = getDefaultDisplayContentLocked();
+ final int lastOrientation = defaultDisplayContent.getLastOrientation();
+ final int oldRotation = defaultDisplayContent.getRotation();
+ final boolean oldAltOrientation = defaultDisplayContent.getAltOrientation();
+
+ final int rotation = mPolicy.rotationForOrientationLw(lastOrientation,
+ oldRotation);
boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
- mLastOrientation, rotation);
- if (mRotation == rotation && mAltOrientation == altOrientation) {
+ lastOrientation, rotation);
+ if (oldRotation == rotation && oldAltOrientation == altOrientation) {
return false;
}
return true;
@@ -3763,6 +3760,7 @@
*/
@Override
public void freezeRotation(int rotation) {
+ // TODO(multi-display): Track which display is rotated.
if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
"freezeRotation()")) {
throw new SecurityException("Requires SET_ORIENTATION permission");
@@ -3772,12 +3770,14 @@
+ "rotation constant.");
}
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "freezeRotation: mRotation=" + mRotation);
+ final int defaultDisplayRotation = getDefaultDisplayRotation();
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "freezeRotation: mRotation="
+ + defaultDisplayRotation);
long origId = Binder.clearCallingIdentity();
try {
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED,
- rotation == -1 ? mRotation : rotation);
+ rotation == -1 ? defaultDisplayRotation : rotation);
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -3796,7 +3796,8 @@
throw new SecurityException("Requires SET_ORIENTATION permission");
}
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "thawRotation: mRotation=" + mRotation);
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "thawRotation: mRotation="
+ + getDefaultDisplayRotation());
long origId = Binder.clearCallingIdentity();
try {
@@ -3920,8 +3921,10 @@
final DisplayContent dc = mRoot.getDisplayContent(displayId);
- final int oldRotation = mRotation;
- int rotation = mPolicy.rotationForOrientationLw(mLastOrientation, mRotation);
+ final int oldRotation = dc.getRotation();
+ final int lastOrientation = dc.getLastOrientation();
+ final boolean oldAltOrientation = dc.getAltOrientation();
+ int rotation = mPolicy.rotationForOrientationLw(lastOrientation, oldRotation);
final boolean rotateSeamlessly;
if (mPolicy.shouldRotateSeamlessly(oldRotation, rotation)) {
@@ -3961,29 +3964,30 @@
// an orientation that has different metrics than it expected.
// eg. Portrait instead of Landscape.
- boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
- mLastOrientation, rotation);
+ boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(lastOrientation, rotation);
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Selected orientation " + mLastOrientation
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Selected orientation " + lastOrientation
+ ", got rotation " + rotation + " which has "
+ (altOrientation ? "incompatible" : "compatible") + " metrics");
- if (mRotation == rotation && mAltOrientation == altOrientation) {
+ if (oldRotation == rotation && oldAltOrientation == altOrientation) {
// No change.
return false;
}
if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Rotation changed to " + rotation
- + (altOrientation ? " (alt)" : "") + " from " + mRotation
- + (mAltOrientation ? " (alt)" : "") + ", lastOrientation=" + mLastOrientation);
+ + (altOrientation ? " (alt)" : "") + " from " + oldRotation
+ + (oldAltOrientation ? " (alt)" : "") + ", lastOrientation=" + lastOrientation);
- if (DisplayContent.deltaRotation(rotation, mRotation) != 2) {
+ if (DisplayContent.deltaRotation(rotation, oldRotation) != 2) {
mWaitingForConfig = true;
}
- mRotation = rotation;
- mAltOrientation = altOrientation;
- mPolicy.setRotationLw(mRotation);
+ dc.setRotation(rotation);
+ dc.setAltOrientation(altOrientation);
+ if (dc.isDefaultDisplay) {
+ mPolicy.setRotationLw(rotation);
+ }
mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_ACTIVE;
mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
@@ -4042,7 +4046,7 @@
if (rotateSeamlessly) {
dc.forAllWindows(w -> {
- w.mWinAnimator.seamlesslyRotateWindow(oldRotation, mRotation);
+ w.mWinAnimator.seamlesslyRotateWindow(oldRotation, rotation);
}, true /* traverseTopToBottom */);
}
@@ -4075,10 +4079,13 @@
mH.sendEmptyMessageDelayed(H.SEAMLESS_ROTATION_TIMEOUT, SEAMLESS_ROTATION_TIMEOUT_DURATION);
}
- for (int i=mRotationWatchers.size()-1; i>=0; i--) {
- try {
- mRotationWatchers.get(i).watcher.onRotationChanged(rotation);
- } catch (RemoteException e) {
+ for (int i = mRotationWatchers.size() - 1; i >= 0; i--) {
+ final RotationWatcher rotationWatcher = mRotationWatchers.get(i);
+ if (rotationWatcher.mDisplayId == displayId) {
+ try {
+ rotationWatcher.mWatcher.onRotationChanged(rotation);
+ } catch (RemoteException e) {
+ }
}
}
@@ -4087,16 +4094,17 @@
// windows in final state. Otherwise, we make this call at the rotation end.
if (screenRotationAnimation == null && mAccessibilityController != null
&& dc.getDisplayId() == DEFAULT_DISPLAY) {
- mAccessibilityController.onRotationChangedLocked(getDefaultDisplayContentLocked(),
- rotation);
+ mAccessibilityController.onRotationChangedLocked(getDefaultDisplayContentLocked());
}
return true;
}
@Override
- public int getRotation() {
- return mRotation;
+ public int getDefaultDisplayRotation() {
+ synchronized (mWindowMap) {
+ return getDefaultDisplayContentLocked().getRotation();
+ }
}
@Override
@@ -4105,16 +4113,16 @@
}
@Override
- public int watchRotation(IRotationWatcher watcher) {
+ public int watchRotation(IRotationWatcher watcher, int displayId) {
final IBinder watcherBinder = watcher.asBinder();
IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
synchronized (mWindowMap) {
for (int i=0; i<mRotationWatchers.size(); i++) {
- if (watcherBinder == mRotationWatchers.get(i).watcher.asBinder()) {
+ if (watcherBinder == mRotationWatchers.get(i).mWatcher.asBinder()) {
RotationWatcher removed = mRotationWatchers.remove(i);
- IBinder binder = removed.watcher.asBinder();
+ IBinder binder = removed.mWatcher.asBinder();
if (binder != null) {
binder.unlinkToDeath(this, 0);
}
@@ -4128,12 +4136,12 @@
synchronized (mWindowMap) {
try {
watcher.asBinder().linkToDeath(dr, 0);
- mRotationWatchers.add(new RotationWatcher(watcher, dr));
+ mRotationWatchers.add(new RotationWatcher(watcher, dr, displayId));
} catch (RemoteException e) {
// Client died, no cleanup needed.
}
- return mRotation;
+ return getDefaultDisplayRotation();
}
}
@@ -4143,11 +4151,11 @@
synchronized (mWindowMap) {
for (int i=0; i<mRotationWatchers.size(); i++) {
RotationWatcher rotationWatcher = mRotationWatchers.get(i);
- if (watcherBinder == rotationWatcher.watcher.asBinder()) {
+ if (watcherBinder == rotationWatcher.mWatcher.asBinder()) {
RotationWatcher removed = mRotationWatchers.remove(i);
- IBinder binder = removed.watcher.asBinder();
+ IBinder binder = removed.mWatcher.asBinder();
if (binder != null) {
- binder.unlinkToDeath(removed.deathRecipient, 0);
+ binder.unlinkToDeath(removed.mDeathRecipient, 0);
}
i--;
}
@@ -4175,10 +4183,9 @@
@Override
public int getPreferredOptionsPanelGravity() {
synchronized (mWindowMap) {
- final int rotation = getRotation();
-
// TODO(multidisplay): Assume that such devices physical keys are on the main screen.
final DisplayContent displayContent = getDefaultDisplayContentLocked();
+ final int rotation = displayContent.getRotation();
if (displayContent.mInitialDisplayWidth < displayContent.mInitialDisplayHeight) {
// On devices with a natural orientation of portrait
switch (rotation) {
@@ -4712,9 +4719,14 @@
private DisplayInfo updateDisplayAndOrientationLocked(int uiMode, int displayId) {
final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+ // TODO(multi-display): Implement rotation for secondary displays.
+ final boolean isDefaultDisplay = displayContent.isDefaultDisplay;
+ final int displayRotation = displayContent.getRotation();
+ final boolean altDisplayOrientation = displayContent.getAltOrientation();
+
// Use the effective "visual" dimensions based on current rotation
- final boolean rotated = (mRotation == Surface.ROTATION_90
- || mRotation == Surface.ROTATION_270);
+ final boolean rotated = (displayRotation == Surface.ROTATION_90
+ || displayRotation == Surface.ROTATION_270);
final int realdw = rotated ?
displayContent.mBaseDisplayHeight : displayContent.mBaseDisplayWidth;
final int realdh = rotated ?
@@ -4722,7 +4734,7 @@
int dw = realdw;
int dh = realdh;
- if (mAltOrientation) {
+ if (altDisplayOrientation) {
if (realdw > realdh) {
// Turn landscape into portrait.
int maxw = (int)(realdh/1.3f);
@@ -4739,18 +4751,21 @@
}
// Update application display metrics.
- final int appWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation, uiMode, displayId);
- final int appHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation, uiMode,
+ final int appWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, displayRotation, uiMode,
+ displayId);
+ final int appHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, displayRotation, uiMode,
displayId);
final DisplayInfo displayInfo = displayContent.getDisplayInfo();
- displayInfo.rotation = mRotation;
+ displayInfo.rotation = displayRotation;
displayInfo.logicalWidth = dw;
displayInfo.logicalHeight = dh;
displayInfo.logicalDensityDpi = displayContent.mBaseDisplayDensity;
displayInfo.appWidth = appWidth;
displayInfo.appHeight = appHeight;
- displayInfo.getLogicalMetrics(mRealDisplayMetrics,
- CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
+ if (isDefaultDisplay) {
+ displayInfo.getLogicalMetrics(mRealDisplayMetrics,
+ CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
+ }
displayInfo.getAppMetrics(mDisplayMetrics);
if (displayContent.mDisplayScalingDisabled) {
displayInfo.flags |= Display.FLAG_SCALING_DISABLED;
@@ -4766,8 +4781,10 @@
Slog.i(TAG_WM, "Set app display size: " + appWidth + " x " + appHeight);
}
- mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(mDisplayMetrics,
- mCompatDisplayMetrics);
+ if (isDefaultDisplay) {
+ mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(mDisplayMetrics,
+ mCompatDisplayMetrics);
+ }
return displayInfo;
}
@@ -4780,13 +4797,13 @@
config.orientation = (dw <= dh) ? Configuration.ORIENTATION_PORTRAIT :
Configuration.ORIENTATION_LANDSCAPE;
config.screenWidthDp =
- (int)(mPolicy.getConfigDisplayWidth(dw, dh, mRotation, config.uiMode, displayId) /
- mDisplayMetrics.density);
+ (int)(mPolicy.getConfigDisplayWidth(dw, dh, displayInfo.rotation, config.uiMode,
+ displayId) / mDisplayMetrics.density);
config.screenHeightDp =
- (int)(mPolicy.getConfigDisplayHeight(dw, dh, mRotation, config.uiMode, displayId) /
- mDisplayMetrics.density);
- final boolean rotated = (mRotation == Surface.ROTATION_90
- || mRotation == Surface.ROTATION_270);
+ (int)(mPolicy.getConfigDisplayHeight(dw, dh, displayInfo.rotation, config.uiMode,
+ displayId) / mDisplayMetrics.density);
+ final boolean rotated = (displayInfo.rotation == Surface.ROTATION_90
+ || displayInfo.rotation == Surface.ROTATION_270);
computeSizeRangesAndScreenLayout(displayInfo, displayId, rotated, config.uiMode, dw, dh,
mDisplayMetrics.density, config);
@@ -5236,7 +5253,6 @@
public static final int NOTIFY_APP_TRANSITION_STARTING = 47;
public static final int NOTIFY_APP_TRANSITION_CANCELLED = 48;
public static final int NOTIFY_APP_TRANSITION_FINISHED = 49;
- public static final int NOTIFY_STARTING_WINDOW_DRAWN = 50;
public static final int UPDATE_ANIMATION_SCALE = 51;
public static final int WINDOW_HIDE_TIMEOUT = 52;
public static final int NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED = 53;
@@ -5665,7 +5681,7 @@
}
}
case NOTIFY_APP_TRANSITION_STARTING: {
- mAmInternal.notifyAppTransitionStarting(msg.arg1);
+ mAmInternal.notifyAppTransitionStarting((SparseIntArray) msg.obj);
}
break;
case NOTIFY_APP_TRANSITION_CANCELLED: {
@@ -5676,10 +5692,6 @@
mAmInternal.notifyAppTransitionFinished();
}
break;
- case NOTIFY_STARTING_WINDOW_DRAWN: {
- mAmInternal.notifyStartingWindowDrawn();
- }
- break;
case WINDOW_HIDE_TIMEOUT: {
final WindowState window = (WindowState) msg.obj;
synchronized(mWindowMap) {
@@ -6964,9 +6976,8 @@
pw.print(" mLastFocus="); pw.println(mLastFocus);
}
pw.print(" mFocusedApp="); pw.println(mFocusedApp);
- if (mInputMethodTarget != null || mInputMethodTargetCandidate != null) {
- pw.println(" mInputMethodTarget=" + mInputMethodTarget
- + " mInputMethodTargetCandidate=" + getWindow(mInputMethodTargetCandidate));
+ if (mInputMethodTarget != null) {
+ pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget);
}
pw.print(" mInTouchMode="); pw.print(mInTouchMode);
pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
@@ -7008,10 +7019,14 @@
pw.print(" client="); pw.print(mClientFreezingScreen);
pw.print(" apps="); pw.print(mAppsFreezingScreen);
pw.print(" waitingForConfig="); pw.println(mWaitingForConfig);
- pw.print(" mRotation="); pw.print(mRotation);
- pw.print(" mAltOrientation="); pw.println(mAltOrientation);
- pw.print(" mLastWindowForcedOrientation="); pw.print(mLastWindowForcedOrientation);
- pw.print(" mLastOrientation="); pw.println(mLastOrientation);
+ final DisplayContent defaultDisplayContent = getDefaultDisplayContentLocked();
+ pw.print(" mRotation="); pw.print(defaultDisplayContent.getRotation());
+ pw.print(" mAltOrientation=");
+ pw.println(defaultDisplayContent.getAltOrientation());
+ pw.print(" mLastWindowForcedOrientation=");
+ pw.print(defaultDisplayContent.getLastWindowForcedOrientation());
+ pw.print(" mLastOrientation=");
+ pw.println(defaultDisplayContent.getLastOrientation());
pw.print(" mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount);
pw.print(" Animation settings: disabled="); pw.print(mAnimationsDisabled);
pw.print(" window="); pw.print(mWindowAnimationScaleSetting);
@@ -7833,28 +7848,11 @@
@Override
public void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
boolean imeWindowVisible, @Nullable IBinder targetWindowToken) {
- synchronized (mWindowMap) {
- final WindowState newTargetWin = getWindow(targetWindowToken);
- final WindowState currentTargetWin = getWindow(mInputMethodTargetCandidate);
-
- if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken="
- + imeToken + " imeWindowVisible=" + imeWindowVisible
- + " targetWindowToken=" + targetWindowToken
- + " newTargetWin=" + newTargetWin
- + " currentTargetWin=" + currentTargetWin);
-
- if (newTargetWin == currentTargetWin) {
- return;
- }
-
- final DisplayContent dc = newTargetWin != null
- ? newTargetWin.getDisplayContent() : currentTargetWin.getDisplayContent();
-
- // It is possible the window for the target candidate isn't added yet, so we
- // remember the token instead and use it to look-up the window each time we compute
- // the ime target.
- mInputMethodTargetCandidate = targetWindowToken;
- dc.computeImeTarget(true /* updateImeTarget */);
+ // TODO (b/34628091): Use this method to address the window animation issue.
+ if (DEBUG_INPUT_METHOD) {
+ Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken=" + imeToken
+ + " imeWindowVisible=" + imeWindowVisible
+ + " targetWindowToken=" + targetWindowToken);
}
}
@@ -7900,10 +7898,6 @@
}
}
- WindowState getWindow(IBinder binder) {
- return binder == null ? null : mWindowMap.get(binder);
- }
-
void registerAppFreezeListener(AppFreezeListener listener) {
if (!mAppFreezeListeners.contains(listener)) {
mAppFreezeListeners.add(listener);
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 6d572d7..ccbc5ba 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -74,7 +74,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
@@ -82,7 +81,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
@@ -1532,6 +1530,13 @@
return changed;
}
+ // Next up we will notify the client that it's visibility has changed.
+ // We need to prevent it from destroying child surfaces until
+ // the animation has finished.
+ if (!visible && isVisibleNow()) {
+ mWinAnimator.detachChildren();
+ }
+
if (visible != isVisibleNow()) {
if (!runningAppAnimation) {
final AccessibilityController accessibilityController =
@@ -2830,7 +2835,7 @@
// Sometimes we save surfaces due to layout invisible directly after rotation occurs.
// However this means the surface was never laid out in the new orientation.
// We can only restore to the last rotation we were laid out as visible in.
- if (mLastVisibleLayoutRotation != mService.mRotation) {
+ if (mLastVisibleLayoutRotation != getDisplayContent().getRotation()) {
destroySavedSurface();
return false;
}
@@ -3832,6 +3837,8 @@
windowInfo.title = mAttrs.accessibilityTitle;
windowInfo.accessibilityIdOfAnchor = mAttrs.accessibilityIdOfAnchor;
windowInfo.focused = isFocused();
+ Task task = getTask();
+ windowInfo.inPictureInPicture = (task != null) && task.inPinnedWorkspace();
if (mIsChildWindow) {
windowInfo.parentToken = getParentWindow().mClient.asBinder();
@@ -4352,7 +4359,7 @@
mWinAnimator.mEnterAnimationPending = true;
}
- mLastVisibleLayoutRotation = mService.mRotation;
+ mLastVisibleLayoutRotation = getDisplayContent().getRotation();
mWinAnimator.mEnteringAnimation = true;
if ((result & RELAYOUT_RES_FIRST_TIME) != 0) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 98598e1..4b71338 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -566,6 +566,20 @@
if (!mDestroyPreservedSurfaceUponRedraw) {
return;
}
+ if (mSurfaceController != null) {
+ if (mPendingDestroySurface != null) {
+ // If we are preserving a surface but we aren't relaunching that means
+ // we are just doing an in-place switch. In that case any SurfaceFlinger side
+ // child layers need to be reparented to the new surface to make this
+ // transparent to the app.
+ if (mWin.mAppToken == null || mWin.mAppToken.isRelaunching() == false) {
+ SurfaceControl.openTransaction();
+ mPendingDestroySurface.reparentChildrenInTransaction(mSurfaceController);
+ SurfaceControl.closeTransaction();
+ }
+ }
+ }
+
destroyDeferredSurfaceLocked();
mDestroyPreservedSurfaceUponRedraw = false;
}
@@ -1965,4 +1979,10 @@
}
return mForceScaleUntilResize;
}
+
+ void detachChildren() {
+ if (mSurfaceController != null) {
+ mSurfaceController.detachChildren();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index f8e7428..c9863c5 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -135,6 +135,20 @@
}
}
+ void reparentChildrenInTransaction(WindowSurfaceController other) {
+ if (SHOW_TRANSACTIONS) Slog.i(TAG, "REPARENT from: " + this + " to: " + other);
+ if ((mSurfaceControl != null) && (other.mSurfaceControl != null)) {
+ mSurfaceControl.reparentChildren(other.getHandle());
+ }
+ }
+
+ void detachChildren() {
+ if (SHOW_TRANSACTIONS) Slog.i(TAG, "SEVER CHILDREN");
+ if (mSurfaceControl != null) {
+ mSurfaceControl.detachChildren();
+ }
+ }
+
void hideInTransaction(String reason) {
if (SHOW_TRANSACTIONS) logSurface("HIDE ( " + reason + " )", null);
mHiddenForOtherReasons = true;
@@ -552,7 +566,10 @@
pw.print(" rect=("); pw.print(mSurfaceX);
pw.print(","); pw.print(mSurfaceY);
pw.print(") "); pw.print(mSurfaceW);
- pw.print(" x "); pw.println(mSurfaceH);
+ pw.print(" x "); pw.print(mSurfaceH);
+ pw.print(" transform=("); pw.print(mLastDsdx); pw.print(", ");
+ pw.print(mLastDtdx); pw.print(", "); pw.print(mLastDsdy);
+ pw.print(", "); pw.print(mLastDtdy); pw.println(")");
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index f247ebe..3cb96a1 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -1,9 +1,10 @@
package com.android.server.wm;
+import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManagerInternal.APP_TRANSITION_SAVED_SURFACE;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_STARTING_WINDOW;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
+import static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT;
+import static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
import static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
@@ -45,6 +46,7 @@
import android.os.Trace;
import android.util.ArraySet;
import android.util.Slog;
+import android.util.SparseIntArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -93,6 +95,7 @@
private final LayerAndToken mTmpLayerAndToken = new LayerAndToken();
private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>();
+ private final SparseIntArray mTempTransitionReasons = new SparseIntArray();
public WindowSurfacePlacer(WindowManagerService service) {
mService = service;
@@ -495,7 +498,7 @@
mService.mAnimator.getScreenRotationAnimationLocked(
Display.DEFAULT_DISPLAY);
- int reason = APP_TRANSITION_TIMEOUT;
+ final SparseIntArray reasons = mTempTransitionReasons;
if (!mService.mAppTransition.isTimeout()) {
// Imagine the case where we are changing orientation due to an app transition, but a previous
// orientation change is still in progress. We won't process the orientation change
@@ -526,11 +529,15 @@
if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
return false;
}
+ final TaskStack stack = wtoken.getStack();
+ final int stackId = stack != null ? stack.mStackId : INVALID_STACK_ID;
if (allDrawn) {
- reason = drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN
- : APP_TRANSITION_SAVED_SURFACE;
+ reasons.put(stackId, drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN
+ : APP_TRANSITION_SAVED_SURFACE);
} else {
- reason = APP_TRANSITION_STARTING_WINDOW;
+ reasons.put(stackId, wtoken.startingData instanceof SplashScreenStartingData
+ ? APP_TRANSITION_SPLASH_SCREEN
+ : APP_TRANSITION_SNAPSHOT);
}
}
@@ -552,12 +559,13 @@
boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
mWallpaperControllerLocked.wallpaperTransitionReady();
if (wallpaperReady) {
- mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget();
+ mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone())
+ .sendToTarget();
return true;
}
return false;
}
- mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget();
+ mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone()).sendToTarget();
return true;
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 1a0aff7..a8423e2 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -195,7 +195,7 @@
private static final String WALLPAPER_SERVICE_CLASS =
"com.android.server.wallpaper.WallpaperManagerService$Lifecycle";
private static final String AUTO_FILL_MANAGER_SERVICE_CLASS =
- "com.android.server.autofill.AutoFillManagerService";
+ "com.android.server.autofill.AutofillManagerService";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
diff --git a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
index ad64e4e..e6e2cb3 100644
--- a/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
+++ b/services/print/java/com/android/server/print/CompanionDeviceManagerService.java
@@ -141,7 +141,7 @@
}
private ServiceConnection getServiceConnection(
- final AssociationRequest<?> request,
+ final AssociationRequest request,
final IFindDeviceCallback findDeviceCallback,
final String callingPackage) {
return new ServiceConnection() {
diff --git a/services/tests/notification/Android.mk b/services/tests/notification/Android.mk
index bc37fef..de9553a 100644
--- a/services/tests/notification/Android.mk
+++ b/services/tests/notification/Android.mk
@@ -27,6 +27,8 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JACK_FLAGS := --multi-dex native
+
LOCAL_PACKAGE_NAME := FrameworksNotificationTests
LOCAL_CERTIFICATE := platform
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 450f9b6..5f215f9 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -427,13 +427,8 @@
public void testCreateChannel_blocked() throws Exception {
mHelper.setImportance(pkg, uid, NotificationManager.IMPORTANCE_NONE);
- try {
- mHelper.createNotificationChannel(pkg, uid,
- new NotificationChannel(pkg, "", IMPORTANCE_LOW), true);
- fail("Channel creation should fail");
- } catch (IllegalArgumentException e) {
- // pass
- }
+ mHelper.createNotificationChannel(pkg, uid,
+ new NotificationChannel(pkg, "bananas", IMPORTANCE_LOW), true);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
index 60842a6..340c624 100644
--- a/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/AccessibilityManagerServiceTest.java
@@ -34,6 +34,8 @@
import android.view.accessibility.IAccessibilityManager;
import android.view.accessibility.IAccessibilityManagerClient;
+import com.android.internal.util.IntPair;
+
/**
* This test exercises the
* {@link com.android.server.accessibility.AccessibilityManagerService} by mocking the
@@ -109,7 +111,7 @@
// invoke the method under test
final int stateFlagsDisabled =
- mManagerService.addClient(mockClient, UserHandle.USER_CURRENT);
+ IntPair.first(mManagerService.addClient(mockClient, UserHandle.USER_CURRENT));
boolean enabledAccessibilityDisabled =
(stateFlagsDisabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -122,7 +124,7 @@
// invoke the method under test
final int stateFlagsEnabled =
- mManagerService.addClient(mockClient, UserHandle.USER_CURRENT);
+ IntPair.first(mManagerService.addClient(mockClient, UserHandle.USER_CURRENT));
boolean enabledAccessibilityEnabled =
(stateFlagsEnabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -144,7 +146,7 @@
// invoke the method under test
final int stateFlagsEnabled =
- mManagerService.addClient(mockClient, UserHandle.USER_CURRENT);
+ IntPair.first(mManagerService.addClient(mockClient, UserHandle.USER_CURRENT));
boolean enabledAccessibilityEnabled =
(stateFlagsEnabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -157,7 +159,7 @@
// invoke the method under test
final int stateFlagsDisabled =
- mManagerService.addClient(mockClient, UserHandle.USER_CURRENT);
+ IntPair.first(mManagerService.addClient(mockClient, UserHandle.USER_CURRENT));
boolean enabledAccessibilityDisabled =
(stateFlagsDisabled & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0;
@@ -572,8 +574,9 @@
public void notifyServicesStateChanged() {}
- public void setTouchExplorationEnabled(boolean enabled) {
- }
+ public void setRelevantEventTypes(int eventTypes) {}
+
+ public void setTouchExplorationEnabled(boolean enabled) {}
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java b/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
index 6e3e6c6..9261771 100644
--- a/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/AccessibilityManagerTest.java
@@ -18,7 +18,6 @@
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -32,6 +31,8 @@
import android.view.accessibility.IAccessibilityManager;
import android.view.accessibility.IAccessibilityManagerClient;
+import com.android.internal.util.IntPair;
+
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -60,10 +61,12 @@
private AccessibilityManager createManager(boolean enabled) throws Exception {
if (enabled) {
when(mMockService.addClient(any(IAccessibilityManagerClient.class), anyInt()))
- .thenReturn(AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
+ .thenReturn(
+ IntPair.of(AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED,
+ AccessibilityEvent.TYPES_ALL_MASK));
} else {
when(mMockService.addClient(any(IAccessibilityManagerClient.class), anyInt()))
- .thenReturn(0);
+ .thenReturn(IntPair.of(0, AccessibilityEvent.TYPES_ALL_MASK));
}
AccessibilityManager manager =
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 3f34d4f..a9b2ae5 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -594,19 +594,19 @@
@Test
public void testUidForeground() throws Exception {
// push all uids into background
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE);
- mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
+ mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE, 0);
assertFalse(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B));
// push one of the uids into foreground
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0);
assertTrue(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B));
// and swap another uid into foreground
- mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE);
- mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP);
+ mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
+ mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP, 0);
assertFalse(mService.isUidForeground(UID_A));
assertTrue(mService.isUidForeground(UID_B));
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index 38c6b0d..6cca771 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -314,8 +314,8 @@
final Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_RECOMMENDATION_RESULT, providerResult);
doAnswer(invocation -> {
- bundle.putInt(EXTRA_SEQUENCE, invocation.getArgumentAt(2, int.class));
- invocation.getArgumentAt(1, IRemoteCallback.class).sendResult(bundle);
+ bundle.putInt(EXTRA_SEQUENCE, invocation.getArgument(2));
+ invocation.<IRemoteCallback>getArgument(1).sendResult(bundle);
return null;
}).when(mRecommendationProvider)
.requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
@@ -379,7 +379,7 @@
injectProvider();
final Bundle bundle = new Bundle();
doAnswer(invocation -> {
- invocation.getArgumentAt(1, IRemoteCallback.class).sendResult(bundle);
+ invocation.<IRemoteCallback>getArgument(1).sendResult(bundle);
return null;
}).when(mRecommendationProvider)
.requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
@@ -956,7 +956,7 @@
IBinder mockBinder = mock(IBinder.class);
when(mockBinder.queryLocalInterface(anyString()))
.thenReturn(mRecommendationProvider);
- invocation.getArgumentAt(1, ServiceConnection.class)
+ invocation.<ServiceConnection>getArgument(1)
.onServiceConnected(NEW_SCORER.getRecommendationServiceComponent(),
mockBinder);
return true;
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
index 64f176a..e8663a2 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
@@ -50,10 +50,10 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import org.mockito.compat.ArgumentMatcher;
import java.util.ArrayList;
import java.util.List;
@@ -77,7 +77,7 @@
when(mMockContext.getPackageManager()).thenReturn(mMockPm);
when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() {
@Override
- public boolean matches(Object object) {
+ public boolean matchesObject(Object object) {
Intent intent = (Intent) object;
return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction());
}
@@ -395,7 +395,7 @@
when(mMockPm.resolveService(
Mockito.argThat(new ArgumentMatcher<Intent>() {
@Override
- public boolean matches(Object object) {
+ public boolean matchesObject(Object object) {
Intent intent = (Intent) object;
return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
.equals(intent.getAction())
@@ -416,7 +416,7 @@
when(mMockPm.resolveActivity(
Mockito.argThat(new ArgumentMatcher<Intent>() {
@Override
- public boolean matches(Object object) {
+ public boolean matchesObject(Object object) {
Intent intent = (Intent) object;
return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
&& useOpenWifiComp.getPackageName().equals(intent.getPackage());
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/ActionReplacingCallbackTest.java b/services/tests/servicestests/src/com/android/server/accessibility/ActionReplacingCallbackTest.java
new file mode 100644
index 0000000..8afe853
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/accessibility/ActionReplacingCallbackTest.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+import android.graphics.Region;
+import android.os.RemoteException;
+import android.view.MagnificationSpec;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import android.view.accessibility.AccessibilityWindowInfo;
+import android.view.accessibility.IAccessibilityInteractionConnection;
+import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS;
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK;
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_COLLAPSE;
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND;
+import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CONTEXT_CLICK;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+/**
+ * Tests for ActionReplacingCallback
+ */
+public class ActionReplacingCallbackTest {
+ private static final int INTERACTION_ID = 0xBEEF;
+ private static final int INTERROGATING_PID = 0xFEED;
+ private static final int APP_WINDOW_ID = 0xACE;
+ private static final int NON_ROOT_NODE_ID = 0xAAAA5555;
+ private static final long INTERROGATING_TID = 0x1234FACE;
+
+ private static final AccessibilityAction[] ACTIONS_FROM_REPLACER =
+ {ACTION_CLICK, ACTION_EXPAND};
+ private static final AccessibilityAction[] A11Y_FOCUS_ACTIONS =
+ {ACTION_ACCESSIBILITY_FOCUS, ACTION_CLEAR_ACCESSIBILITY_FOCUS};
+ // We expect both the replacer actions and a11y focus actions to appear
+ private static final AccessibilityAction[] REQUIRED_ACTIONS_ON_ROOT_TO_SERVICE =
+ {ACTION_CLICK, ACTION_EXPAND, ACTION_ACCESSIBILITY_FOCUS,
+ ACTION_CLEAR_ACCESSIBILITY_FOCUS};
+
+ @Mock IAccessibilityInteractionConnectionCallback mMockServiceCallback;
+ @Mock IAccessibilityInteractionConnection mMockReplacerConnection;
+
+ @Captor private ArgumentCaptor<Integer> mInteractionIdCaptor;
+ @Captor private ArgumentCaptor<AccessibilityNodeInfo> mInfoCaptor;
+ @Captor private ArgumentCaptor<List<AccessibilityNodeInfo>> mInfoListCaptor;
+
+ private ActionReplacingCallback mActionReplacingCallback;
+ private int mReplacerInteractionId;
+
+ @Before
+ public void setUp() throws RemoteException {
+ initMocks(this);
+ mActionReplacingCallback = new ActionReplacingCallback(
+ mMockServiceCallback, mMockReplacerConnection, INTERACTION_ID, INTERROGATING_PID,
+ INTERROGATING_TID);
+ verify(mMockReplacerConnection).findAccessibilityNodeInfoByAccessibilityId(
+ eq(AccessibilityNodeInfo.ROOT_NODE_ID), (Region) anyObject(),
+ mInteractionIdCaptor.capture(), eq(mActionReplacingCallback), eq(0),
+ eq(INTERROGATING_PID), eq(INTERROGATING_TID), (MagnificationSpec) anyObject(),
+ eq(null));
+ mReplacerInteractionId = mInteractionIdCaptor.getValue().intValue();
+ }
+
+ @Test
+ public void testConstructor_registersToGetRootNodeOfActionReplacer() throws RemoteException {
+ assertNotEquals(INTERACTION_ID, mReplacerInteractionId);
+ verifyNoMoreInteractions(mMockServiceCallback);
+ }
+
+ @Test
+ public void testCallbacks_singleRootNodeThenReplacer_returnsNodeWithReplacedActions()
+ throws RemoteException {
+ AccessibilityNodeInfo infoFromApp = AccessibilityNodeInfo.obtain();
+ infoFromApp.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, APP_WINDOW_ID);
+ infoFromApp.addAction(ACTION_CONTEXT_CLICK);
+ mActionReplacingCallback.setFindAccessibilityNodeInfoResult(infoFromApp, INTERACTION_ID);
+ verifyNoMoreInteractions(mMockServiceCallback);
+
+ mActionReplacingCallback.setFindAccessibilityNodeInfosResult(getReplacerNodes(),
+ mReplacerInteractionId);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfoResult(mInfoCaptor.capture(),
+ eq(INTERACTION_ID));
+ AccessibilityNodeInfo infoSentToService = mInfoCaptor.getValue();
+ assertEquals(AccessibilityNodeInfo.ROOT_NODE_ID, infoSentToService.getSourceNodeId());
+ assertInfoHasExactlyTheseActions(infoSentToService, REQUIRED_ACTIONS_ON_ROOT_TO_SERVICE);
+ }
+
+ public void testCallbacks_singleNonrootNodeThenReplacer_returnsNodeWithNoActions()
+ throws RemoteException {
+ AccessibilityNodeInfo infoFromApp = AccessibilityNodeInfo.obtain();
+ infoFromApp.setSourceNodeId(NON_ROOT_NODE_ID, APP_WINDOW_ID);
+ infoFromApp.addAction(ACTION_CONTEXT_CLICK);
+ mActionReplacingCallback.setFindAccessibilityNodeInfoResult(infoFromApp, INTERACTION_ID);
+ verifyNoMoreInteractions(mMockServiceCallback);
+
+ mActionReplacingCallback.setFindAccessibilityNodeInfosResult(getReplacerNodes(),
+ mReplacerInteractionId);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfoResult(mInfoCaptor.capture(),
+ eq(INTERACTION_ID));
+ AccessibilityNodeInfo infoSentToService = mInfoCaptor.getValue();
+ assertEquals(NON_ROOT_NODE_ID, infoSentToService.getSourceNodeId());
+ assertTrue(infoSentToService.getActionList().isEmpty());
+ }
+
+ public void testCallbacks_replacerThenSingleRootNode_returnsNodeWithReplacedActions()
+ throws RemoteException {
+ mActionReplacingCallback.setFindAccessibilityNodeInfosResult(getReplacerNodes(),
+ mReplacerInteractionId);
+ verifyNoMoreInteractions(mMockServiceCallback);
+
+ AccessibilityNodeInfo infoFromApp = AccessibilityNodeInfo.obtain();
+ infoFromApp.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, APP_WINDOW_ID);
+ infoFromApp.addAction(ACTION_CONTEXT_CLICK);
+ mActionReplacingCallback.setFindAccessibilityNodeInfoResult(infoFromApp, INTERACTION_ID);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfoResult(mInfoCaptor.capture(),
+ eq(INTERACTION_ID));
+ AccessibilityNodeInfo infoSentToService = mInfoCaptor.getValue();
+ assertEquals(AccessibilityNodeInfo.ROOT_NODE_ID, infoSentToService.getSourceNodeId());
+ assertInfoHasExactlyTheseActions(infoSentToService, REQUIRED_ACTIONS_ON_ROOT_TO_SERVICE);
+ }
+
+ public void testCallbacks_multipleNodesThenReplacer_clearsActionsAndAddsSomeToRoot()
+ throws RemoteException {
+ mActionReplacingCallback
+ .setFindAccessibilityNodeInfosResult(getAppNodeList(), INTERACTION_ID);
+ verifyNoMoreInteractions(mMockServiceCallback);
+
+ mActionReplacingCallback.setFindAccessibilityNodeInfosResult(getReplacerNodes(),
+ mReplacerInteractionId);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfosResult(mInfoListCaptor.capture(),
+ eq(INTERACTION_ID));
+ assertEquals(2, mInfoListCaptor.getValue().size());
+ AccessibilityNodeInfo rootInfoSentToService = getNodeWithIdFromList(
+ mInfoListCaptor.getValue(), AccessibilityNodeInfo.ROOT_NODE_ID);
+ AccessibilityNodeInfo otherInfoSentToService = getNodeWithIdFromList(
+ mInfoListCaptor.getValue(), NON_ROOT_NODE_ID);
+ assertInfoHasExactlyTheseActions(
+ rootInfoSentToService, REQUIRED_ACTIONS_ON_ROOT_TO_SERVICE);
+ assertTrue(otherInfoSentToService.getActionList().isEmpty());
+ }
+
+ public void testCallbacks_replacerThenMultipleNodes_clearsActionsAndAddsSomeToRoot()
+ throws RemoteException {
+ mActionReplacingCallback.setFindAccessibilityNodeInfosResult(getReplacerNodes(),
+ mReplacerInteractionId);
+ verifyNoMoreInteractions(mMockServiceCallback);
+
+ mActionReplacingCallback
+ .setFindAccessibilityNodeInfosResult(getAppNodeList(), INTERACTION_ID);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfosResult(mInfoListCaptor.capture(),
+ eq(INTERACTION_ID));
+ assertEquals(2, mInfoListCaptor.getValue().size());
+ AccessibilityNodeInfo rootInfoSentToService = getNodeWithIdFromList(
+ mInfoListCaptor.getValue(), AccessibilityNodeInfo.ROOT_NODE_ID);
+ AccessibilityNodeInfo otherInfoSentToService = getNodeWithIdFromList(
+ mInfoListCaptor.getValue(), NON_ROOT_NODE_ID);
+ assertInfoHasExactlyTheseActions(
+ rootInfoSentToService, REQUIRED_ACTIONS_ON_ROOT_TO_SERVICE);
+ assertTrue(otherInfoSentToService.getActionList().isEmpty());
+ }
+
+ public void testConstructor_actionReplacerThrowsException_passesDataToService()
+ throws RemoteException {
+ doThrow(RemoteException.class).when(mMockReplacerConnection)
+ .findAccessibilityNodeInfoByAccessibilityId(eq(AccessibilityNodeInfo.ROOT_NODE_ID),
+ (Region) anyObject(), mInteractionIdCaptor.capture(),
+ eq(mActionReplacingCallback), eq(0), eq(INTERROGATING_PID),
+ eq(INTERROGATING_TID), (MagnificationSpec) anyObject(), eq(null));
+ ActionReplacingCallback actionReplacingCallback = new ActionReplacingCallback(
+ mMockServiceCallback, mMockReplacerConnection, INTERACTION_ID, INTERROGATING_PID,
+ INTERROGATING_TID);
+
+ verifyNoMoreInteractions(mMockServiceCallback);
+ AccessibilityNodeInfo infoFromApp = AccessibilityNodeInfo.obtain();
+ infoFromApp.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, APP_WINDOW_ID);
+ infoFromApp.addAction(ACTION_CONTEXT_CLICK);
+ actionReplacingCallback.setFindAccessibilityNodeInfoResult(infoFromApp, INTERACTION_ID);
+
+ verify(mMockServiceCallback).setFindAccessibilityNodeInfoResult(mInfoCaptor.capture(),
+ eq(INTERACTION_ID));
+ AccessibilityNodeInfo infoSentToService = mInfoCaptor.getValue();
+ assertEquals(AccessibilityNodeInfo.ROOT_NODE_ID, infoSentToService.getSourceNodeId());
+ assertEquals(1, infoSentToService.getActionList().size());
+ assertEquals(ACTION_CONTEXT_CLICK, infoSentToService.getActionList().get(0));
+ }
+
+ public void testSetPerformAccessibilityActionResult_actsAsPassThrough() throws RemoteException {
+ mActionReplacingCallback.setPerformAccessibilityActionResult(true, INTERACTION_ID);
+ verify(mMockServiceCallback).setPerformAccessibilityActionResult(true, INTERACTION_ID);
+ mActionReplacingCallback.setPerformAccessibilityActionResult(false, INTERACTION_ID);
+ verify(mMockServiceCallback).setPerformAccessibilityActionResult(false, INTERACTION_ID);
+ }
+
+
+ private List<AccessibilityNodeInfo> getReplacerNodes() {
+ AccessibilityNodeInfo root = AccessibilityNodeInfo.obtain();
+ root.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID,
+ AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID);
+ for (AccessibilityAction action : ACTIONS_FROM_REPLACER) {
+ root.addAction(action);
+ }
+
+ // Second node should have no effect
+ AccessibilityNodeInfo other = AccessibilityNodeInfo.obtain();
+ other.setSourceNodeId(NON_ROOT_NODE_ID,
+ AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID);
+ other.addAction(ACTION_COLLAPSE);
+
+ return Arrays.asList(root, other);
+ }
+
+ private void assertInfoHasExactlyTheseActions(
+ AccessibilityNodeInfo info, AccessibilityAction[] actions) {
+ List<AccessibilityAction> nodeActions = info.getActionList();
+ assertEquals(new HashSet<AccessibilityAction>(nodeActions),
+ new HashSet<AccessibilityAction>(Arrays.asList(actions)));
+ }
+
+ private AccessibilityNodeInfo getNodeWithIdFromList(
+ List<AccessibilityNodeInfo> infos, long id) {
+ for (AccessibilityNodeInfo info : infos) {
+ if (info.getSourceNodeId() == id) {
+ return info;
+ }
+ }
+ assertTrue("Didn't find node", false);
+ return null;
+ }
+
+ private List<AccessibilityNodeInfo> getAppNodeList() {
+ AccessibilityNodeInfo rootInfoFromApp = AccessibilityNodeInfo.obtain();
+ rootInfoFromApp.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, APP_WINDOW_ID);
+ rootInfoFromApp.addAction(ACTION_CONTEXT_CLICK);
+ AccessibilityNodeInfo otherInfoFromApp = AccessibilityNodeInfo.obtain();
+ otherInfoFromApp.setSourceNodeId(NON_ROOT_NODE_ID, APP_WINDOW_ID);
+ otherInfoFromApp.addAction(ACTION_CLICK);
+ return Arrays.asList(rootInfoFromApp, otherInfoFromApp);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
index 0ab91a1..fc12edc 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
@@ -22,13 +22,13 @@
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -46,12 +46,13 @@
import android.view.KeyEvent;
import android.view.WindowManagerPolicy;
import com.android.server.accessibility.KeyEventDispatcher.KeyEventFilter;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
/**
* Tests for KeyEventDispatcher
@@ -558,7 +559,7 @@
.matches(mInputEventsHander.timedMessages.get(1).obj));
}
- private class KeyEventMatcher extends ArgumentMatcher<KeyEvent> {
+ private class KeyEventMatcher extends TypeSafeMatcher<KeyEvent> {
private KeyEvent mEventToMatch;
KeyEventMatcher(KeyEvent eventToMatch) {
@@ -566,14 +567,15 @@
}
@Override
- public boolean matches(Object event) {
- if (!(event instanceof KeyEvent)) {
- return false;
- }
- KeyEvent keyEvent = (KeyEvent) event;
+ public boolean matchesSafely(KeyEvent keyEvent) {
return (mEventToMatch.getAction() == keyEvent.getAction())
&& (mEventToMatch.getKeyCode() == keyEvent.getKeyCode());
}
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("Key event matcher");
+ }
}
private class MessageCapturingHandler extends Handler {
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
index cb5e8bb..d44c1ca 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
@@ -22,7 +22,6 @@
import static org.junit.Assert.assertFalse;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
@@ -30,6 +29,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import android.animation.ValueAnimator;
import android.content.BroadcastReceiver;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
index 73344e0..ec99a9a 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
@@ -28,7 +28,6 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
@@ -36,6 +35,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
import android.accessibilityservice.GestureDescription.GestureStep;
import android.accessibilityservice.GestureDescription.TouchPoint;
@@ -65,7 +65,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
+import org.mockito.compat.ArgumentMatcher;
/**
* Tests for MotionEventInjector
@@ -396,7 +396,7 @@
hasEventTime(downTime + CONTINUED_LINE_INTERVAL)));
// Timing will restart when the gesture continues
long secondSequenceStart = events.get(2).getEventTime();
- assertTrue(secondSequenceStart > events.get(1).getEventTime());
+ assertTrue(secondSequenceStart >= events.get(1).getEventTime());
assertThat(events.get(2), allOf(isAtPoint(CONTINUED_LINE_MID2), IS_ACTION_MOVE));
assertThat(events.get(3), allOf(isAtPoint(CONTINUED_LINE_END), IS_ACTION_MOVE,
hasEventTime(secondSequenceStart + CONTINUED_LINE_INTERVAL)));
@@ -738,7 +738,7 @@
return next;
}
- static class MotionEventMatcher extends ArgumentMatcher<MotionEvent> {
+ static class MotionEventMatcher extends TypeSafeMatcher<MotionEvent> {
long mDownTime;
long mEventTime;
long mActionMasked;
@@ -764,8 +764,7 @@
}
@Override
- public boolean matches(Object o) {
- MotionEvent event = (MotionEvent) o;
+ public boolean matchesSafely(MotionEvent event) {
if ((event.getDownTime() == mDownTime) && (event.getEventTime() == mEventTime)
&& (event.getActionMasked() == mActionMasked) && ((int) event.getX() == mX)
&& ((int) event.getY() == mY)) {
@@ -782,6 +781,11 @@
Log.e(LOG_TAG, "event.getY() = " + event.getY() + ", expected " + mY);
return false;
}
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("Motion event matcher");
+ }
}
private static class MotionEventActionMatcher extends TypeSafeMatcher<MotionEvent> {
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index cc2f7d5..556b218 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -31,15 +31,35 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.app.IUidObserver;
+import android.os.IBinder;
+import android.os.Process;
+import android.os.RemoteException;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.server.AppOpsService;
+
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
import java.util.function.Function;
/**
@@ -62,9 +82,16 @@
public class ActivityManagerServiceTest {
private static final int TEST_UID = 111;
+ @Mock private AppOpsService mAppOpsService;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
@Test
public void testIncrementProcStateSeqIfNeeded() {
- final ActivityManagerService ams = new ActivityManagerService();
+ final ActivityManagerService ams = new ActivityManagerService(mAppOpsService);
final UidRecord uidRec = new UidRecord(TEST_UID);
assertEquals("Initially global seq counter should be 0", 0, ams.mProcStateSeqCounter);
@@ -104,7 +131,7 @@
@Test
public void testShouldIncrementProcStateSeq() {
- final ActivityManagerService ams = new ActivityManagerService();
+ final ActivityManagerService ams = new ActivityManagerService(mAppOpsService);
final UidRecord uidRec = new UidRecord(TEST_UID);
final String error1 = "Seq should be incremented: prevState: %s, curState: %s";
@@ -145,4 +172,286 @@
uidRec.curProcState = PROCESS_STATE_LAST_ACTIVITY;
assertTrue(errorMsg.apply(error1), ams.shouldIncrementProcStateSeq(uidRec));
}
+
+ /**
+ * This test verifies that process state changes are dispatched to observers based on the
+ * changes they wanted to listen (this is specified when registering the observer).
+ */
+ @Test
+ public void testDispatchUids_dispatchNeededChanges() throws RemoteException {
+ final ActivityManagerService ams = new ActivityManagerService(mAppOpsService);
+ when(mAppOpsService.checkOperation(AppOpsManager.OP_GET_USAGE_STATS, Process.myUid(), null))
+ .thenReturn(AppOpsManager.MODE_ALLOWED);
+
+ final int[] changesToObserve = {
+ ActivityManager.UID_OBSERVER_PROCSTATE,
+ ActivityManager.UID_OBSERVER_GONE,
+ ActivityManager.UID_OBSERVER_IDLE,
+ ActivityManager.UID_OBSERVER_ACTIVE,
+ ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE
+ | ActivityManager.UID_OBSERVER_ACTIVE | ActivityManager.UID_OBSERVER_IDLE
+ };
+ final IUidObserver[] observers = new IUidObserver.Stub[changesToObserve.length];
+ for (int i = 0; i < observers.length; ++i) {
+ observers[i] = Mockito.mock(IUidObserver.Stub.class);
+ when(observers[i].asBinder()).thenReturn((IBinder) observers[i]);
+ ams.registerUidObserver(observers[i], changesToObserve[i] /* which */,
+ ActivityManager.PROCESS_STATE_UNKNOWN /* cutpoint */, null /* caller */);
+
+ // When we invoke AMS.registerUidObserver, there are some interactions with observers[i]
+ // mock in RemoteCallbackList class. We don't want to test those interactions and
+ // at the same time, we don't want those to interfere with verifyNoMoreInteractions.
+ // So, resetting the mock here.
+ Mockito.reset(observers[i]);
+ }
+
+ // Add pending uid records each corresponding to a different change type UidRecord.CHANGE_*
+ final int[] changesForPendingUidRecords = {
+ UidRecord.CHANGE_PROCSTATE,
+ UidRecord.CHANGE_GONE,
+ UidRecord.CHANGE_GONE_IDLE,
+ UidRecord.CHANGE_IDLE,
+ UidRecord.CHANGE_ACTIVE
+ };
+ final int[] procStatesForPendingUidRecords = {
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_STATE_NONEXISTENT,
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_STATE_CACHED_ACTIVITY,
+ ActivityManager.PROCESS_STATE_TOP
+ };
+ final Map<Integer, UidRecord.ChangeItem> changeItems = new HashMap<>();
+ for (int i = 0; i < changesForPendingUidRecords.length; ++i) {
+ final UidRecord.ChangeItem pendingChange = new UidRecord.ChangeItem();
+ pendingChange.change = changesForPendingUidRecords[i];
+ pendingChange.uid = i;
+ pendingChange.processState = procStatesForPendingUidRecords[i];
+ pendingChange.procStateSeq = i;
+ changeItems.put(changesForPendingUidRecords[i], pendingChange);
+ ams.mPendingUidChanges.add(pendingChange);
+ }
+
+ ams.dispatchUidsChanged();
+ // Verify the required changes have been dispatched to observers.
+ for (int i = 0; i < observers.length; ++i) {
+ final int changeToObserve = changesToObserve[i];
+ final IUidObserver observerToTest = observers[i];
+ if ((changeToObserve & ActivityManager.UID_OBSERVER_IDLE) != 0) {
+ // Observer listens to uid idle changes, so change items corresponding to
+ // UidRecord.CHANGE_IDLE or UidRecord.CHANGE_IDLE_GONE needs to be
+ // delivered to this observer.
+ final int[] changesToVerify = {
+ UidRecord.CHANGE_IDLE,
+ UidRecord.CHANGE_GONE_IDLE
+ };
+ verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
+ (observer, changeItem) -> {
+ verify(observer).onUidIdle(changeItem.uid, changeItem.ephemeral);
+ });
+ }
+ if ((changeToObserve & ActivityManager.UID_OBSERVER_ACTIVE) != 0) {
+ // Observer listens to uid active changes, so change items corresponding to
+ // UidRecord.CHANGE_ACTIVE needs to be delivered to this observer.
+ final int[] changesToVerify = { UidRecord.CHANGE_ACTIVE };
+ verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
+ (observer, changeItem) -> {
+ verify(observer).onUidActive(changeItem.uid);
+ });
+ }
+ if ((changeToObserve & ActivityManager.UID_OBSERVER_GONE) != 0) {
+ // Observer listens to uid gone changes, so change items corresponding to
+ // UidRecord.CHANGE_GONE or UidRecord.CHANGE_IDLE_GONE needs to be
+ // delivered to this observer.
+ final int[] changesToVerify = {
+ UidRecord.CHANGE_GONE,
+ UidRecord.CHANGE_GONE_IDLE
+ };
+ verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
+ (observer, changeItem) -> {
+ verify(observer).onUidGone(changeItem.uid, changeItem.ephemeral);
+ });
+ }
+ if ((changeToObserve & ActivityManager.UID_OBSERVER_PROCSTATE) != 0) {
+ // Observer listens to uid procState changes, so change items corresponding to
+ // UidRecord.CHANGE_PROCSTATE or UidRecord.CHANGE_IDLE or UidRecord.CHANGE_ACTIVE
+ // needs to be delivered to this observer.
+ final int[] changesToVerify = {
+ UidRecord.CHANGE_PROCSTATE,
+ UidRecord.CHANGE_ACTIVE,
+ UidRecord.CHANGE_IDLE
+ };
+ verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
+ (observer, changeItem) -> {
+ verify(observer).onUidStateChanged(changeItem.uid,
+ changeItem.processState, changeItem.procStateSeq);
+ });
+ }
+ // Verify there are no other callbacks for this observer.
+ verifyNoMoreInteractions(observerToTest);
+ }
+ }
+
+ private interface ObserverChangesVerifier {
+ void verify(IUidObserver observer, UidRecord.ChangeItem changeItem) throws RemoteException;
+ }
+
+ private void verifyObserverReceivedChanges(IUidObserver observer, int[] changesToVerify,
+ Map<Integer, UidRecord.ChangeItem> changeItems, ObserverChangesVerifier verifier)
+ throws RemoteException {
+ for (int change : changesToVerify) {
+ final UidRecord.ChangeItem changeItem = changeItems.get(change);
+ verifier.verify(observer, changeItem);
+ }
+ }
+
+ /**
+ * This test verifies that process state changes are dispatched to observers only when they
+ * change across the cutpoint (this is specified when registering the observer).
+ */
+ @Test
+ public void testDispatchUidChanges_procStateCutpoint() throws RemoteException {
+ final ActivityManagerService ams = new ActivityManagerService(mAppOpsService);
+ final IUidObserver observer = Mockito.mock(IUidObserver.Stub.class);
+
+ when(observer.asBinder()).thenReturn((IBinder) observer);
+ ams.registerUidObserver(observer, ActivityManager.UID_OBSERVER_PROCSTATE /* which */,
+ ActivityManager.PROCESS_STATE_SERVICE /* cutpoint */, null /* callingPackage */);
+ // When we invoke AMS.registerUidObserver, there are some interactions with observer
+ // mock in RemoteCallbackList class. We don't want to test those interactions and
+ // at the same time, we don't want those to interfere with verifyNoMoreInteractions.
+ // So, resetting the mock here.
+ Mockito.reset(observer);
+
+ final UidRecord.ChangeItem changeItem = new UidRecord.ChangeItem();
+ changeItem.uid = TEST_UID;
+ changeItem.change = UidRecord.CHANGE_PROCSTATE;
+ changeItem.processState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+ changeItem.procStateSeq = 111;
+ ams.mPendingUidChanges.add(changeItem);
+ ams.dispatchUidsChanged();
+ // First process state message is always delivered regardless of whether the process state
+ // change is above or below the cutpoint (PROCESS_STATE_SERVICE).
+ verify(observer).onUidStateChanged(TEST_UID,
+ changeItem.processState, changeItem.procStateSeq);
+ verifyNoMoreInteractions(observer);
+
+ changeItem.processState = ActivityManager.PROCESS_STATE_RECEIVER;
+ ams.mPendingUidChanges.add(changeItem);
+ ams.dispatchUidsChanged();
+ // Previous process state change is below cutpoint (PROCESS_STATE_SERVICE) and
+ // the current process state change is also below cutpoint, so no callback will be invoked.
+ verifyNoMoreInteractions(observer);
+
+ changeItem.processState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
+ ams.mPendingUidChanges.add(changeItem);
+ ams.dispatchUidsChanged();
+ // Previous process state change is below cutpoint (PROCESS_STATE_SERVICE) and
+ // the current process state change is above cutpoint, so callback will be invoked with the
+ // current process state change.
+ verify(observer).onUidStateChanged(TEST_UID,
+ changeItem.processState, changeItem.procStateSeq);
+ verifyNoMoreInteractions(observer);
+
+ changeItem.processState = ActivityManager.PROCESS_STATE_TOP;
+ ams.mPendingUidChanges.add(changeItem);
+ ams.dispatchUidsChanged();
+ // Previous process state change is above cutpoint (PROCESS_STATE_SERVICE) and
+ // the current process state change is also above cutpoint, so no callback will be invoked.
+ verifyNoMoreInteractions(observer);
+
+ changeItem.processState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
+ ams.mPendingUidChanges.add(changeItem);
+ ams.dispatchUidsChanged();
+ // Previous process state change is above cutpoint (PROCESS_STATE_SERVICE) and
+ // the current process state change is below cutpoint, so callback will be invoked with the
+ // current process state change.
+ verify(observer).onUidStateChanged(TEST_UID,
+ changeItem.processState, changeItem.procStateSeq);
+ verifyNoMoreInteractions(observer);
+ }
+
+ /**
+ * This test verifies that {@link ActivityManagerService#mValidateUids} which is a
+ * part of dumpsys is correctly updated.
+ */
+ @Test
+ public void testDispatchUidChanges_validateUidsUpdated() {
+ final ActivityManagerService ams = new ActivityManagerService(mAppOpsService);
+
+ final int[] changesForPendingItems = {
+ UidRecord.CHANGE_PROCSTATE,
+ UidRecord.CHANGE_GONE,
+ UidRecord.CHANGE_GONE_IDLE,
+ UidRecord.CHANGE_IDLE,
+ UidRecord.CHANGE_ACTIVE
+ };
+ final int[] procStatesForPendingItems = {
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE,
+ ActivityManager.PROCESS_STATE_CACHED_EMPTY,
+ ActivityManager.PROCESS_STATE_CACHED_ACTIVITY,
+ ActivityManager.PROCESS_STATE_SERVICE,
+ ActivityManager.PROCESS_STATE_RECEIVER
+ };
+ final ArrayList<UidRecord.ChangeItem> pendingItemsForUids
+ = new ArrayList<>(changesForPendingItems.length);
+ for (int i = 0; i < changesForPendingItems.length; ++i) {
+ final UidRecord.ChangeItem item = new UidRecord.ChangeItem();
+ item.uid = i;
+ item.change = changesForPendingItems[i];
+ item.processState = procStatesForPendingItems[i];
+ pendingItemsForUids.add(i, item);
+ }
+
+ // Verify that when there no observers listening to uid state changes, then there will
+ // be no changes to validateUids.
+ ams.mPendingUidChanges.addAll(pendingItemsForUids);
+ ams.dispatchUidsChanged();
+ assertEquals("No observers registered, so validateUids should be empty",
+ 0, ams.mValidateUids.size());
+
+ final IUidObserver observer = Mockito.mock(IUidObserver.Stub.class);
+ when(observer.asBinder()).thenReturn((IBinder) observer);
+ ams.registerUidObserver(observer, 0, 0, null);
+ // Verify that when observers are registered, then validateUids is correctly updated.
+ ams.mPendingUidChanges.addAll(pendingItemsForUids);
+ ams.dispatchUidsChanged();
+ for (int i = 0; i < pendingItemsForUids.size(); ++i) {
+ final UidRecord.ChangeItem item = pendingItemsForUids.get(i);
+ final UidRecord validateUidRecord = ams.mValidateUids.get(item.uid);
+ if (item.change == UidRecord.CHANGE_GONE || item.change == UidRecord.CHANGE_GONE_IDLE) {
+ assertNull("validateUidRecord should be null since the change is either "
+ + "CHANGE_GONE or CHANGE_GONE_IDLE", validateUidRecord);
+ } else {
+ assertNotNull("validateUidRecord should not be null since the change is neither "
+ + "CHANGE_GONE nor CHANGE_GONE_IDLE", validateUidRecord);
+ assertEquals("processState: " + item.processState + " curProcState: "
+ + validateUidRecord.curProcState + " should have been equal",
+ item.processState, validateUidRecord.curProcState);
+ assertEquals("processState: " + item.processState + " setProcState: "
+ + validateUidRecord.curProcState + " should have been equal",
+ item.processState, validateUidRecord.setProcState);
+ if (item.change == UidRecord.CHANGE_IDLE) {
+ assertTrue("UidRecord.idle should be updated to true for CHANGE_IDLE",
+ validateUidRecord.idle);
+ } else if (item.change == UidRecord.CHANGE_ACTIVE) {
+ assertFalse("UidRecord.idle should be updated to false for CHANGE_ACTIVE",
+ validateUidRecord.idle);
+ }
+ }
+ }
+
+ // Verify that when uid state changes to CHANGE_GONE or CHANGE_GONE_IDLE, then it
+ // will be removed from validateUids.
+ assertNotEquals("validateUids should not be empty", 0, ams.mValidateUids.size());
+ for (int i = 0; i < pendingItemsForUids.size(); ++i) {
+ final UidRecord.ChangeItem item = pendingItemsForUids.get(i);
+ // Assign CHANGE_GONE_IDLE to some items and CHANGE_GONE to the others, using even/odd
+ // distribution for this assignment.
+ item.change = (i % 2) == 0 ? UidRecord.CHANGE_GONE_IDLE : UidRecord.CHANGE_GONE;
+ }
+ ams.mPendingUidChanges.addAll(pendingItemsForUids);
+ ams.dispatchUidsChanged();
+ assertEquals("validateUids should be empty, validateUids: " + ams.mValidateUids,
+ 0, ams.mValidateUids.size());
+ }
}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index f969e80..8987ac1 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -85,7 +85,6 @@
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.atLeast;
@@ -99,6 +98,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
/**
* Tests for DevicePolicyManager( and DevicePolicyManagerService).
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
index 3806da6..e43786c 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockUtils.java
@@ -29,6 +29,7 @@
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.mockito.Mockito;
+import org.mockito.hamcrest.MockitoHamcrest;
public class MockUtils {
private MockUtils() {
@@ -47,7 +48,7 @@
description.appendText("UserHandle: user-id= \"" + userId + "\"");
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
public static Intent checkIntentComponent(final ComponentName component) {
@@ -63,7 +64,7 @@
description.appendText("Intent: component=\"" + component + "\"");
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
public static Intent checkIntentAction(final String action) {
@@ -79,7 +80,7 @@
description.appendText("Intent: action=\"" + action + "\"");
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
public static Intent checkIntent(final Intent intent) {
@@ -94,7 +95,7 @@
description.appendText(intent.toString());
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
public static Bundle checkUserRestrictions(String... keys) {
@@ -111,7 +112,7 @@
description.appendText("User restrictions=" + getRestrictionsAsString(expected));
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
private static String getRestrictionsAsString(Bundle b) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 1b59d72..b410400 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -2119,7 +2119,7 @@
protected void makeCallerForeground() {
try {
mService.mUidObserver.onUidStateChanged(
- mInjectedCallingUid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ mInjectedCallingUid, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
@@ -2128,7 +2128,7 @@
protected void makeCallerBackground() {
try {
mService.mUidObserver.onUidStateChanged(
- mInjectedCallingUid, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ mInjectedCallingUid, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
} catch (RemoteException e) {
e.rethrowAsRuntimeException();
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index 900da09..7c5eb07 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -1640,7 +1640,7 @@
// State changed, but not foreground, so no resetting.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
@@ -1664,7 +1664,7 @@
// State changed, package1 foreground, reset.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
});
@@ -1684,16 +1684,16 @@
MoreAsserts.assertNotEqual(3, mManager.getRemainingCallCount());
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_1, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
mInjectedCurrentTimeMillis++;
// Different app comes to foreground briefly, and goes back to background.
// Now, make sure package 2's counter is reset, even in this case.
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1724,9 +1724,9 @@
});
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
mService.mUidObserver.onUidStateChanged(
- CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ CALLING_UID_2, ActivityManager.PROCESS_STATE_TOP_SLEEPING, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
@@ -1753,7 +1753,7 @@
// Now, also try calling some APIs and make sure foreground apps don't get throttled.
mService.mUidObserver.onUidStateChanged(
UserHandle.getUid(USER_10, CALLING_UID_1),
- ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertEquals(3, mManager.getRemainingCallCount());
assertFalse(mManager.isRateLimitingActive());
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
index fa0bd39..72fb78e 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -61,7 +61,6 @@
@Before
public void setup() {
-
mUser0 = 0;
mUser1 = 1;
@@ -352,6 +351,15 @@
assertNull(pui);
}
+ @Test
+ public void testNotifyFrameworkLoad() {
+ String frameworkDex = "/system/framework/com.android.location.provider.jar";
+ // Load a dex file from framework.
+ notifyDexLoad(mFooUser0, Arrays.asList(frameworkDex), mUser0);
+ // The dex file should not be recognized as a package.
+ assertNull(mDexManager.getPackageUseInfo(frameworkDex));
+ }
+
private void assertSecondaryUse(TestData testData, PackageUseInfo pui,
List<String> secondaries, boolean isUsedByOtherApps, int ownerUserId) {
for (String dex : secondaries) {
diff --git a/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java b/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
index 1de6348..4d5f783 100644
--- a/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/AccessibilityShortcutControllerTest.java
@@ -21,9 +21,11 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.os.Handler;
+import android.os.Vibrator;
import android.provider.Settings;
import android.support.test.runner.AndroidJUnit4;
@@ -45,8 +47,8 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.mockito.internal.util.reflection.Whitebox;
+import java.lang.reflect.Field;
import java.util.Collections;
import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN;
@@ -54,6 +56,7 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.AdditionalMatchers.aryEq;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
@@ -67,6 +70,11 @@
@RunWith(AndroidJUnit4.class)
public class AccessibilityShortcutControllerTest {
private static final String SERVICE_NAME_STRING = "fake.package/fake.service.name";
+ private static final long VIBRATOR_PATTERN_1 = 100L;
+ private static final long VIBRATOR_PATTERN_2 = 150L;
+ private static final int[] VIBRATOR_PATTERN_INT = {(int) VIBRATOR_PATTERN_1,
+ (int) VIBRATOR_PATTERN_2};
+ private static final long[] VIBRATOR_PATTERN_LONG = {VIBRATOR_PATTERN_1, VIBRATOR_PATTERN_2};
private @Mock Context mContext;
private @Mock FrameworkObjectProvider mFrameworkObjectProvider;
@@ -77,6 +85,8 @@
private @Mock AccessibilityServiceInfo mServiceInfo;
private @Mock Resources mResources;
private @Mock Toast mToast;
+ private @Mock Vibrator mVibrator;
+ private @Mock ApplicationInfo mApplicationInfo;
private MockContentResolver mContentResolver;
private WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams();
@@ -85,10 +95,15 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ when(mVibrator.hasVibrator()).thenReturn(true);
+
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+ when(mContext.getSystemService(Context.VIBRATOR_SERVICE)).thenReturn(mVibrator);
+
mContentResolver = new MockContentResolver(mContext);
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
when(mContext.getContentResolver()).thenReturn(mContentResolver);
- when(mContext.getResources()).thenReturn(mResources);
when(mAccessibilityManagerService.getInstalledAccessibilityServiceList(anyInt()))
.thenReturn(Collections.singletonList(mServiceInfo));
@@ -104,6 +119,8 @@
.thenReturn(mToast);
when(mResources.getString(anyInt())).thenReturn("Howdy %s");
+ when(mResources.getIntArray(anyInt())).thenReturn(VIBRATOR_PATTERN_INT);
+
ResolveInfo resolveInfo = mock(ResolveInfo.class);
when(resolveInfo.loadLabel(anyObject())).thenReturn("Service name");
when(mServiceInfo.getResolveInfo()).thenReturn(resolveInfo);
@@ -124,7 +141,15 @@
when(mToast.getWindowParams()).thenReturn(mLayoutParams);
Window window = mock(Window.class);
- Whitebox.setInternalState(window, "mWindowAttributes", new WindowManager.LayoutParams());
+ // Initialize the mWindowAttributes field which was not properly initialized during mock
+ // creation.
+ try {
+ Field field = Window.class.getDeclaredField("mWindowAttributes");
+ field.setAccessible(true);
+ field.set(window, new WindowManager.LayoutParams());
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to set mWindowAttributes", e);
+ }
when(mAlertDialog.getWindow()).thenReturn(window);
}
@@ -163,6 +188,14 @@
}
@Test
+ public void testOnAccessibilityShortcut_vibrates() {
+ configureShortcutEnabled();
+ AccessibilityShortcutController accessibilityShortcutController = getController();
+ accessibilityShortcutController.performAccessibilityShortcut();
+ verify(mVibrator).vibrate(aryEq(VIBRATOR_PATTERN_LONG), eq(-1), anyObject());
+ }
+
+ @Test
public void testOnAccessibilityShortcut_firstTime_showsWarningDialog()
throws Exception {
configureShortcutEnabled();
diff --git a/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java b/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java
index e1dda51..d18457b 100644
--- a/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java
@@ -66,16 +66,15 @@
import com.android.server.SystemService;
import com.android.server.retaildemo.RetailDemoModeService.Injector;
-import org.hamcrest.Description;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.compat.ArgumentMatcher;
import java.io.File;
import java.util.concurrent.CountDownLatch;
@@ -283,7 +282,7 @@
}
@Override
- public boolean matches(Object argument) {
+ public boolean matchesObject(Object argument) {
if (argument instanceof Intent) {
return ((Intent) argument).filterEquals(mIntent);
}
@@ -291,8 +290,8 @@
}
@Override
- public void describeTo(Description description) {
- description.appendText("Expected: " + mIntent);
+ public String toString() {
+ return "Expected: " + mIntent;
}
}
diff --git a/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
index 8cf7c8a..3cdf109 100644
--- a/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java
@@ -28,6 +28,9 @@
import android.os.UserManager;
import android.os.storage.VolumeInfo;
import android.test.AndroidTestCase;
+import android.util.ArrayMap;
+import android.util.Log;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,12 +43,14 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;
@@ -57,24 +62,29 @@
@Mock private PackageManager mPm;
@Mock private UserManager mUm;
@Mock private StorageStatsManager mSsm;
- private List<ApplicationInfo> mApps;
private List<UserInfo> mUsers;
+ private Map<Integer, List<ApplicationInfo>> mUserApps;
@Before
public void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
- mApps = new ArrayList<>();
when(mContext.getPackageManager()).thenReturn(mPm);
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUm);
when(mContext.getSystemService(Context.STORAGE_STATS_SERVICE)).thenReturn(mSsm);
// Set up the app list.
- when(mPm.getInstalledApplications(anyInt())).thenReturn(mApps);
+ doAnswer((InvocationOnMock invocation) -> {
+ Integer userId = (Integer) invocation.getArguments()[1];
+ return mUserApps.get(userId);
+ }).when(mPm).getInstalledApplicationsAsUser(anyInt(), anyInt());
// Set up the user list with a single user (0).
mUsers = new ArrayList<>();
mUsers.add(new UserInfo(0, "", 0));
+
+ mUserApps = new ArrayMap<>();
+ mUserApps.put(0, new ArrayList<>());
when(mUm.getUsers()).thenReturn(mUsers);
}
@@ -89,7 +99,7 @@
@Test
public void testAppOnExternalVolume() throws Exception {
- addApplication("com.test.app", "differentuuid");
+ addApplication("com.test.app", "differentuuid", 0);
VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null);
volume.fsUuid = "testuuid";
AppCollector collector = new AppCollector(mContext, volume);
@@ -99,7 +109,7 @@
@Test
public void testOneValidApp() throws Exception {
- addApplication("com.test.app", "testuuid");
+ addApplication("com.test.app", "testuuid", 0);
VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null);
volume.fsUuid = "testuuid";
AppCollector collector = new AppCollector(mContext, volume);
@@ -112,11 +122,9 @@
@Test
public void testMultipleUsersOneApp() throws Exception {
- addApplication("com.test.app", "testuuid");
- ApplicationInfo otherUsersApp = new ApplicationInfo();
- otherUsersApp.packageName = "com.test.app";
- otherUsersApp.volumeUuid = "testuuid";
- otherUsersApp.uid = 1;
+ addApplication("com.test.app", "testuuid", 0);
+ mUserApps.put(1, new ArrayList<>());
+ addApplication("com.test.app", "testuuid", 1);
mUsers.add(new UserInfo(1, "", 0));
VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null);
@@ -138,11 +146,28 @@
AppCollector collector = new AppCollector(mContext, null);
}
- private void addApplication(String packageName, String uuid) {
+ @Test
+ public void testAppNotFoundDoesntCauseCrash() throws Exception {
+ VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null);
+ addApplication("com.test.app", "uuid", 0);
+ mUsers.add(new UserInfo(1, "", 0));
+ mUserApps.put(1, new ArrayList<>());
+ AppCollector collector = new AppCollector(mContext, volume);
+ when(mSsm.queryStatsForPackage(anyString(), anyString(), any(UserHandle.class))).thenThrow(
+ new IllegalStateException());
+
+ assertThat(collector.getPackageStats(TIMEOUT)).isEmpty();
+ }
+
+ private void addApplication(String packageName, String uuid, int userId) {
ApplicationInfo info = new ApplicationInfo();
info.packageName = packageName;
info.volumeUuid = uuid;
- mApps.add(info);
+ List<ApplicationInfo> userApps = mUserApps.get(userId);
+ if (userApps == null) {
+ userApps = new ArrayList<>();
+ mUserApps.put(userId, userApps);
+ }
+ userApps.add(info);
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
index e4b74eb..925f414 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
@@ -35,14 +35,12 @@
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
-import org.hamcrest.Description;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.Matchers;
-import org.mockito.ArgumentMatcher;
+import org.mockito.compat.ArgumentMatcher;
import java.util.concurrent.CountDownLatch;
@@ -149,14 +147,13 @@
}
@Override
- public boolean matches(Object p) {
+ public boolean matchesObject(Object p) {
return ((PackageInfo) p).packageName.equals(mPackageName);
}
- // Provide a more useful description in case of mismatch
@Override
- public void describeTo (Description description) {
- description.appendText(String.format("PackageInfo with name '%s'", mPackageName));
+ public String toString() {
+ return String.format("PackageInfo with name '%s'", mPackageName);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index e15d40e..9f50a2c 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -112,7 +112,7 @@
appWindowToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null,
sDisplayContent.getDisplayId());
- assertEquals(SCREEN_ORIENTATION_LANDSCAPE, sWm.mLastOrientation);
+ assertEquals(SCREEN_ORIENTATION_LANDSCAPE, sDisplayContent.getLastOrientation());
appWindow.resizeReported = false;
// Update the orientation to perform 180 degree rotation and check that resize was reported.
@@ -120,7 +120,7 @@
sWm.updateOrientationFromAppTokens(sDisplayContent.getOverrideConfiguration(), null,
sDisplayContent.getDisplayId());
sWm.mRoot.performSurfacePlacement(false /* recoveringMemory */);
- assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, sWm.mLastOrientation);
+ assertEquals(SCREEN_ORIENTATION_REVERSE_LANDSCAPE, sDisplayContent.getLastOrientation());
assertTrue(appWindow.resizeReported);
appWindow.removeImmediately();
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index e589bc7..3868242 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -22,7 +22,6 @@
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
@@ -147,7 +146,6 @@
final WindowState appWin = createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin");
appWin.setHasSurface(true);
assertTrue(appWin.canBeImeTarget());
- sWm.mInputMethodTargetCandidate = appWin.mClient.asBinder();
WindowState imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
assertEquals(appWin, imeTarget);
@@ -158,20 +156,6 @@
assertTrue(childWin.canBeImeTarget());
imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
assertEquals(childWin, imeTarget);
-
- final WindowState appWin2 =
- createWindow(null, TYPE_APPLICATION, sDisplayContent, "appWin2");
- appWin2.setHasSurface(true);
- assertTrue(appWin2.canBeImeTarget());
- // Verify that the IME target isn't adjusted since mInputMethodTargetCandidate didn't change
- // to the new app.
- imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
- assertNotEquals(appWin2, imeTarget);
-
- sWm.mInputMethodTargetCandidate = appWin2.mClient.asBinder();
- // Verify app is not IME target since its token is set as a candidate.
- imeTarget = sDisplayContent.computeImeTarget(false /* updateImeTarget */);
- assertEquals(appWin2, imeTarget);
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index c8b73f1..0971bb6 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -82,7 +82,7 @@
final ActivityManagerInternal am =
LocalServices.getService(ActivityManagerInternal.class);
doAnswer((InvocationOnMock invocationOnMock) -> {
- final Runnable runnable = invocationOnMock.getArgumentAt(0, Runnable.class);
+ final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
if (runnable != null) {
runnable.run();
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 18c48b7..911050a 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -69,6 +69,7 @@
class WindowTestsBase {
static WindowManagerService sWm = null;
static TestWindowManagerPolicy sPolicy = null;
+ private final static IWindow sIWindow = new TestIWindow();
private final static Session sMockSession = mock(Session.class);
private static int sNextDisplayId = Display.DEFAULT_DISPLAY + 1;
static int sNextStackId = FIRST_DYNAMIC_STACK_ID;
@@ -147,7 +148,6 @@
}
sWm.mInputMethodTarget = null;
- sWm.mInputMethodTargetCandidate = null;
}
private static WindowState createCommonWindow(WindowState parent, int type, String name) {
@@ -222,12 +222,11 @@
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
attrs.setTitle(name);
- final WindowState w = new WindowState(sWm, sMockSession, new TestIWindow(), token, parent,
- OP_NONE, 0, attrs, 0, 0, ownerCanAddInternalSystemWindow);
+ final WindowState w = new WindowState(sWm, sMockSession, sIWindow, token, parent, OP_NONE,
+ 0, attrs, 0, 0, ownerCanAddInternalSystemWindow);
// TODO: Probably better to make this call in the WindowState ctor to avoid errors with
// adding it to the token...
token.addWindow(w);
- sWm.mWindowMap.put(w.mClient.asBinder(), w);
return w;
}
@@ -455,9 +454,8 @@
boolean resizeReported;
TestWindowState(WindowManager.LayoutParams attrs, WindowToken token) {
- super(sWm, sMockSession, new TestIWindow(), token, null, OP_NONE, 0, attrs, 0, 0,
+ super(sWm, sMockSession, sIWindow, token, null, OP_NONE, 0, attrs, 0, 0,
false /* ownerCanAddInternalSystemWindow */);
- sWm.mWindowMap.put(mClient.asBinder(), this);
}
@Override
diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
index fd335c3..f2bae4c 100644
--- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
+++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java
@@ -59,6 +59,7 @@
import org.json.JSONObject;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
+import org.mockito.hamcrest.MockitoHamcrest;
import java.io.BufferedReader;
import java.io.File;
@@ -672,7 +673,7 @@
d.appendText(description);
}
};
- return Mockito.argThat(m);
+ return MockitoHamcrest.argThat(m);
}
public static List<ShortcutInfo> checkShortcutIds(String... ids) {
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 89e68a6..ebd4b01 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -28,6 +28,7 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageStats;
import android.content.pm.UserInfo;
+import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
@@ -43,6 +44,7 @@
import android.os.storage.VolumeInfo;
import android.provider.Settings;
import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -56,10 +58,12 @@
import com.android.server.storage.CacheQuotaStrategy;
import java.io.IOException;
+import java.util.Map;
public class StorageStatsService extends IStorageStatsManager.Stub {
private static final String TAG = "StorageStatsService";
+ private static final String PROP_DISABLE_QUOTA = "fw.disable_quota";
private static final String PROP_VERIFY_STORAGE = "fw.verify_storage";
private static final long DELAY_IN_MILLIS = 30 * DateUtils.SECOND_IN_MILLIS;
@@ -83,6 +87,7 @@
private final UserManager mUser;
private final PackageManager mPackage;
private final StorageManager mStorage;
+ private final Map<String, Map<Integer, Long>> mCacheQuotas;
private final Installer mInstaller;
private final H mHandler;
@@ -93,6 +98,7 @@
mUser = Preconditions.checkNotNull(context.getSystemService(UserManager.class));
mPackage = Preconditions.checkNotNull(context.getPackageManager());
mStorage = Preconditions.checkNotNull(context.getSystemService(StorageManager.class));
+ mCacheQuotas = new ArrayMap<>();
mInstaller = new Installer(context);
mInstaller.onStart();
@@ -177,6 +183,21 @@
}
@Override
+ public long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ if (mCacheQuotas.containsKey(volumeUuid)) {
+ // TODO: Change to SparseLongArray.
+ Map<Integer, Long> uidMap = mCacheQuotas.get(volumeUuid);
+ if (uidMap.containsKey(uid)) {
+ return uidMap.get(uid);
+ }
+ }
+
+ return 64 * TrafficStats.MB_IN_BYTES;
+ }
+
+ @Override
public StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId,
String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
@@ -222,7 +243,7 @@
}
final int userId = UserHandle.getUserId(uid);
- final int appId = UserHandle.getUserId(uid);
+ final int appId = UserHandle.getAppId(uid);
final String[] packageNames = mPackage.getPackagesForUid(uid);
final long[] ceDataInodes = new long[packageNames.length];
@@ -239,7 +260,7 @@
final PackageStats stats = new PackageStats(TAG);
try {
- mInstaller.getAppSize(volumeUuid, packageNames, userId, Installer.FLAG_USE_QUOTA,
+ mInstaller.getAppSize(volumeUuid, packageNames, userId, getDefaultFlags(),
appId, ceDataInodes, codePaths, stats);
if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
@@ -272,7 +293,7 @@
final PackageStats stats = new PackageStats(TAG);
try {
- mInstaller.getUserSize(volumeUuid, userId, Installer.FLAG_USE_QUOTA, appIds, stats);
+ mInstaller.getUserSize(volumeUuid, userId, getDefaultFlags(), appIds, stats);
if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
final PackageStats manualStats = new PackageStats(TAG);
@@ -296,7 +317,7 @@
final long[] stats;
try {
- stats = mInstaller.getExternalSize(volumeUuid, userId, Installer.FLAG_USE_QUOTA);
+ stats = mInstaller.getExternalSize(volumeUuid, userId, getDefaultFlags());
if (SystemProperties.getBoolean(PROP_VERIFY_STORAGE, false)) {
final long[] manualStats = mInstaller.getExternalSize(volumeUuid, userId, 0);
@@ -314,6 +335,14 @@
return res;
}
+ private static int getDefaultFlags() {
+ if (SystemProperties.getBoolean(PROP_DISABLE_QUOTA, false)) {
+ return 0;
+ } else {
+ return Installer.FLAG_USE_QUOTA;
+ }
+ }
+
private static void checkEquals(String msg, long[] a, long[] b) {
for (int i = 0; i < a.length; i++) {
checkEquals(msg + "[" + i + "]", a[i], b[i]);
@@ -424,7 +453,7 @@
private CacheQuotaStrategy getInitializedStrategy() {
UsageStatsManagerInternal usageStatsManager =
LocalServices.getService(UsageStatsManagerInternal.class);
- return new CacheQuotaStrategy(mContext, usageStatsManager, mInstaller);
+ return new CacheQuotaStrategy(mContext, usageStatsManager, mInstaller, mCacheQuotas);
}
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 3c7ee43..7be2b0f 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -342,7 +342,7 @@
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState) {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
synchronized (mUidToKernelCounter) {
final int oldCounter = mUidToKernelCounter.get(uid, 0);
@@ -364,7 +364,7 @@
@Override
public void onUidGone(int uid, boolean disabled) throws RemoteException {
- onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT);
+ onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0);
}
@Override
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index a17676a..4178f4d 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -33,6 +33,7 @@
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
+import android.os.BatteryManager;
import android.os.FileUtils;
import android.os.Handler;
import android.os.Looper;
@@ -122,6 +123,7 @@
private static final int MSG_UPDATE_USER_RESTRICTIONS = 6;
private static final int MSG_UPDATE_HOST_STATE = 7;
private static final int MSG_ACCESSORY_MODE_ENTER_TIMEOUT = 8;
+ private static final int MSG_UPDATE_CHARGING_STATE = 9;
private static final int AUDIO_MODE_SOURCE = 1;
@@ -203,6 +205,15 @@
}
};
+ private final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
+ boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
+ mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging);
+ }
+ };
+
public UsbDeviceManager(Context context, UsbAlsaManager alsaManager,
UsbSettingsManager settingsManager) {
mContext = context;
@@ -229,6 +240,8 @@
}
mContext.registerReceiver(mHostReceiver,
new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED));
+ mContext.registerReceiver(mChargingReceiver,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
private UsbProfileGroupSettingsManager getCurrentSettings() {
@@ -358,6 +371,7 @@
private int mUsbNotificationId;
private boolean mAdbNotificationShown;
private int mCurrentUser = UserHandle.USER_NULL;
+ private boolean mUsbCharging;
public UsbHandler(Looper looper) {
super(looper);
@@ -456,7 +470,10 @@
args.argi2 = sourcePower ? 1 :0;
args.argi3 = sinkPower ? 1 :0;
- obtainMessage(MSG_UPDATE_HOST_STATE, args).sendToTarget();
+ removeMessages(MSG_UPDATE_HOST_STATE);
+ Message msg = obtainMessage(MSG_UPDATE_HOST_STATE, args);
+ // debounce rapid transitions of connect/disconnect on type-c ports
+ sendMessageDelayed(msg, UPDATE_DELAY);
}
private boolean waitForState(String state) {
@@ -759,7 +776,8 @@
}
mMidiEnabled = enabled;
}
- mUsbAlsaManager.setPeripheralMidiState(mMidiEnabled && mConfigured, mMidiCard, mMidiDevice);
+ mUsbAlsaManager.setPeripheralMidiState(
+ mMidiEnabled && mConfigured, mMidiCard, mMidiDevice);
}
@Override
@@ -799,6 +817,10 @@
mPendingBootBroadcast = true;
}
break;
+ case MSG_UPDATE_CHARGING_STATE:
+ mUsbCharging = (msg.arg1 == 1);
+ updateUsbNotification();
+ break;
case MSG_ENABLE_ADB:
setAdbEnabled(msg.arg1 == 1);
break;
@@ -892,7 +914,7 @@
}
} else if (mSourcePower) {
id = com.android.internal.R.string.usb_supplying_notification_title;
- } else if (mHostConnected && mSinkPower) {
+ } else if (mHostConnected && mSinkPower && mUsbCharging) {
id = com.android.internal.R.string.usb_charging_notification_title;
}
if (id != mUsbNotificationId) {
@@ -998,6 +1020,7 @@
pw.println(" mHostConnected: " + mHostConnected);
pw.println(" mSourcePower: " + mSourcePower);
pw.println(" mSinkPower: " + mSinkPower);
+ pw.println(" mUsbCharging: " + mUsbCharging);
try {
pw.println(" Kernel state: "
+ FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim());
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index a923fc3..86f4a01 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -41,6 +41,7 @@
import android.util.Log;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.FgThread;
@@ -78,7 +79,7 @@
private final Context mContext;
// Proxy object for the usb hal daemon.
- // @GuardedBy("mLock")
+ @GuardedBy("mLock")
private IUsb mProxy = null;
// Callback when the UsbPort status is changed by the kernel.
@@ -92,7 +93,7 @@
private static final int USB_HAL_DEATH_COOKIE = 1000;
// Usb hal service name.
- private static String sSERVICENAME = "usb_hal";
+ private static String sServiceName = "usb_hal";
// Used as the key while sending the bundle to Main thread.
private static final String PORT_INFO = "port_info";
@@ -119,13 +120,14 @@
try {
boolean ret = IServiceManager.getService()
.registerForNotifications("android.hardware.usb@1.0::IUsb",
- "", mServiceNotification);
+ "", mServiceNotification);
if (!ret) {
- logAndPrint(Log.ERROR, null, "Failed to register service start notification");
+ logAndPrint(Log.ERROR, null,
+ "Failed to register service start notification");
}
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, null, "Failed to register service start notification");
- Thread.dumpStack();
+ logAndPrintException(null,
+ "Failed to register service start notification", e);
return;
}
connectToProxy(null);
@@ -136,9 +138,8 @@
try {
mProxy.queryPortStatus();
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, null,
- "ServiceStart: Failed to query port status");
- Thread.dumpStack();
+ logAndPrintException(null,
+ "ServiceStart: Failed to query port status", e);
}
}
mSystemReady = true;
@@ -234,9 +235,9 @@
RawPortInfo sim = mSimulatedPorts.get(portId);
if (sim != null) {
// Change simulated state.
- sim.mCurrentMode = newMode;
- sim.mCurrentPowerRole = newPowerRole;
- sim.mCurrentDataRole = newDataRole;
+ sim.currentMode = newMode;
+ sim.currentPowerRole = newPowerRole;
+ sim.currentDataRole = newDataRole;
updatePortsLocked(pw, null);
} else if (mProxy != null) {
if (currentMode != newMode) {
@@ -248,18 +249,17 @@
// directly instead.
logAndPrint(Log.ERROR, pw, "Trying to set the USB port mode: "
- + "portId=" + portId
- + ", newMode=" + UsbPort.modeToString(newMode));
+ + "portId=" + portId
+ + ", newMode=" + UsbPort.modeToString(newMode));
PortRole newRole = new PortRole();
newRole.type = PortRoleType.MODE;
newRole.role = newMode;
try {
mProxy.switchRole(portId, newRole);
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, pw, "Failed to set the USB port mode: "
+ logAndPrintException(pw, "Failed to set the USB port mode: "
+ "portId=" + portId
- + ", newMode=" + UsbPort.modeToString(newRole.role));
- Thread.dumpStack();
+ + ", newMode=" + UsbPort.modeToString(newRole.role), e);
return;
}
} else {
@@ -271,10 +271,11 @@
try {
mProxy.switchRole(portId, newRole);
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, pw, "Failed to set the USB port power role: "
- + "portId=" + portId
- + ", newPowerRole=" + UsbPort.powerRoleToString(newRole.role));
- Thread.dumpStack();
+ logAndPrintException(pw, "Failed to set the USB port power role: "
+ + "portId=" + portId
+ + ", newPowerRole=" + UsbPort.powerRoleToString
+ (newRole.role),
+ e);
return;
}
}
@@ -285,10 +286,11 @@
try {
mProxy.switchRole(portId, newRole);
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, pw, "Failed to set the USB port data role: "
- + "portId=" + portId
- + ", newDataRole=" + UsbPort.dataRoleToString(newRole.role));
- Thread.dumpStack();
+ logAndPrintException(pw, "Failed to set the USB port data role: "
+ + "portId=" + portId
+ + ", newDataRole=" + UsbPort.dataRoleToString(newRole
+ .role),
+ e);
return;
}
}
@@ -328,7 +330,7 @@
return;
}
- if ((portInfo.mSupportedModes & mode) == 0) {
+ if ((portInfo.supportedModes & mode) == 0) {
pw.println("Simulated port does not support mode: " + UsbPort.modeToString(mode));
return;
}
@@ -340,12 +342,12 @@
+ ", canChangePowerRole=" + canChangePowerRole
+ ", dataRole=" + UsbPort.dataRoleToString(dataRole)
+ ", canChangeDataRole=" + canChangeDataRole);
- portInfo.mCurrentMode = mode;
- portInfo.mCanChangeMode = canChangeMode;
- portInfo.mCurrentPowerRole = powerRole;
- portInfo.mCanChangePowerRole = canChangePowerRole;
- portInfo.mCurrentDataRole = dataRole;
- portInfo.mCanChangeDataRole = canChangeDataRole;
+ portInfo.currentMode = mode;
+ portInfo.canChangeMode = canChangeMode;
+ portInfo.currentPowerRole = powerRole;
+ portInfo.canChangePowerRole = canChangePowerRole;
+ portInfo.currentDataRole = dataRole;
+ portInfo.canChangeDataRole = canChangeDataRole;
updatePortsLocked(pw, null);
}
}
@@ -359,12 +361,12 @@
}
pw.println("Disconnecting simulated port: portId=" + portId);
- portInfo.mCurrentMode = 0;
- portInfo.mCanChangeMode = false;
- portInfo.mCurrentPowerRole = 0;
- portInfo.mCanChangePowerRole = false;
- portInfo.mCurrentDataRole = 0;
- portInfo.mCanChangeDataRole = false;
+ portInfo.currentMode = 0;
+ portInfo.canChangeMode = false;
+ portInfo.currentPowerRole = 0;
+ portInfo.canChangePowerRole = false;
+ portInfo.currentDataRole = 0;
+ portInfo.canChangeDataRole = false;
updatePortsLocked(pw, null);
}
}
@@ -425,7 +427,9 @@
}
public void notifyPortStatusChange(ArrayList<PortStatus> currentPortStatus, int retval) {
- if (!portManager.mSystemReady) return;
+ if (!portManager.mSystemReady) {
+ return;
+ }
if (retval != Status.SUCCESS) {
logAndPrint(Log.ERROR, pw, "port status enquiry failed");
@@ -490,21 +494,21 @@
private void connectToProxy(IndentingPrintWriter pw) {
synchronized (mLock) {
- if (mProxy != null) return;
+ if (mProxy != null) {
+ return;
+ }
try {
- mProxy = IUsb.getService(sSERVICENAME);
+ mProxy = IUsb.getService(sServiceName);
mProxy.linkToDeath(new DeathRecipient(pw), USB_HAL_DEATH_COOKIE);
mProxy.setCallback(mHALCallback);
mProxy.queryPortStatus();
} catch (NoSuchElementException e) {
- logAndPrint(Log.ERROR, pw, sSERVICENAME + " not found."
- + " Did the service fail to start?");
- Thread.dumpStack();
+ logAndPrintException(pw, sServiceName + " not found."
+ + " Did the service fail to start?", e);
} catch (RemoteException e) {
- logAndPrint(Log.ERROR, pw, sSERVICENAME
- + " connectToProxy: Service not responding");
- Thread.dumpStack();
+ logAndPrintException(pw, sServiceName
+ + " connectToProxy: Service not responding", e);
}
}
}
@@ -523,17 +527,17 @@
final int count = mSimulatedPorts.size();
for (int i = 0; i < count; i++) {
final RawPortInfo portInfo = mSimulatedPorts.valueAt(i);
- addOrUpdatePortLocked(portInfo.mPortId, portInfo.mSupportedModes,
- portInfo.mCurrentMode, portInfo.mCanChangeMode,
- portInfo.mCurrentPowerRole, portInfo.mCanChangePowerRole,
- portInfo.mCurrentDataRole, portInfo.mCanChangeDataRole, pw);
+ addOrUpdatePortLocked(portInfo.portId, portInfo.supportedModes,
+ portInfo.currentMode, portInfo.canChangeMode,
+ portInfo.currentPowerRole, portInfo.canChangePowerRole,
+ portInfo.currentDataRole, portInfo.canChangeDataRole, pw);
}
} else {
for (RawPortInfo currentPortInfo : newPortInfo) {
- addOrUpdatePortLocked(currentPortInfo.mPortId, currentPortInfo.mSupportedModes,
- currentPortInfo.mCurrentMode, currentPortInfo.mCanChangeMode,
- currentPortInfo.mCurrentPowerRole, currentPortInfo.mCanChangePowerRole,
- currentPortInfo.mCurrentDataRole, currentPortInfo.mCanChangeDataRole, pw);
+ addOrUpdatePortLocked(currentPortInfo.portId, currentPortInfo.supportedModes,
+ currentPortInfo.currentMode, currentPortInfo.canChangeMode,
+ currentPortInfo.currentPowerRole, currentPortInfo.canChangePowerRole,
+ currentPortInfo.currentDataRole, currentPortInfo.canChangeDataRole, pw);
}
}
@@ -562,18 +566,18 @@
// Must only be called by updatePortsLocked.
private void addOrUpdatePortLocked(String portId, int supportedModes,
- int currentMode, boolean canChangeMode,
- int currentPowerRole, boolean canChangePowerRole,
- int currentDataRole, boolean canChangeDataRole,
- IndentingPrintWriter pw) {
+ int currentMode, boolean canChangeMode,
+ int currentPowerRole, boolean canChangePowerRole,
+ int currentDataRole, boolean canChangeDataRole,
+ IndentingPrintWriter pw) {
// Only allow mode switch capability for dual role ports.
// Validate that the current mode matches the supported modes we expect.
if (supportedModes != UsbPort.MODE_DUAL) {
canChangeMode = false;
if (currentMode != 0 && currentMode != supportedModes) {
logAndPrint(Log.WARN, pw, "Ignoring inconsistent current mode from USB "
- + "port driver: supportedModes=" + UsbPort.modeToString(supportedModes)
- + ", currentMode=" + UsbPort.modeToString(currentMode));
+ + "port driver: supportedModes=" + UsbPort.modeToString(supportedModes)
+ + ", currentMode=" + UsbPort.modeToString(currentMode));
currentMode = 0;
}
}
@@ -588,8 +592,8 @@
// Can change both power and data role independently.
// Assume all combinations are possible.
supportedRoleCombinations |=
- COMBO_SOURCE_HOST | COMBO_SOURCE_DEVICE
- | COMBO_SINK_HOST | COMBO_SINK_DEVICE;
+ COMBO_SOURCE_HOST | COMBO_SOURCE_DEVICE
+ | COMBO_SINK_HOST | COMBO_SINK_DEVICE;
} else if (canChangePowerRole) {
// Can only change power role.
// Assume data role must remain at its current value.
@@ -617,24 +621,24 @@
if (portInfo == null) {
portInfo = new PortInfo(portId, supportedModes);
portInfo.setStatus(currentMode, canChangeMode,
- currentPowerRole, canChangePowerRole,
- currentDataRole, canChangeDataRole,
- supportedRoleCombinations);
+ currentPowerRole, canChangePowerRole,
+ currentDataRole, canChangeDataRole,
+ supportedRoleCombinations);
mPorts.put(portId, portInfo);
} else {
// Sanity check that ports aren't changing definition out from under us.
if (supportedModes != portInfo.mUsbPort.getSupportedModes()) {
logAndPrint(Log.WARN, pw, "Ignoring inconsistent list of supported modes from "
- + "USB port driver (should be immutable): "
- + "previous=" + UsbPort.modeToString(
- portInfo.mUsbPort.getSupportedModes())
- + ", current=" + UsbPort.modeToString(supportedModes));
+ + "USB port driver (should be immutable): "
+ + "previous=" + UsbPort.modeToString(
+ portInfo.mUsbPort.getSupportedModes())
+ + ", current=" + UsbPort.modeToString(supportedModes));
}
if (portInfo.setStatus(currentMode, canChangeMode,
- currentPowerRole, canChangePowerRole,
- currentDataRole, canChangeDataRole,
- supportedRoleCombinations)) {
+ currentPowerRole, canChangePowerRole,
+ currentDataRole, canChangeDataRole,
+ supportedRoleCombinations)) {
portInfo.mDisposition = PortInfo.DISPOSITION_CHANGED;
} else {
portInfo.mDisposition = PortInfo.DISPOSITION_READY;
@@ -661,7 +665,7 @@
final Intent intent = new Intent(UsbManager.ACTION_USB_PORT_CHANGED);
intent.addFlags(
Intent.FLAG_RECEIVER_FOREGROUND |
- Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
intent.putExtra(UsbManager.EXTRA_PORT, portInfo.mUsbPort);
intent.putExtra(UsbManager.EXTRA_PORT_STATUS, portInfo.mUsbPortStatus);
@@ -682,6 +686,13 @@
}
}
+ private static void logAndPrintException(IndentingPrintWriter pw, String msg, Exception e) {
+ Slog.e(TAG, msg, e);
+ if (pw != null) {
+ pw.println(msg + e);
+ }
+ }
+
private final Handler mHandler = new Handler(FgThread.get().getLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -730,7 +741,7 @@
|| mUsbPortStatus.getCurrentPowerRole() != currentPowerRole
|| mUsbPortStatus.getCurrentDataRole() != currentDataRole
|| mUsbPortStatus.getSupportedRoleCombinations()
- != supportedRoleCombinations) {
+ != supportedRoleCombinations) {
mUsbPortStatus = new UsbPortStatus(currentMode, currentPowerRole, currentDataRole,
supportedRoleCombinations);
return true;
@@ -752,32 +763,32 @@
* Values of the member variables mocked directly incase of emulation.
*/
private static final class RawPortInfo implements Parcelable {
- public final String mPortId;
- public final int mSupportedModes;
- public int mCurrentMode;
- public boolean mCanChangeMode;
- public int mCurrentPowerRole;
- public boolean mCanChangePowerRole;
- public int mCurrentDataRole;
- public boolean mCanChangeDataRole;
+ public final String portId;
+ public final int supportedModes;
+ public int currentMode;
+ public boolean canChangeMode;
+ public int currentPowerRole;
+ public boolean canChangePowerRole;
+ public int currentDataRole;
+ public boolean canChangeDataRole;
RawPortInfo(String portId, int supportedModes) {
- mPortId = portId;
- mSupportedModes = supportedModes;
+ this.portId = portId;
+ this.supportedModes = supportedModes;
}
RawPortInfo(String portId, int supportedModes,
- int currentMode, boolean canChangeMode,
- int currentPowerRole, boolean canChangePowerRole,
- int currentDataRole, boolean canChangeDataRole) {
- mPortId = portId;
- mSupportedModes = supportedModes;
- mCurrentMode = currentMode;
- mCanChangeMode = canChangeMode;
- mCurrentPowerRole = currentPowerRole;
- mCanChangePowerRole = canChangePowerRole;
- mCurrentDataRole = currentDataRole;
- mCanChangeDataRole = canChangeDataRole;
+ int currentMode, boolean canChangeMode,
+ int currentPowerRole, boolean canChangePowerRole,
+ int currentDataRole, boolean canChangeDataRole) {
+ this.portId = portId;
+ this.supportedModes = supportedModes;
+ this.currentMode = currentMode;
+ this.canChangeMode = canChangeMode;
+ this.currentPowerRole = currentPowerRole;
+ this.canChangePowerRole = canChangePowerRole;
+ this.currentDataRole = currentDataRole;
+ this.canChangeDataRole = canChangeDataRole;
}
@Override
@@ -787,37 +798,37 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mPortId);
- dest.writeInt(mSupportedModes);
- dest.writeInt(mCurrentMode);
- dest.writeByte((byte) (mCanChangeMode ? 1 : 0));
- dest.writeInt(mCurrentPowerRole);
- dest.writeByte((byte) (mCanChangePowerRole ? 1 : 0));
- dest.writeInt(mCurrentDataRole);
- dest.writeByte((byte) (mCanChangeDataRole ? 1 : 0));
+ dest.writeString(portId);
+ dest.writeInt(supportedModes);
+ dest.writeInt(currentMode);
+ dest.writeByte((byte) (canChangeMode ? 1 : 0));
+ dest.writeInt(currentPowerRole);
+ dest.writeByte((byte) (canChangePowerRole ? 1 : 0));
+ dest.writeInt(currentDataRole);
+ dest.writeByte((byte) (canChangeDataRole ? 1 : 0));
}
public static final Parcelable.Creator<RawPortInfo> CREATOR =
new Parcelable.Creator<RawPortInfo>() {
- @Override
- public RawPortInfo createFromParcel(Parcel in) {
- String id = in.readString();
- int supportedModes = in.readInt();
- int currentMode = in.readInt();
- boolean canChangeMode = in.readByte() != 0;
- int currentPowerRole = in.readInt();
- boolean canChangePowerRole = in.readByte() != 0;
- int currentDataRole = in.readInt();
- boolean canChangeDataRole = in.readByte() != 0;
- return new RawPortInfo(id, supportedModes, currentMode, canChangeMode,
- currentPowerRole, canChangePowerRole,
- currentDataRole, canChangeDataRole);
- }
+ @Override
+ public RawPortInfo createFromParcel(Parcel in) {
+ String id = in.readString();
+ int supportedModes = in.readInt();
+ int currentMode = in.readInt();
+ boolean canChangeMode = in.readByte() != 0;
+ int currentPowerRole = in.readInt();
+ boolean canChangePowerRole = in.readByte() != 0;
+ int currentDataRole = in.readInt();
+ boolean canChangeDataRole = in.readByte() != 0;
+ return new RawPortInfo(id, supportedModes, currentMode, canChangeMode,
+ currentPowerRole, canChangePowerRole,
+ currentDataRole, canChangeDataRole);
+ }
- @Override
- public RawPortInfo[] newArray(int size) {
- return new RawPortInfo[size];
- }
- };
+ @Override
+ public RawPortInfo[] newArray(int size) {
+ return new RawPortInfo[size];
+ }
+ };
}
}
diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java
index ced6627..6107895 100644
--- a/telecomm/java/android/telecom/Log.java
+++ b/telecomm/java/android/telecom/Log.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Build;
import android.telecom.Logging.EventManager;
import android.telecom.Logging.Session;
import android.telecom.Logging.SessionManager;
@@ -55,6 +56,7 @@
public static boolean ERROR = isLoggable(android.util.Log.ERROR);
private static final boolean FORCE_LOGGING = false; /* STOP SHIP if true */
+ private static final boolean USER_BUILD = Build.TYPE.equals("user");
// Used to synchronize singleton logging lazy initialization
private static final Object sSingletonSync = new Object();
@@ -404,7 +406,8 @@
/**
* Redact personally identifiable information for production users.
- * If we are running in verbose mode, return the original string, otherwise
+ * If we are running in verbose mode, return the original string,
+ * and return "****" if we are running on the user build, otherwise
* return a SHA-1 hash of the input string.
*/
public static String pii(Object pii) {
@@ -415,6 +418,11 @@
}
private static String secureHash(byte[] input) {
+ // Refrain from logging user personal information in user build.
+ if (USER_BUILD) {
+ return "****";
+ }
+
if (sMessageDigest != null) {
sMessageDigest.reset();
sMessageDigest.update(input);
diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java
index cd0a012..2a31e3a 100644
--- a/telephony/java/android/telephony/Rlog.java
+++ b/telephony/java/android/telephony/Rlog.java
@@ -16,6 +16,7 @@
package android.telephony;
+import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
@@ -32,6 +33,8 @@
*/
public final class Rlog {
+ private static final boolean USER_BUILD = Build.TYPE.equals("user");
+
private Rlog() {
}
@@ -125,10 +128,15 @@
/**
* Returns a secure hash (using the SHA1 algorithm) of the provided input.
*
- * @return the hash
+ * @return "****" if the build type is user, otherwise the hash
* @param input the bytes for which the secure hash should be computed.
*/
private static String secureHash(byte[] input) {
+ // Refrain from logging user personal information in user build.
+ if (USER_BUILD) {
+ return "****";
+ }
+
MessageDigest messageDigest;
try {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 92197d6..51b91f4 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -23,6 +23,7 @@
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.WorkerThread;
import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.app.PendingIntent;
@@ -1495,7 +1496,10 @@
/**
- * Returns the network specifier of the subscription ID pinned to the TelephonyManager.
+ * Returns the network specifier of the subscription ID pinned to the TelephonyManager. The
+ * network specifier is used by {@link
+ * android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to create a {@link
+ * android.net.NetworkRequest} that connects through the subscription.
*
* @see android.net.NetworkRequest.Builder#setNetworkSpecifier(String)
* @see #createForSubscriptionId(int)
@@ -1506,7 +1510,9 @@
}
/**
- * Returns the carrier config of the subscription ID pinned to the TelephonyManager.
+ * Returns the carrier config of the subscription ID pinned to the TelephonyManager. If an
+ * invalid subscription ID is pinned to the TelephonyManager, the returned config will contain
+ * default values.
*
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
@@ -1515,6 +1521,7 @@
* @see #createForSubscriptionId(int)
* @see #createForPhoneAccountHandle(PhoneAccountHandle)
*/
+ @WorkerThread
public PersistableBundle getCarrierConfig() {
CarrierConfigManager carrierConfigManager = mContext
.getSystemService(CarrierConfigManager.class);
@@ -2705,19 +2712,24 @@
/**
- * Returns the package responsible of processing visual voicemail for the phone account.
+ * Returns the package responsible of processing visual voicemail for the subscription ID pinned
+ * to the TelephonyManager. Returns {@code null} when there is no package responsible for
+ * processing visual voicemail for the subscription.
*
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
+ *
+ * @see #createForSubscriptionId(int)
+ * @see #createForPhoneAccountHandle(PhoneAccountHandle)
+ * @see VisualVoicemailService
*/
@Nullable
- public String getVisualVoicemailPackageName(PhoneAccountHandle phoneAccountHandle) {
+ public String getVisualVoicemailPackageName() {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony
- .getVisualVoicemailPackageName(mContext.getOpPackageName(),
- phoneAccountHandle);
+ .getVisualVoicemailPackageName(mContext.getOpPackageName(), mSubId);
}
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
diff --git a/telephony/java/android/telephony/VisualVoicemailSms.java b/telephony/java/android/telephony/VisualVoicemailSms.java
index 6235c10..1e6ea4b 100644
--- a/telephony/java/android/telephony/VisualVoicemailSms.java
+++ b/telephony/java/android/telephony/VisualVoicemailSms.java
@@ -63,7 +63,8 @@
/**
* The key-value pairs sent by the SMS, or {@code null} if the framework cannot parse the SMS as
- * voicemail but the carrier pattern indicates it is.
+ * voicemail but the carrier pattern indicates it is. The interpretation of the fields is
+ * carrier dependent.
*/
public Bundle getFields() {
return mFields;
diff --git a/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java b/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
index 9d19d08..56a8c62 100644
--- a/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
+++ b/telephony/java/android/telephony/VisualVoicemailSmsFilterSettings.java
@@ -16,7 +16,6 @@
package android.telephony;
import android.content.Context;
-import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -55,8 +54,17 @@
*/
public static final int DESTINATION_PORT_DATA_SMS = -2;
+ /**
+ * @hide
+ */
public static final String DEFAULT_CLIENT_PREFIX = "//VVM";
+ /**
+ * @hide
+ */
public static final List<String> DEFAULT_ORIGINATING_NUMBERS = Collections.emptyList();
+ /**
+ * @hide
+ */
public static final int DEFAULT_DESTINATION_PORT = DESTINATION_PORT_ANY;
/**
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index 5f3f773..c9c48dc 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -30,9 +30,9 @@
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.RawContacts;
import android.telephony.PhoneNumberUtils;
+import android.telephony.Rlog;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.telephony.Rlog;
import android.util.Log;
import com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
@@ -595,7 +595,8 @@
pn = util.parse(number, countryIso);
if (VDBG) Rlog.v(TAG, "- parsed number: " + pn);
} catch (NumberParseException e) {
- Rlog.w(TAG, "getGeoDescription: NumberParseException for incoming number '" + number + "'");
+ Rlog.w(TAG, "getGeoDescription: NumberParseException for incoming number '"
+ + Rlog.pii(TAG, number) + "'");
}
if (pn != null) {
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 220ea14..40d1dbb 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -504,8 +504,7 @@
boolean isVisualVoicemailEnabled(String callingPackage,
in PhoneAccountHandle accountHandle);
- String getVisualVoicemailPackageName(String callingPackage,
- in PhoneAccountHandle phoneAccountHandle);
+ String getVisualVoicemailPackageName(String callingPackage, int subId);
// Not oneway, caller needs to make sure the vaule is set before receiving a SMS
void enableVisualVoicemailSmsFilter(String callingPackage, int subId,
diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java
index 3f5ca84..da1d998 100644
--- a/test-runner/src/android/test/mock/MockContext.java
+++ b/test-runner/src/android/test/mock/MockContext.java
@@ -492,10 +492,22 @@
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
+ boolean visibleToInstantApps) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
throw new UnsupportedOperationException();
}
+ @Override
+ public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
+ String broadcastPermission, Handler scheduler, boolean visibleToInstantApps) {
+ throw new UnsupportedOperationException();
+ }
+
/** @hide */
@Override
public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
diff --git a/tests/net/java/android/net/ip/IpManagerTest.java b/tests/net/java/android/net/ip/IpManagerTest.java
new file mode 100644
index 0000000..025b017
--- /dev/null
+++ b/tests/net/java/android/net/ip/IpManagerTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.ip;
+
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.INetworkManagementService;
+import android.provider.Settings;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.R;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for IpManager.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class IpManagerTest {
+ private static final int DEFAULT_AVOIDBADWIFI_CONFIG_VALUE = 1;
+
+ @Mock private Context mContext;
+ @Mock private INetworkManagementService mNMService;
+ @Mock private Resources mResources;
+ private MockContentResolver mContentResolver;
+
+ @Before public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getInteger(R.integer.config_networkAvoidBadWifi))
+ .thenReturn(DEFAULT_AVOIDBADWIFI_CONFIG_VALUE);
+
+ mContentResolver = new MockContentResolver();
+ mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ when(mContext.getContentResolver()).thenReturn(mContentResolver);
+ }
+
+ @Test
+ public void testNullCallbackDoesNotThrow() throws Exception {
+ final IpManager ipm = new IpManager(mContext, "lo", null, mNMService);
+ }
+
+ @Test
+ public void testInvalidInterfaceDoesNotThrow() throws Exception {
+ final IpManager.Callback cb = new IpManager.Callback();
+ final IpManager ipm = new IpManager(mContext, "test_wlan0", cb, mNMService);
+ }
+}
diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
index 637eaa3..9e0f3213 100644
--- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -219,7 +219,7 @@
"time_ms: 0",
"transports: 0",
"connect_statistics <",
- " connect_blocking_count: 0",
+ " connect_blocking_count: 7",
" connect_count: 12",
" errnos_counters <",
" key: 1",
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index 881ac87..3330b1a 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -1513,6 +1513,21 @@
err = NO_ERROR;
}
+ if (mipmaps != NULL) {
+ ResourceDirIterator it(mipmaps, String8("mipmap"));
+ while ((err=it.next()) == NO_ERROR) {
+ err = postProcessImage(bundle, assets, &table, it.getFile());
+ if (err != NO_ERROR) {
+ hasErrors = true;
+ }
+ }
+
+ if (err < NO_ERROR) {
+ hasErrors = true;
+ }
+ err = NO_ERROR;
+ }
+
if (colors != NULL) {
ResourceDirIterator it(colors, String8("color"));
while ((err=it.next()) == NO_ERROR) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
index af47aeb..4914a48 100644
--- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java
@@ -75,14 +75,14 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static long nativeCreate(Bitmap androidBitmap, int shaderTileModeX,
- int shaderTileModeY) {
+ /*package*/ static long nativeCreate(long nativeMatrix, Bitmap androidBitmap,
+ int shaderTileModeX, int shaderTileModeY) {
Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(androidBitmap);
if (bitmap == null) {
return 0;
}
- BitmapShader_Delegate newDelegate = new BitmapShader_Delegate(
+ BitmapShader_Delegate newDelegate = new BitmapShader_Delegate(nativeMatrix,
bitmap.getImage(),
Shader_Delegate.getTileMode(shaderTileModeX),
Shader_Delegate.getTileMode(shaderTileModeY));
@@ -91,8 +91,9 @@
// ---- Private delegate/helper methods ----
- private BitmapShader_Delegate(BufferedImage image,
+ private BitmapShader_Delegate(long matrix, BufferedImage image,
TileMode tileModeX, TileMode tileModeY) {
+ super(matrix);
mJavaPaint = new BitmapShaderPaint(image, tileModeX, tileModeY);
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
index a459734..ab37968 100644
--- a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java
@@ -63,14 +63,17 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static long nativeCreate(long native_shaderA, long native_shaderB,
- int native_mode) {
+ /*package*/ static long nativeCreate(long nativeMatrix, long native_shaderA,
+ long native_shaderB, int native_mode) {
// FIXME not supported yet.
- ComposeShader_Delegate newDelegate = new ComposeShader_Delegate();
+ ComposeShader_Delegate newDelegate = new ComposeShader_Delegate(nativeMatrix);
return sManager.addNewDelegate(newDelegate);
}
// ---- Private delegate/helper methods ----
+ private ComposeShader_Delegate(long nativeMatrix) {
+ super(nativeMatrix);
+ }
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
index 7475c22..6a89d8f 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Gradient_Delegate.java
@@ -41,12 +41,14 @@
/**
* Creates the base shader and do some basic test on the parameters.
*
+ * @param nativeMatrix reference to the shader's native transformation matrix
* @param colors The colors to be distributed along the gradient line
* @param positions May be null. The relative positions [0..1] of each
* corresponding color in the colors array. If this is null, the
* the colors are distributed evenly along the gradient line.
*/
- protected Gradient_Delegate(int colors[], float positions[]) {
+ protected Gradient_Delegate(long nativeMatrix, int colors[], float positions[]) {
+ super(nativeMatrix);
if (colors.length < 2) {
throw new IllegalArgumentException("needs >= 2 number of colors");
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
index cbc30c3..cd4393a 100644
--- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java
@@ -56,21 +56,20 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static long nativeCreate1(LinearGradient thisGradient,
+ /*package*/ static long nativeCreate1(LinearGradient thisGradient, long matrix,
float x0, float y0, float x1, float y1,
int colors[], float positions[], int tileMode) {
- LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1,
- colors, positions, Shader_Delegate.getTileMode(tileMode));
+ LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(matrix, x0, y0,
+ x1, y1, colors, positions, Shader_Delegate.getTileMode(tileMode));
return sManager.addNewDelegate(newDelegate);
}
@LayoutlibDelegate
- /*package*/ static long nativeCreate2(LinearGradient thisGradient,
+ /*package*/ static long nativeCreate2(LinearGradient thisGradient, long matrix,
float x0, float y0, float x1, float y1,
int color0, int color1, int tileMode) {
- return nativeCreate1(thisGradient,
- x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/,
- tileMode);
+ return nativeCreate1(thisGradient, matrix, x0, y0, x1, y1, new int[] { color0, color1},
+ null /*positions*/, tileMode);
}
// ---- Private delegate/helper methods ----
@@ -78,6 +77,7 @@
/**
* Create a shader that draws a linear gradient along a line.
*
+ * @param nativeMatrix reference to the shader's native transformation matrix
* @param x0 The x-coordinate for the start of the gradient line
* @param y0 The y-coordinate for the start of the gradient line
* @param x1 The x-coordinate for the end of the gradient line
@@ -88,9 +88,9 @@
* the colors are distributed evenly along the gradient line.
* @param tile The Shader tiling mode
*/
- private LinearGradient_Delegate(float x0, float y0, float x1, float y1,
- int colors[], float positions[], TileMode tile) {
- super(colors, positions);
+ private LinearGradient_Delegate(long nativeMatrix, float x0, float y0, float x1,
+ float y1, int colors[], float positions[], TileMode tile) {
+ super(nativeMatrix, colors, positions);
mJavaPaint = new LinearGradientPaint(x0, y0, x1, y1, mColors, mPositions, tile);
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
index 9881a38..b5ba468 100644
--- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java
@@ -56,18 +56,18 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static long nativeCreate1(float x, float y, float radius,
+ /*package*/ static long nativeCreate1(long matrix, float x, float y, float radius,
int colors[], float positions[], int tileMode) {
- RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius,
+ RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(matrix, x, y, radius,
colors, positions, Shader_Delegate.getTileMode(tileMode));
return sManager.addNewDelegate(newDelegate);
}
@LayoutlibDelegate
- /*package*/ static long nativeCreate2(float x, float y, float radius,
+ /*package*/ static long nativeCreate2(long matrix, float x, float y, float radius,
int color0, int color1, int tileMode) {
- return nativeCreate1(x, y, radius, new int[] { color0, color1 }, null /*positions*/,
- tileMode);
+ return nativeCreate1(matrix, x, y, radius, new int[] { color0, color1 },
+ null /*positions*/, tileMode);
}
// ---- Private delegate/helper methods ----
@@ -75,6 +75,7 @@
/**
* Create a shader that draws a radial gradient given the center and radius.
*
+ * @param nativeMatrix reference to the shader's native transformation matrix
* @param x The x-coordinate of the center of the radius
* @param y The y-coordinate of the center of the radius
* @param radius Must be positive. The radius of the circle for this
@@ -86,9 +87,9 @@
* distributed evenly between the center and edge of the circle.
* @param tile The Shader tiling mode
*/
- private RadialGradient_Delegate(float x, float y, float radius, int colors[], float positions[],
- TileMode tile) {
- super(colors, positions);
+ private RadialGradient_Delegate(long nativeMatrix, float x, float y, float radius,
+ int colors[], float positions[], TileMode tile) {
+ super(nativeMatrix, colors, positions);
mJavaPaint = new RadialGradientPaint(x, y, radius, mColors, mPositions, tile);
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
index 0d491a0..5b75089 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
@@ -76,24 +76,16 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static void nativeDestructor(long native_shader) {
- sManager.removeJavaReferenceFor(native_shader);
- }
-
- @LayoutlibDelegate
- /*package*/ static long nativeSetLocalMatrix(long native_shader, long matrix_instance) {
- // get the delegate from the native int.
- Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
- if (shaderDelegate == null) {
- return native_shader;
- }
-
- shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance);
- return native_shader;
+ /*package*/ static void nativeSafeUnref(long nativeInstance) {
+ sManager.removeJavaReferenceFor(nativeInstance);
}
// ---- Private delegate/helper methods ----
+ protected Shader_Delegate(long nativeMatrix) {
+ mLocalMatrix = Matrix_Delegate.getDelegate(nativeMatrix);
+ }
+
protected java.awt.geom.AffineTransform getLocalMatrix() {
if (mLocalMatrix != null) {
return mLocalMatrix.getAffineTransform();
diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
index 544ba98..30152bc 100644
--- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java
@@ -52,14 +52,17 @@
// ---- native methods ----
@LayoutlibDelegate
- /*package*/ static long nativeCreate1(float x, float y, int colors[], float positions[]) {
- SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(x, y, colors, positions);
+ /*package*/ static long nativeCreate1(long matrix, float x, float y, int colors[], float
+ positions[]) {
+ SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(matrix, x, y, colors,
+ positions);
return sManager.addNewDelegate(newDelegate);
}
@LayoutlibDelegate
- /*package*/ static long nativeCreate2(float x, float y, int color0, int color1) {
- return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/);
+ /*package*/ static long nativeCreate2(long matrix, float x, float y, int color0, int color1) {
+ return nativeCreate1(matrix, x, y, new int[] { color0, color1 },
+ null /*positions*/);
}
// ---- Private delegate/helper methods ----
@@ -67,6 +70,7 @@
/**
* A subclass of Shader that draws a sweep gradient around a center point.
*
+ * @param nativeMatrix reference to the shader's native transformation matrix
* @param cx The x-coordinate of the center
* @param cy The y-coordinate of the center
* @param colors The colors to be distributed between around the center.
@@ -78,9 +82,9 @@
* If positions is NULL, then the colors are automatically
* spaced evenly.
*/
- private SweepGradient_Delegate(float cx, float cy,
- int colors[], float positions[]) {
- super(colors, positions);
+ private SweepGradient_Delegate(long nativeMatrix, float cx, float cy,
+ int colors[], float positions[]) {
+ super(nativeMatrix, colors, positions);
mJavaPaint = new SweepGradientPaint(cx, cy, mColors, mPositions);
}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 253ea6f..1282349 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -62,7 +62,7 @@
// ---- implementation of IWindowManager that we care about ----
@Override
- public int getRotation() throws RemoteException {
+ public int getDefaultDisplayRotation() throws RemoteException {
return mRotation;
}
@@ -399,7 +399,7 @@
}
@Override
- public int watchRotation(IRotationWatcher arg0) throws RemoteException {
+ public int watchRotation(IRotationWatcher arg0, int arg1) throws RemoteException {
// TODO Auto-generated method stub
return 0;
}
diff --git a/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java b/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java
index 3ce7cab..672ff6d 100644
--- a/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java
+++ b/tools/layoutlib/bridge/src/android/view/accessibility/AccessibilityManager.java
@@ -95,6 +95,9 @@
public void notifyServicesStateChanged() {
}
+
+ public void setRelevantEventTypes(int eventTypes) {
+ }
};
/**
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 04fdae9..a385847 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -640,7 +640,7 @@
return AccessibilityManager.getInstance(this);
}
- if (AUTO_FILL_MANAGER_SERVICE.equals(service)) {
+ if (AUTOFILL_MANAGER_SERVICE.equals(service)) {
return null;
}
@@ -1607,6 +1607,12 @@
}
@Override
+ public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1, boolean arg2) {
+ // pass
+ return null;
+ }
+
+ @Override
public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
String arg2, Handler arg3) {
// pass
@@ -1614,6 +1620,13 @@
}
@Override
+ public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
+ String arg2, Handler arg3, boolean arg4) {
+ // pass
+ return null;
+ }
+
+ @Override
public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5,
IntentFilter arg1, String arg2, Handler arg3) {
// pass
diff --git a/wifi/java/android/net/wifi/IconInfo.aidl b/wifi/java/android/net/wifi/IconInfo.aidl
new file mode 100644
index 0000000..a7bb2ef
--- /dev/null
+++ b/wifi/java/android/net/wifi/IconInfo.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi;
+
+parcelable IconInfo;
diff --git a/wifi/java/android/net/wifi/IconInfo.java b/wifi/java/android/net/wifi/IconInfo.java
new file mode 100644
index 0000000..0eae363
--- /dev/null
+++ b/wifi/java/android/net/wifi/IconInfo.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi;
+
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.os.Parcel;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * A class representing icon information.
+ */
+public final class IconInfo implements Parcelable {
+ /**
+ * Name of the icon file.
+ */
+ private final String mFilename;
+
+ /**
+ * Raw binary data of the icon.
+ */
+ private final byte[] mData;
+
+ public IconInfo(String filename, byte[] data) {
+ mFilename = filename;
+ mData = data;
+ }
+
+ public IconInfo(IconInfo source) {
+ if (source == null) {
+ mFilename = null;
+ mData = null;
+ return;
+ }
+
+ mFilename = source.mFilename;
+ if (source.mData != null) {
+ mData = Arrays.copyOf(source.mData, source.mData.length);
+ } else {
+ mData = null;
+ }
+ }
+
+ public String getFilename() {
+ return mFilename;
+ }
+
+ public byte[] getData() {
+ return mData;
+ }
+
+ @Override
+ public boolean equals(Object thatObject) {
+ if (this == thatObject) {
+ return true;
+ }
+ if (!(thatObject instanceof IconInfo)) {
+ return false;
+ }
+ IconInfo that = (IconInfo) thatObject;
+ return TextUtils.equals(mFilename, that.mFilename)
+ && Arrays.equals(mData, that.mData);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mFilename, mData);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mFilename);
+ dest.writeByteArray(mData);
+ }
+
+ public static final Creator<IconInfo> CREATOR =
+ new Creator<IconInfo>() {
+ @Override
+ public IconInfo createFromParcel(Parcel in) {
+ String filename = in.readString();
+ byte[] data = in.createByteArray();
+ return new IconInfo(filename, data);
+ }
+
+ @Override
+ public IconInfo[] newArray(int size) {
+ return new IconInfo[size];
+ }
+ };
+}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index ed6a166..bbe96a7 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -114,166 +114,118 @@
public static final int WIFI_CREDENTIAL_FORGOT = 1;
/**
- * Broadcast intent action indicating that the a Passpoint release 2 icon has been received.
- * @hide
- */
- public static final String PASSPOINT_ICON_RECEIVED_ACTION =
- "android.net.wifi.PASSPOINT_ICON_RECEIVED";
- /** @hide */
- public static final String EXTRA_PASSPOINT_ICON_FILE = "file";
-
- /**
- * Broadcast intent action indicating that the a Passpoint release
- * 2 WNM frame has been received.
- * @hide
- */
- public static final String PASSPOINT_WNM_FRAME_RECEIVED_ACTION =
- "android.net.wifi.PASSPOINT_WNM_FRAME_RECEIVED";
- /**
- * Originating BSS
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_BSSID = "bssid";
- /**
- * SOAP-XML or OMA-DM
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_METHOD = "method";
- /**
- * Type of Passpoint match
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_PPOINT_MATCH = "match";
- /**
- * String
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_URL = "url";
- /**
- * Boolean true=ess, false=bss
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_ESS = "ess";
- /**
- * Delay in seconds
- * @hide */
- public static final String EXTRA_PASSPOINT_WNM_DELAY = "delay";
-
- /**
* Broadcast intent action indicating that a Passpoint provider icon has been received.
*
+ * Included extras:
+ * {@link #EXTRA_BSSID_LONG}
+ * {@link #EXTRA_ICON_INFO}
+ *
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
- */
- public static final String ACTION_PASSPOINT_ICON =
- "android.net.wifi.action.PASSPOINT_ICON";
- /**
- * BSSID of the sender.
*
- * Type: long
+ * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * components will be launched.
*/
- public static final String EXTRA_PASSPOINT_ICON_BSSID =
- "android.net.wifi.extra.PASSPOINT_ICON_BSSID";
+ public static final String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
/**
- * Filename of the icon.
+ * BSSID of an AP in long representation. The {@link #EXTRA_BSSID} contains BSSID in
+ * String representation.
*
- * Type: String
+ * Retrieve with {@link android.content.Intent#getLongExtra(String, long)}.
*/
- public static final String EXTRA_PASSPOINT_ICON_FILENAME =
- "android.net.wifi.extra.PASSPOINT_ICON_FILENAME";
+ public static final String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
/**
- * Binary blob of the icon.
+ * Icon information.
*
- * Type: byte[]
+ * Retrieve with {@link android.content.Intent#getParcelableExtra(String)} and cast into
+ * {@link IconInfo}.
*/
- public static final String EXTRA_PASSPOINT_ICON_DATA =
- "android.net.wifi.extra.PASSPOINT_ICON_DATA";
+ public static final String EXTRA_ICON_INFO = "android.net.wifi.extra.ICON_INFO";
/**
* Broadcast intent action indicating a Passpoint OSU Providers List element has been received.
*
+ * Included extras:
+ * {@link #EXTRA_BSSID_LONG}
+ * {@link #EXTRA_ANQP_ELEMENT_DATA}
+ *
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
+ *
+ * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * components will be launched.
+ *
*/
public static final String ACTION_PASSPOINT_OSU_PROVIDERS_LIST =
"android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
/**
- * BSSID of the sender.
+ * Raw binary data of an ANQP (Access Network Query Protocol) element.
*
- * Type: long
+ * Retrieve with {@link android.content.Intent#getByteArrayExtra(String)}.
*/
- public static final String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_BSSID =
- "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_BSSID";
- /**
- * Raw data of OSU Providers List ANQP element. Refer to Section 4.8 of Hotspot 2.0 Release 2
- * Technical Specification for the exact data format.
- *
- * Type: byte[]
- */
- public static final String EXTRA_PASSPOINT_OSU_PROVIDERS_LIST_DATA =
- "android.net.wifi.extra.PASSPOINT_OSU_PROVIDERS_LIST_DATA";
+ public static final String EXTRA_ANQP_ELEMENT_DATA =
+ "android.net.wifi.extra.ANQP_ELEMENT_DATA";
/**
* Broadcast intent action indicating that a Passpoint Deauth Imminent frame has been received.
*
+ * Included extras:
+ * {@link #EXTRA_BSSID_LONG}
+ * {@link #EXTRA_ESS}
+ * {@link #EXTRA_DELAY}
+ * {@link #EXTRA_URL}
+ *
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
+ *
+ * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * components will be launched.
+ *
*/
public static final String ACTION_PASSPOINT_DEAUTH_IMMINENT =
"android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
/**
- * The BSSID of the sender.
+ * Flag indicating BSS (Basic Service Set) or ESS (Extended Service Set). This will be set to
+ * {@code true} for ESS.
*
- * Type: long
+ * Retrieve with {@link android.content.Intent#getBooleanExtra(String, boolean)}.
*/
- public static final String EXTRA_PASSPOINT_DEAUTH_IMMINENT_BSSID =
- "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_BSSID";
+ public static final String EXTRA_ESS = "android.net.wifi.extra.ESS";
/**
- * Flag indicating failure at BSS (Basic Service Set) or ESS (Extended Service Set) level.
+ * Delay in seconds.
*
- * Type: boolean
+ * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
*/
- public static final String EXTRA_PASSPOINT_DEAUTH_IMMINENT_ESS =
- "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_ESS";
+ public static final String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
/**
- * Delay in seconds that a device shall wait before attempting re-association to the same BSS
- * or ESS (as indicated by {@link #EXTRA_PASSPOINT_DEAUTH_IMMINENT_ESS}.
+ * String representation of an URL.
*
- * Type: int
+ * Retrieve with {@link android.content.Intent#getStringExtra(String)}.
*/
- public static final String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY =
- "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REAUTH_DELAY";
- /**
- * URL that provides a webpage explaining the deauth reason.
- *
- * Type: String
- */
- public static final String EXTRA_PASSPOINT_DEAUTH_IMMINENT_REASON_URL =
- "android.net.wifi.extra.PASSPOINT_DEAUTH_IMMINENT_REASON_URL";
+ public static final String EXTRA_URL = "android.net.wifi.extra.URL";
/**
* Broadcast intent action indicating a Passpoint subscription remediation frame has been
* received.
*
+ * Included extras:
+ * {@link #EXTRA_BSSID_LONG}
+ * {@link #EXTRA_SUBSCRIPTION_REMEDIATION_METHOD}
+ * {@link #EXTRA_URL}
+ *
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
+ *
+ ** <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * components will be launched.
*/
public static final String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION =
"android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
/**
- * The BSSID of the sender.
- *
- * Type: long
- */
- public static final String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID =
- "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_BSSID";
- /**
* The protocol supported by the subscription remediation server. The possible values are:
* 0 - OMA DM
* 1 - SOAP XML SPP
*
- * Type: int
+ * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
*/
- public static final String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD =
- "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_METHOD";
- /**
- * URL of the subscription remediation server.
- *
- * Type: String
- */
- public static final String EXTRA_PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL =
- "android.net.wifi.extra.PASSPOINT_SUBSCRIPTION_REMEDIATION_SERVER_URL";
+ public static final String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD =
+ "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
/**
* Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
@@ -972,12 +924,15 @@
* Name). In the case when there is an existing configuration with the same
* FQDN, the new configuration will replace the existing configuration.
*
+ * An {@link IllegalArgumentException} will be thrown on failure.
+ *
* @param config The Passpoint configuration to be added
- * @return true on success
*/
- public boolean addOrUpdatePasspointConfiguration(PasspointConfiguration config) {
+ public void addOrUpdatePasspointConfiguration(PasspointConfiguration config) {
try {
- return mService.addOrUpdatePasspointConfiguration(config);
+ if (!mService.addOrUpdatePasspointConfiguration(config)) {
+ throw new IllegalArgumentException();
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -986,12 +941,15 @@
/**
* Remove the Passpoint configuration identified by its FQDN (Fully Qualified Domain Name).
*
+ * An {@link IllegalArgumentException} will be thrown on failure.
+ *
* @param fqdn The FQDN of the passpoint configuration to be removed
- * @return true on success
*/
- public boolean removePasspointConfiguration(String fqdn) {
+ public void removePasspointConfiguration(String fqdn) {
try {
- return mService.removePasspointConfiguration(fqdn);
+ if (!mService.removePasspointConfiguration(fqdn)) {
+ throw new IllegalArgumentException();
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySession.java b/wifi/java/android/net/wifi/aware/DiscoverySession.java
index 156c3fd..82b3792 100644
--- a/wifi/java/android/net/wifi/aware/DiscoverySession.java
+++ b/wifi/java/android/net/wifi/aware/DiscoverySession.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.net.wifi.RttManager;
import android.util.Log;
@@ -33,7 +34,8 @@
* <ul>
* <li>Sending messages: {@link #sendMessage(PeerHandle, int, byte[])} method.
* <li>Creating a network-specifier when requesting a Aware connection:
- * {@link #createNetworkSpecifier(PeerHandle, byte[])}.
+ * {@link #createNetworkSpecifierOpen(PeerHandle)} or
+ * {@link #createNetworkSpecifierPassphrase(PeerHandle, String)}.
* </ul>
* The {@link #destroy()} method must be called to destroy discovery sessions once they are
* no longer needed.
@@ -255,7 +257,7 @@
* <p>
* This method should be used when setting up a connection with a peer discovered through Aware
* discovery or communication (in such scenarios the MAC address of the peer is shielded by
- * an opaque peer ID handle). If a Aware connection is needed to a peer discovered using other
+ * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
* OOB (out-of-band) mechanism then use the alternative
* {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])} method - which uses the
* peer's MAC address.
@@ -263,24 +265,22 @@
* Note: per the Wi-Fi Aware specification the roles are fixed - a Subscriber is an INITIATOR
* and a Publisher is a RESPONDER.
* <p>
- * To set up an encrypted link use the {@link #createNetworkSpecifierPmk(PeerHandle, byte[])}
- * or {@link #createNetworkSpecifierPassphrase(PeerHandle, String)} APIs.
+ * To set up an encrypted link use the
+ * {@link #createNetworkSpecifierPassphrase(PeerHandle, String)} API.
*
* @param peerHandle The peer's handle obtained through
* {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)}
* or
* {@link DiscoverySessionCallback#onMessageReceived(PeerHandle, byte[])}.
* On a RESPONDER this value is used to gate the acceptance of a connection
- * request from only that peer. A RESPONDER may specify a null - indicating
- * that it will accept connection requests from any device.
+ * request from only that peer. A RESPONDER may specify a {@code null} -
+ * indicating that it will accept connection requests from any device.
*
* @return A string to be used to construct
* {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to
* {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
* android.net.ConnectivityManager.NetworkCallback)}
* [or other varieties of that API].
- *
- * @hide
*/
public String createNetworkSpecifierOpen(@Nullable PeerHandle peerHandle) {
if (mTerminated) {
@@ -309,7 +309,7 @@
* <p>
* This method should be used when setting up a connection with a peer discovered through Aware
* discovery or communication (in such scenarios the MAC address of the peer is shielded by
- * an opaque peer ID handle). If a Aware connection is needed to a peer discovered using other
+ * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
* OOB (out-of-band) mechanism then use the alternative
* {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)} method -
* which uses the peer's MAC address.
@@ -322,12 +322,11 @@
* byte[], java.util.List)} or
* {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
* byte[])}. On a RESPONDER this value is used to gate the acceptance of a connection request
- * from only that peer. A RESPONDER may specify a null - indicating that
- * it will accept connection requests from any device.
+ * from only that peer. A RESPONDER may specify a {@code null} - indicating
+ * that it will accept connection requests from any device.
* @param passphrase The passphrase to be used to encrypt the link. The PMK is generated from
* the passphrase. Use the
- * {@link #createNetworkSpecifierPmk(PeerHandle, byte[])} to specify the
- * PMK directly or {@link #createNetworkSpecifierOpen(PeerHandle)} to
+ * {@link #createNetworkSpecifierOpen(PeerHandle)} API to
* specify an open (unencrypted) link.
*
* @return A string to be used to construct
@@ -335,8 +334,6 @@
* {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
* android.net.ConnectivityManager.NetworkCallback)}
* [or other varieties of that API].
- *
- * * @hide
*/
public String createNetworkSpecifierPassphrase(@Nullable PeerHandle peerHandle,
@NonNull String passphrase) {
@@ -371,7 +368,7 @@
* <p>
* This method should be used when setting up a connection with a peer discovered through Aware
* discovery or communication (in such scenarios the MAC address of the peer is shielded by
- * an opaque peer ID handle). If a Aware connection is needed to a peer discovered using other
+ * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
* OOB (out-of-band) mechanism then use the alternative
* {@link WifiAwareSession#createNetworkSpecifierPmk(int, byte[], byte[])} method - which uses
* the peer's MAC address.
@@ -400,6 +397,7 @@
*
* @hide
*/
+ @SystemApi
public String createNetworkSpecifierPmk(@Nullable PeerHandle peerHandle,
@NonNull byte[] pmk) {
if (pmk == null || pmk.length == 0) {
@@ -423,27 +421,4 @@
return mgr.createNetworkSpecifier(mClientId, role, mSessionId, peerHandle, pmk, null);
}
-
- /**
- * Place-holder for {@code createNetworkSpecifierOpen(PeerHandle)}. Present to enable
- * development of replacements CL without causing an API change. Will be removed when new
- * APIs are exposed.
- *
- * @param peerHandle The peer's handle obtained through
- * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
- * byte[], java.util.List)} or
- * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
- * byte[])}. On a RESPONDER this value is used to gate the acceptance of a connection request
- * from only that peer. A RESPONDER may specify a null - indicating that
- * it will accept connection requests from any device.
- * @param token Deprecated and ignored.
- * @return A string to be used to construct
- * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to
- * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
- * android.net.ConnectivityManager.NetworkCallback)}
- * [or other varieties of that API].
- */
- public String createNetworkSpecifier(@Nullable PeerHandle peerHandle, @Nullable byte[] token) {
- return createNetworkSpecifierOpen(peerHandle);
- }
}
diff --git a/wifi/java/android/net/wifi/aware/IdentityChangedListener.java b/wifi/java/android/net/wifi/aware/IdentityChangedListener.java
index cae8706..81a06e8 100644
--- a/wifi/java/android/net/wifi/aware/IdentityChangedListener.java
+++ b/wifi/java/android/net/wifi/aware/IdentityChangedListener.java
@@ -24,7 +24,8 @@
* your identity - e.g. by starting a discovery session. This actual MAC address of the
* interface may also be useful if the application uses alternative (non-Aware) discovery but needs
* to set up a Aware connection. The provided Aware discovery interface MAC address can then be used
- * in {@link WifiAwareSession#createNetworkSpecifier(int, byte[], byte[])}.
+ * in {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])} or
+ * {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)}.
*/
public class IdentityChangedListener {
/**
diff --git a/wifi/java/android/net/wifi/aware/PeerHandle.java b/wifi/java/android/net/wifi/aware/PeerHandle.java
index bbe9f54..cd45c52 100644
--- a/wifi/java/android/net/wifi/aware/PeerHandle.java
+++ b/wifi/java/android/net/wifi/aware/PeerHandle.java
@@ -19,9 +19,10 @@
/**
* Opaque object used to represent a Wi-Fi Aware peer. Obtained from discovery sessions in
* {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)}, used
- * when sending messages e,g, {@link PublishDiscoverySession#sendMessage(PeerHandle, int, byte[])},
+ * when sending messages e,g, {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])},
* or when configuring a network link to a peer, e.g.
- * {@link PublishDiscoverySession#createNetworkSpecifier(PeerHandle, byte[])}.
+ * {@link DiscoverySession#createNetworkSpecifierOpen(PeerHandle)} or
+ * {@link DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)}.
*/
public class PeerHandle {
/** @hide */
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
index 7b6805c..4d3957a 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
@@ -65,8 +65,10 @@
* <li>Create a Aware network specifier to be used with
* {@link ConnectivityManager#requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)}
* to set-up a Aware connection with a peer. Refer to
- * {@link DiscoverySession#createNetworkSpecifier(PeerHandle, byte[])} and
- * {@link WifiAwareSession#createNetworkSpecifier(int, byte[], byte[])}.
+ * {@link DiscoverySession#createNetworkSpecifierOpen(PeerHandle)},
+ * {@link DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)},
+ * {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])}, and
+ * {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)}.
* </ul>
* <p>
* Aware may not be usable when Wi-Fi is disabled (and other conditions). To validate that
@@ -115,8 +117,10 @@
* <li>{@link NetworkRequest.Builder#addTransportType(int)} of
* {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
* <li>{@link NetworkRequest.Builder#setNetworkSpecifier(String)} using
- * {@link WifiAwareSession#createNetworkSpecifier(int, byte[], byte[])} or
- * {@link DiscoverySession#createNetworkSpecifier(PeerHandle, byte[])}.
+ * {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])},
+ * {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)},
+ * {@link DiscoverySession#createNetworkSpecifierOpen(PeerHandle)}, or
+ * {@link DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)}.
* </ul>
*/
public class WifiAwareManager {
@@ -206,8 +210,10 @@
* Connection creation role is that of INITIATOR. Used to create a network specifier string
* when requesting a Aware network.
*
- * @see DiscoverySession#createNetworkSpecifier(PeerHandle, byte[])
- * @see WifiAwareSession#createNetworkSpecifier(int, byte[], byte[])
+ * @see DiscoverySession#createNetworkSpecifierOpen(PeerHandle)
+ * @see DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)
+ * @see WifiAwareSession#createNetworkSpecifierOpen(int, byte[])
+ * @see WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)
*/
public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0;
@@ -215,8 +221,10 @@
* Connection creation role is that of RESPONDER. Used to create a network specifier string
* when requesting a Aware network.
*
- * @see DiscoverySession#createNetworkSpecifier(PeerHandle, byte[])
- * @see WifiAwareSession#createNetworkSpecifier(int, byte[], byte[])
+ * @see DiscoverySession#createNetworkSpecifierOpen(PeerHandle)
+ * @see DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)
+ * @see WifiAwareSession#createNetworkSpecifierOpen(int, byte[])
+ * @see WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)
*/
public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1;
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareSession.java b/wifi/java/android/net/wifi/aware/WifiAwareSession.java
index f48f641..895defb 100644
--- a/wifi/java/android/net/wifi/aware/WifiAwareSession.java
+++ b/wifi/java/android/net/wifi/aware/WifiAwareSession.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
@@ -193,15 +194,15 @@
* when using Aware discovery use the alternative network specifier method -
* {@link DiscoverySession#createNetworkSpecifierOpen(PeerHandle)}.
* <p>
- * To set up an encrypted link use the {@link #createNetworkSpecifierPmk(int, byte[], byte[])}
- * or {@link #createNetworkSpecifierPassphrase(int, byte[], String)} APIs.
+ * To set up an encrypted link use the
+ * {@link #createNetworkSpecifierPassphrase(int, byte[], String)} API.
*
* @param role The role of this device:
* {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_INITIATOR} or
* {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
* @param peer The MAC address of the peer's Aware discovery interface. On a RESPONDER this
* value is used to gate the acceptance of a connection request from only that
- * peer. A RESPONDER may specify a null - indicating that it will accept
+ * peer. A RESPONDER may specify a {@code null} - indicating that it will accept
* connection requests from any device.
*
* @return A string to be used to construct
@@ -209,8 +210,6 @@
* {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
* android.net.ConnectivityManager.NetworkCallback)}
* [or other varieties of that API].
- *
- * @hide
*/
public String createNetworkSpecifierOpen(@WifiAwareManager.DataPathRole int role,
@Nullable byte[] peer) {
@@ -242,12 +241,10 @@
* {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
* @param peer The MAC address of the peer's Aware discovery interface. On a RESPONDER this
* value is used to gate the acceptance of a connection request from only that
- * peer. A RESPONDER may specify a null - indicating that it will accept
+ * peer. A RESPONDER may specify a {@code null} - indicating that it will accept
* connection requests from any device.
* @param passphrase The passphrase to be used to encrypt the link. The PMK is generated from
- * the passphrase. Use the
- * {@link #createNetworkSpecifierPmk(int, byte[], byte[])} to specify the
- * PMK directly or {@link #createNetworkSpecifierOpen(int, byte[])} to
+ * the passphrase. Use {@link #createNetworkSpecifierOpen(int, byte[])} to
* specify an open (unencrypted) link.
*
* @return A string to be used to construct
@@ -255,8 +252,6 @@
* {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
* android.net.ConnectivityManager.NetworkCallback)}
* [or other varieties of that API].
- *
- * @hide
*/
public String createNetworkSpecifierPassphrase(@WifiAwareManager.DataPathRole int role,
@Nullable byte[] peer, @NonNull String passphrase) {
@@ -307,6 +302,7 @@
*
* @hide
*/
+ @SystemApi
public String createNetworkSpecifierPmk(@WifiAwareManager.DataPathRole int role,
@Nullable byte[] peer, @NonNull byte[] pmk) {
WifiAwareManager mgr = mMgr.get();
@@ -323,28 +319,4 @@
}
return mgr.createNetworkSpecifier(mClientId, role, peer, pmk, null);
}
-
- /**
- * Place-holder for {@code #createNetworkSpecifierOpen(int, byte[])}. Present to enable
- * development of replacements CL without causing an API change. Will be removed when new
- * APIs are exposed.
- *
- * @param role The role of this device:
- * {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_INITIATOR} or
- * {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
- * @param peer The MAC address of the peer's Aware discovery interface. On a RESPONDER this
- * value is used to gate the acceptance of a connection request from only that
- * peer. A RESPONDER may specify a null - indicating that it will accept
- * connection requests from any device.
- * @param token Deprecated and ignored.
- * @return A string to be used to construct
- * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(String)} to pass to
- * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
- * android.net.ConnectivityManager.NetworkCallback)}
- * [or other varieties of that API].
- */
- public String createNetworkSpecifier(@WifiAwareManager.DataPathRole int role,
- @Nullable byte[] peer, @Nullable byte[] token) {
- return createNetworkSpecifierOpen(role, peer);
- }
}
diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
index 1f661c4..7de55aa 100644
--- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
+++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
@@ -333,6 +333,7 @@
* Validate the configuration data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
if (mHomeSp == null || !mHomeSp.validate()) {
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
index 2388841..d8da84f 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
@@ -286,6 +286,7 @@
* Validate the configuration data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
if (TextUtils.isEmpty(mUsername)) {
@@ -443,6 +444,7 @@
* Validate the configuration data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
if (!TextUtils.equals(CERT_TYPE_X509V3, mCertType)) {
@@ -569,6 +571,7 @@
* Validate the configuration data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
// Note: this only validate the format of IMSI string itself. Additional verification
@@ -768,6 +771,7 @@
* Validate the configuration data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
if (TextUtils.isEmpty(mRealm)) {
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
index 8ec40c0..68bdf37 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
@@ -245,6 +245,7 @@
* Validate HomeSp data.
*
* @return true on success or false on failure
+ * @hide
*/
public boolean validate() {
if (TextUtils.isEmpty(mFqdn)) {
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java b/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
index 63238e8..da36a11 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
@@ -253,6 +253,7 @@
* Validate RoamingParnter data.
*
* @return true on success
+ * @hide
*/
public boolean validate() {
if (TextUtils.isEmpty(mFqdn)) {
@@ -393,6 +394,7 @@
* Validate Policy data.
*
* @return true on success
+ * @hide
*/
public boolean validate() {
if (mPolicyUpdate == null) {
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
index 70264b0e..ae051b0 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
@@ -251,6 +251,7 @@
* Validate UpdateParameter data.
*
* @return true on success
+ * @hide
*/
public boolean validate() {
if (mUpdateIntervalInMinutes == Long.MIN_VALUE) {
diff --git a/wifi/tests/src/android/net/wifi/IconInfoTest.java b/wifi/tests/src/android/net/wifi/IconInfoTest.java
new file mode 100644
index 0000000..2fdb484
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/IconInfoTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.net.wifi;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.wifi.IconInfo;
+import android.os.Parcel;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link android.net.wifi.IconInfo}.
+ */
+@SmallTest
+public class IconInfoTest {
+ private static final String TEST_FILENAME = "testIcon";
+ private static final byte[] TEST_DATA = new byte[] {0x12, 0x23, 0x34, 0x45, 0x56, 0x67};
+
+ /**
+ * Verify parcel write and read consistency for the given {@link IconInfo}
+ *
+ * @param writeIcon the {@link IconInfo} to write and verify
+ * @throws Exception
+ */
+ private static void verifyParcel(IconInfo writeIcon) throws Exception {
+ Parcel parcel = Parcel.obtain();
+ writeIcon.writeToParcel(parcel, 0);
+
+ parcel.setDataPosition(0); // Rewind data position back to the beginning for read.
+ IconInfo readIcon = IconInfo.CREATOR.createFromParcel(parcel);
+ assertEquals(writeIcon, readIcon);
+ }
+
+ /**
+ * Verify parcel serialization for a {@link IconInfo} with null data.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyParcelWithNullData() throws Exception {
+ verifyParcel(new IconInfo(TEST_FILENAME, (byte[]) null));
+ }
+
+ /**
+ * Verify parcel serialization for a {@link IconInfo} with zero length data.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyParcelWithZeroLengthData() throws Exception {
+ verifyParcel(new IconInfo(TEST_FILENAME, new byte[0]));
+ }
+
+ /**
+ * Verify parcel serialization for a {@link IconInfo} with non-zero length data.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyParcelWithNonZeroLengthData() throws Exception {
+ verifyParcel(new IconInfo(TEST_FILENAME, TEST_DATA));
+ }
+
+ /**
+ * Verify parcel serialization for a {@link IconInfo} with a null filename.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyParcelWithNullFilename() throws Exception {
+ verifyParcel(new IconInfo(null, TEST_DATA));
+ }
+
+ /**
+ * Verify the copy constructor with non-null filename and data.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyCopyConstructor() throws Exception {
+ IconInfo source = new IconInfo(TEST_FILENAME, TEST_DATA);
+ assertEquals(source, new IconInfo(source));
+ }
+
+ /**
+ * Verify the copy constructor with null data.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyCopyConstructorWithNullData() throws Exception {
+ IconInfo source = new IconInfo(TEST_FILENAME, (byte[]) null);
+ assertEquals(source, new IconInfo(source));
+ }
+
+ /**
+ * Verify the copy constructor with null file name.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void verifyCopyConstructorWithNullFilename() throws Exception {
+ IconInfo source = new IconInfo(null, TEST_DATA);
+ assertEquals(source, new IconInfo(source));
+ }
+}