diff options
257 files changed, 4724 insertions, 3847 deletions
diff --git a/Android.bp b/Android.bp index c571fa0e5cfc..035420f9ff50 100644 --- a/Android.bp +++ b/Android.bp @@ -1685,6 +1685,7 @@ droidstubs { srcs: [ ":openjdk_java_files", ":non_openjdk_java_files", + ":opt-telephony-common-srcs", ], arg_files: [ "core/res/AndroidManifest.xml", diff --git a/api/current.txt b/api/current.txt index d3d79bb02ddf..a46a3a09fbd0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11598,6 +11598,7 @@ package android.content.pm { method public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull public abstract java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int); method @Nullable public android.os.Bundle getSuspendedPackageAppExtras(); + method public boolean getSyntheticAppDetailsActivityEnabled(@NonNull String); method public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures(); method public abstract String[] getSystemSharedLibraryNames(); method public abstract CharSequence getText(String, @StringRes int, android.content.pm.ApplicationInfo); @@ -23401,6 +23402,7 @@ package android.media { } public final class AudioPlaybackCaptureConfiguration { + method @NonNull public android.media.projection.MediaProjection getMediaProjection(); } public static final class AudioPlaybackCaptureConfiguration.Builder { @@ -23706,17 +23708,6 @@ package android.media { method public void onTearDown(@NonNull android.media.AudioTrack); } - public class CallbackDataSourceDesc extends android.media.DataSourceDesc { - method @NonNull public android.media.DataSourceCallback getDataSourceCallback(); - } - - public static class CallbackDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.CallbackDataSourceDesc.Builder> { - ctor public CallbackDataSourceDesc.Builder(); - ctor public CallbackDataSourceDesc.Builder(@Nullable android.media.CallbackDataSourceDesc); - method @NonNull public android.media.CallbackDataSourceDesc build(); - method @NonNull public android.media.CallbackDataSourceDesc.Builder setDataSource(@NonNull android.media.DataSourceCallback); - } - public class CamcorderProfile { method public static android.media.CamcorderProfile get(int); method public static android.media.CamcorderProfile get(int, int); @@ -23783,10 +23774,18 @@ package android.media { field public static final long POSITION_UNKNOWN = 576460752303423L; // 0x20c49ba5e353fL } - protected static class DataSourceDesc.BuilderBase<T extends android.media.DataSourceDesc.BuilderBase> { - method @NonNull public T setEndPosition(long); - method @NonNull public T setMediaId(@Nullable String); - method @NonNull public T setStartPosition(long); + public static final class DataSourceDesc.Builder { + ctor public DataSourceDesc.Builder(); + ctor public DataSourceDesc.Builder(@Nullable android.media.DataSourceDesc); + method @NonNull public android.media.DataSourceDesc build(); + method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.net.Uri); + method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>); + method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor); + method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor, long, long); + method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.media.DataSourceCallback); + method @NonNull public android.media.DataSourceDesc.Builder setEndPosition(long); + method @NonNull public android.media.DataSourceDesc.Builder setMediaId(@Nullable String); + method @NonNull public android.media.DataSourceDesc.Builder setStartPosition(long); } public final class DeniedByServerException extends android.media.MediaDrmException { @@ -23991,21 +23990,6 @@ package android.media { field public static final int EULER_Z = 2; // 0x2 } - public class FileDataSourceDesc extends android.media.DataSourceDesc { - method public long getLength(); - method public long getOffset(); - method @NonNull public android.os.ParcelFileDescriptor getParcelFileDescriptor(); - field public static final long FD_LENGTH_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL - } - - public static class FileDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.FileDataSourceDesc.Builder> { - ctor public FileDataSourceDesc.Builder(); - ctor public FileDataSourceDesc.Builder(@Nullable android.media.FileDataSourceDesc); - method @NonNull public android.media.FileDataSourceDesc build(); - method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor); - method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor, long, long); - } - public abstract class Image implements java.lang.AutoCloseable { method public abstract void close(); method public android.graphics.Rect getCropRect(); @@ -25092,6 +25076,7 @@ package android.media { field public static final String KEY_OPERATING_RATE = "operating-rate"; field public static final String KEY_OUTPUT_REORDER_DEPTH = "output-reorder-depth"; field public static final String KEY_PCM_ENCODING = "pcm-encoding"; + field public static final String KEY_PREPEND_HEADER_TO_SYNC_FRAMES = "prepend-sps-pps-to-idr-frames"; field public static final String KEY_PRIORITY = "priority"; field public static final String KEY_PROFILE = "profile"; field public static final String KEY_PUSH_BLANK_BUFFERS_ON_STOP = "push-blank-buffers-on-shutdown"; @@ -26639,21 +26624,6 @@ package android.media { ctor public UnsupportedSchemeException(String); } - public class UriDataSourceDesc extends android.media.DataSourceDesc { - method @NonNull public android.content.Context getContext(); - method @Nullable public java.util.List<java.net.HttpCookie> getCookies(); - method @Nullable public java.util.Map<java.lang.String,java.lang.String> getHeaders(); - method @NonNull public android.net.Uri getUri(); - } - - public static class UriDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.UriDataSourceDesc.Builder> { - ctor public UriDataSourceDesc.Builder(); - ctor public UriDataSourceDesc.Builder(@Nullable android.media.UriDataSourceDesc); - method @NonNull public android.media.UriDataSourceDesc build(); - method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri); - method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>); - } - public interface VolumeAutomation { method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration); } @@ -28882,16 +28852,25 @@ package android.net { } public final class LinkProperties implements android.os.Parcelable { + ctor public LinkProperties(); + method public boolean addRoute(@NonNull android.net.RouteInfo); + method public void clear(); method public int describeContents(); - method public java.util.List<java.net.InetAddress> getDnsServers(); - method public String getDomains(); - method public android.net.ProxyInfo getHttpProxy(); + method @NonNull public java.util.List<java.net.InetAddress> getDnsServers(); + method @Nullable public String getDomains(); + method @Nullable public android.net.ProxyInfo getHttpProxy(); method @Nullable public String getInterfaceName(); - method public java.util.List<android.net.LinkAddress> getLinkAddresses(); + method @NonNull public java.util.List<android.net.LinkAddress> getLinkAddresses(); method public int getMtu(); method @Nullable public String getPrivateDnsServerName(); - method public java.util.List<android.net.RouteInfo> getRoutes(); + method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(); method public boolean isPrivateDnsActive(); + method public void setDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); + method public void setDomains(@Nullable String); + method public void setHttpProxy(@Nullable android.net.ProxyInfo); + method public void setInterfaceName(@Nullable String); + method public void setLinkAddresses(@NonNull java.util.Collection<android.net.LinkAddress>); + method public void setMtu(int); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.LinkProperties> CREATOR; } @@ -28999,6 +28978,7 @@ package android.net { method public int describeContents(); method public int getLinkDownstreamBandwidthKbps(); method public int getLinkUpstreamBandwidthKbps(); + method public int getSignalStrength(); method @Nullable public android.net.TransportInfo getTransportInfo(); method public boolean hasCapability(int); method public boolean hasTransport(int); @@ -29027,6 +29007,7 @@ package android.net { field public static final int NET_CAPABILITY_VALIDATED = 16; // 0x10 field public static final int NET_CAPABILITY_WIFI_P2P = 6; // 0x6 field public static final int NET_CAPABILITY_XCAP = 9; // 0x9 + field public static final int SIGNAL_STRENGTH_UNSPECIFIED = -2147483648; // 0x80000000 field public static final int TRANSPORT_BLUETOOTH = 2; // 0x2 field public static final int TRANSPORT_CELLULAR = 0; // 0x0 field public static final int TRANSPORT_ETHERNET = 3; // 0x3 @@ -29038,7 +29019,7 @@ package android.net { @Deprecated public class NetworkInfo implements android.os.Parcelable { method @Deprecated public int describeContents(); - method @Deprecated public android.net.NetworkInfo.DetailedState getDetailedState(); + method @Deprecated @NonNull public android.net.NetworkInfo.DetailedState getDetailedState(); method @Deprecated public String getExtraInfo(); method @Deprecated public String getReason(); method @Deprecated public android.net.NetworkInfo.State getState(); @@ -30320,13 +30301,11 @@ package android.net.wifi.aware { } public static final class WifiAwareNetworkSpecifier.Builder { - ctor public WifiAwareNetworkSpecifier.Builder(); + ctor public WifiAwareNetworkSpecifier.Builder(@NonNull android.net.wifi.aware.DiscoverySession, @NonNull android.net.wifi.aware.PeerHandle); method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier build(); - method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setDiscoverySession(@NonNull android.net.wifi.aware.DiscoverySession); - method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPeerHandle(@NonNull android.net.wifi.aware.PeerHandle); - method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPort(int); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPort(@IntRange(from=0, to=65535) int); method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPskPassphrase(@NonNull String); - method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setTransportProtocol(int); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setTransportProtocol(@IntRange(from=0, to=255) int); } public class WifiAwareSession implements java.lang.AutoCloseable { @@ -35436,6 +35415,7 @@ package android.os { } public final class SystemClock { + method @NonNull public static java.time.Clock currentGnssTimeClock(); method public static long currentThreadTimeMillis(); method public static long elapsedRealtime(); method public static long elapsedRealtimeNanos(); @@ -42502,12 +42482,12 @@ package android.system { method public static java.io.FileDescriptor accept(java.io.FileDescriptor, java.net.InetSocketAddress) throws android.system.ErrnoException, java.net.SocketException; method public static boolean access(String, int) throws android.system.ErrnoException; method public static void bind(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException; - method public static void bind(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; + method public static void bind(@NonNull java.io.FileDescriptor, @NonNull java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; method public static void chmod(String, int) throws android.system.ErrnoException; method public static void chown(String, int, int) throws android.system.ErrnoException; method public static void close(java.io.FileDescriptor) throws android.system.ErrnoException; method public static void connect(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException; - method public static void connect(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; + method public static void connect(@NonNull java.io.FileDescriptor, @NonNull java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; method public static java.io.FileDescriptor dup(java.io.FileDescriptor) throws android.system.ErrnoException; method public static java.io.FileDescriptor dup2(java.io.FileDescriptor, int) throws android.system.ErrnoException; method public static String[] environ(); @@ -42572,7 +42552,7 @@ package android.system { method public static long sendfile(java.io.FileDescriptor, java.io.FileDescriptor, android.system.Int64Ref, long) throws android.system.ErrnoException; method public static int sendto(java.io.FileDescriptor, java.nio.ByteBuffer, int, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException; method public static int sendto(java.io.FileDescriptor, byte[], int, int, int, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException; - method public static int sendto(java.io.FileDescriptor, byte[], int, int, int, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; + method public static int sendto(@NonNull java.io.FileDescriptor, @NonNull byte[], int, int, int, @Nullable java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; method @Deprecated public static void setegid(int) throws android.system.ErrnoException; method public static void setenv(String, String, boolean) throws android.system.ErrnoException; method @Deprecated public static void seteuid(int) throws android.system.ErrnoException; @@ -44512,6 +44492,13 @@ package android.telephony { field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CellInfoNr> CREATOR; } + public final class CellInfoTdscdma extends android.telephony.CellInfo implements android.os.Parcelable { + method @NonNull public android.telephony.CellIdentityTdscdma getCellIdentity(); + method @NonNull public android.telephony.CellSignalStrengthTdscdma getCellSignalStrength(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CellInfoTdscdma> CREATOR; + } + public final class CellInfoWcdma extends android.telephony.CellInfo implements android.os.Parcelable { method public android.telephony.CellIdentityWcdma getCellIdentity(); method public android.telephony.CellSignalStrengthWcdma getCellSignalStrength(); @@ -44595,6 +44582,16 @@ package android.telephony { field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthNr> CREATOR; } + public final class CellSignalStrengthTdscdma extends android.telephony.CellSignalStrength implements android.os.Parcelable { + method public int describeContents(); + method public int getAsuLevel(); + method public int getDbm(); + method public int getLevel(); + method public int getRscp(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthTdscdma> CREATOR; + } + public final class CellSignalStrengthWcdma extends android.telephony.CellSignalStrength implements android.os.Parcelable { method public int describeContents(); method public int getAsuLevel(); @@ -53507,7 +53504,6 @@ package android.view.inputmethod { package android.view.inspector { public interface InspectionCompanion<T> { - method @Nullable public default String getNodeName(); method public void mapProperties(@NonNull android.view.inspector.PropertyMapper); method public void readProperties(@NonNull T, @NonNull android.view.inspector.PropertyReader); } diff --git a/api/system-current.txt b/api/system-current.txt index 0154e282775c..3abf492fa7f2 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -547,6 +547,7 @@ package android.app { } public class NotificationManager { + method @NonNull public java.util.List<java.lang.String> getAllowedAssistantCapabilities(); method @Nullable public android.content.ComponentName getAllowedNotificationAssistant(); method public boolean isNotificationAssistantAccessGranted(@NonNull android.content.ComponentName); method public void setNotificationAssistantAccessGranted(@Nullable android.content.ComponentName, boolean); @@ -744,7 +745,8 @@ package android.app.backup { method @RequiresPermission(android.Manifest.permission.BACKUP) public String getCurrentTransport(); method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.ComponentName getCurrentTransportComponent(); method @RequiresPermission(android.Manifest.permission.BACKUP) public android.content.Intent getDataManagementIntent(String); - method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(String); + method @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public CharSequence getDataManagementIntentLabel(@NonNull String); + method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.BACKUP) public String getDataManagementLabel(@NonNull String); method @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String); method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isAppEligibleForBackup(String); method @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupEnabled(); @@ -758,7 +760,8 @@ package android.app.backup { method @RequiresPermission(android.Manifest.permission.BACKUP) public void setAncestralSerialNumber(long); method @RequiresPermission(android.Manifest.permission.BACKUP) public void setAutoRestore(boolean); method @RequiresPermission(android.Manifest.permission.BACKUP) public void setBackupEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(android.content.ComponentName, String, @Nullable android.content.Intent, String, @Nullable android.content.Intent, @Nullable String); + method @Deprecated @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(@NonNull android.content.ComponentName, @NonNull String, @Nullable android.content.Intent, @NonNull String, @Nullable android.content.Intent, @Nullable String); + method @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes(@NonNull android.content.ComponentName, @NonNull String, @Nullable android.content.Intent, @NonNull String, @Nullable android.content.Intent, @Nullable CharSequence); field public static final int ERROR_AGENT_FAILURE = -1003; // 0xfffffc15 field public static final int ERROR_BACKUP_CANCELLED = -2003; // 0xfffff82d field public static final int ERROR_BACKUP_NOT_ALLOWED = -2001; // 0xfffff82f @@ -863,7 +866,8 @@ package android.app.backup { method public android.content.Intent configurationIntent(); method public String currentDestinationString(); method public android.content.Intent dataManagementIntent(); - method public String dataManagementLabel(); + method @Nullable public CharSequence dataManagementIntentLabel(); + method @Deprecated @Nullable public String dataManagementLabel(); method public int finishBackup(); method public void finishRestore(); method public android.app.backup.RestoreSet[] getAvailableRestoreSets(); @@ -1426,8 +1430,9 @@ package android.content { field public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE"; field @RequiresPermission(android.Manifest.permission.REVIEW_ACCESSIBILITY_SERVICES) public static final String ACTION_REVIEW_ACCESSIBILITY_SERVICES = "android.intent.action.REVIEW_ACCESSIBILITY_SERVICES"; field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_APP_PERMISSION_USAGE = "android.intent.action.REVIEW_APP_PERMISSION_USAGE"; + field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_ONGOING_PERMISSION_USAGE = "android.intent.action.REVIEW_ONGOING_PERMISSION_USAGE"; field public static final String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS"; - field public static final String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE"; + field @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public static final String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE"; field public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED"; field public static final String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS"; field @Deprecated public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED"; @@ -1620,7 +1625,6 @@ package android.content.pm { method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(String); method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract int getIntentVerificationStatusAsUser(String, int); method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(String, String, @NonNull android.os.UserHandle); - method public boolean getSyntheticAppDetailsActivityEnabled(@NonNull String); method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] getUnsuspendablePackages(@NonNull String[]); method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @Deprecated public abstract int installExistingPackage(String) throws android.content.pm.PackageManager.NameNotFoundException; @@ -4023,8 +4027,8 @@ package android.metrics { package android.net { public class CaptivePortal implements android.os.Parcelable { - ctor public CaptivePortal(android.os.IBinder); - method public void logEvent(int, String); + ctor public CaptivePortal(@NonNull android.os.IBinder); + method public void logEvent(int, @NonNull String); method public void useNetwork(); field public static final int APP_RETURN_DISMISSED = 0; // 0x0 field public static final int APP_RETURN_UNWANTED = 1; // 0x1 @@ -4040,7 +4044,7 @@ package android.net { method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported(); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean); - method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.net.Network, android.os.Bundle); + method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int); @@ -4071,8 +4075,8 @@ package android.net { } public final class IpPrefix implements android.os.Parcelable { - ctor public IpPrefix(java.net.InetAddress, int); - ctor public IpPrefix(String); + ctor public IpPrefix(@NonNull java.net.InetAddress, int); + ctor public IpPrefix(@NonNull String); } public final class IpSecManager { @@ -4095,57 +4099,47 @@ package android.net { ctor public LinkAddress(java.net.InetAddress, int, int, int); ctor public LinkAddress(@NonNull java.net.InetAddress, int); ctor public LinkAddress(@NonNull String); - ctor public LinkAddress(String, int, int); + ctor public LinkAddress(@NonNull String, int, int); method public boolean isGlobalPreferred(); - method public boolean isIPv4(); - method public boolean isIPv6(); - method public boolean isSameAddressAs(android.net.LinkAddress); + method public boolean isIpv4(); + method public boolean isIpv6(); + method public boolean isSameAddressAs(@Nullable android.net.LinkAddress); } public final class LinkProperties implements android.os.Parcelable { - ctor public LinkProperties(); - ctor public LinkProperties(android.net.LinkProperties); - method public boolean addDnsServer(java.net.InetAddress); - method public boolean addLinkAddress(android.net.LinkAddress); - method public boolean addRoute(android.net.RouteInfo); - method public void clear(); + ctor public LinkProperties(@Nullable android.net.LinkProperties); + method public boolean addDnsServer(@NonNull java.net.InetAddress); + method public boolean addLinkAddress(@NonNull android.net.LinkAddress); method @Nullable public android.net.IpPrefix getNat64Prefix(); - method public java.util.List<java.net.InetAddress> getPcscfServers(); - method public String getTcpBufferSizes(); - method public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); - method public boolean hasGlobalIPv6Address(); - method public boolean hasIPv4Address(); - method public boolean hasIPv6DefaultRoute(); - method public boolean isIPv4Provisioned(); - method public boolean isIPv6Provisioned(); + method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers(); + method @Nullable public String getTcpBufferSizes(); + method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); + method public boolean hasGlobalIpv6Address(); + method public boolean hasIpv4Address(); + method public boolean hasIpv6DefaultRoute(); + method public boolean isIpv4Provisioned(); + method public boolean isIpv6Provisioned(); method public boolean isProvisioned(); - method public boolean isReachable(java.net.InetAddress); - method public boolean removeDnsServer(java.net.InetAddress); - method public boolean removeLinkAddress(android.net.LinkAddress); - method public boolean removeRoute(android.net.RouteInfo); - method public void setDnsServers(java.util.Collection<java.net.InetAddress>); - method public void setDomains(String); - method public void setHttpProxy(android.net.ProxyInfo); - method public void setInterfaceName(String); - method public void setLinkAddresses(java.util.Collection<android.net.LinkAddress>); - method public void setMtu(int); - method public void setNat64Prefix(android.net.IpPrefix); - method public void setPcscfServers(java.util.Collection<java.net.InetAddress>); + method public boolean isReachable(@NonNull java.net.InetAddress); + method public boolean removeDnsServer(@NonNull java.net.InetAddress); + method public boolean removeLinkAddress(@NonNull android.net.LinkAddress); + method public boolean removeRoute(@NonNull android.net.RouteInfo); + method public void setNat64Prefix(@Nullable android.net.IpPrefix); + method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>); method public void setPrivateDnsServerName(@Nullable String); - method public void setTcpBufferSizes(String); + method public void setTcpBufferSizes(@Nullable String); method public void setUsePrivateDns(boolean); - method public void setValidatedPrivateDnsServers(java.util.Collection<java.net.InetAddress>); + method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); } public class Network implements android.os.Parcelable { - ctor public Network(android.net.Network); - method public android.net.Network getPrivateDnsBypassingCopy(); + ctor public Network(@NonNull android.net.Network); + method @NonNull public android.net.Network getPrivateDnsBypassingCopy(); } public final class NetworkCapabilities implements android.os.Parcelable { - method public int getSignalStrength(); - method public int[] getTransportTypes(); - method public boolean satisfiedByNetworkCapabilities(android.net.NetworkCapabilities); + method @NonNull public int[] getTransportTypes(); + method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities); field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16 field public static final int NET_CAPABILITY_PARTIAL_CONNECTIVITY = 24; // 0x18 } @@ -4167,7 +4161,7 @@ package android.net { } public static class NetworkRequest.Builder { - method public android.net.NetworkRequest.Builder setSignalStrength(int); + method @NonNull public android.net.NetworkRequest.Builder setSignalStrength(int); } public class NetworkScoreManager { @@ -4191,7 +4185,7 @@ package android.net { } public final class RouteInfo implements android.os.Parcelable { - ctor public RouteInfo(android.net.IpPrefix, java.net.InetAddress, String, int); + ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int); method public int getType(); field public static final int RTN_THROW = 9; // 0x9 field public static final int RTN_UNICAST = 1; // 0x1 @@ -4231,18 +4225,18 @@ package android.net { public final class StaticIpConfiguration implements android.os.Parcelable { ctor public StaticIpConfiguration(); - ctor public StaticIpConfiguration(android.net.StaticIpConfiguration); - method public void addDnsServer(java.net.InetAddress); + ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration); + method public void addDnsServer(@NonNull java.net.InetAddress); method public void clear(); method public int describeContents(); - method public java.util.List<java.net.InetAddress> getDnsServers(); - method public String getDomains(); - method public java.net.InetAddress getGateway(); - method public android.net.LinkAddress getIpAddress(); - method public java.util.List<android.net.RouteInfo> getRoutes(String); - method public void setDomains(String); - method public void setGateway(java.net.InetAddress); - method public void setIpAddress(android.net.LinkAddress); + method @NonNull public java.util.List<java.net.InetAddress> getDnsServers(); + method @Nullable public String getDomains(); + method @Nullable public java.net.InetAddress getGateway(); + method @Nullable public android.net.LinkAddress getIpAddress(); + method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(String); + method public void setDomains(@Nullable String); + method public void setGateway(@Nullable java.net.InetAddress); + method public void setIpAddress(@Nullable android.net.LinkAddress); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR; } @@ -4280,8 +4274,8 @@ package android.net.apf { public final class ApfCapabilities implements android.os.Parcelable { ctor public ApfCapabilities(int, int, int); method public int describeContents(); - method public static boolean getApfDrop8023Frames(android.content.Context); - method public static int[] getApfEthTypeBlackList(android.content.Context); + method public static boolean getApfDrop8023Frames(@NonNull android.content.Context); + method @NonNull public static int[] getApfEthTypeBlackList(@NonNull android.content.Context); method public boolean hasDataAccess(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR; @@ -4296,28 +4290,28 @@ package android.net.captiveportal { public final class CaptivePortalProbeResult { ctor public CaptivePortalProbeResult(int); - ctor public CaptivePortalProbeResult(int, String, String); - ctor public CaptivePortalProbeResult(int, String, String, android.net.captiveportal.CaptivePortalProbeSpec); + ctor public CaptivePortalProbeResult(int, @Nullable String, @Nullable String); + ctor public CaptivePortalProbeResult(int, @Nullable String, @Nullable String, @Nullable android.net.captiveportal.CaptivePortalProbeSpec); method public boolean isFailed(); method public boolean isPartialConnectivity(); method public boolean isPortal(); method public boolean isSuccessful(); - field public static final android.net.captiveportal.CaptivePortalProbeResult FAILED; + field @NonNull public static final android.net.captiveportal.CaptivePortalProbeResult FAILED; field public static final int FAILED_CODE = 599; // 0x257 field public static final android.net.captiveportal.CaptivePortalProbeResult PARTIAL; field public static final int PORTAL_CODE = 302; // 0x12e - field public static final android.net.captiveportal.CaptivePortalProbeResult SUCCESS; + field @NonNull public static final android.net.captiveportal.CaptivePortalProbeResult SUCCESS; field public static final int SUCCESS_CODE = 204; // 0xcc - field public final String detectUrl; + field @Nullable public final String detectUrl; field @Nullable public final android.net.captiveportal.CaptivePortalProbeSpec probeSpec; - field public final String redirectUrl; + field @Nullable public final String redirectUrl; } public abstract class CaptivePortalProbeSpec { - method public String getEncodedSpec(); - method public abstract android.net.captiveportal.CaptivePortalProbeResult getResult(int, @Nullable String); - method public java.net.URL getUrl(); - method public static java.util.Collection<android.net.captiveportal.CaptivePortalProbeSpec> parseCaptivePortalProbeSpecs(String); + method @NonNull public String getEncodedSpec(); + method @NonNull public abstract android.net.captiveportal.CaptivePortalProbeResult getResult(int, @Nullable String); + method @NonNull public java.net.URL getUrl(); + method @NonNull public static java.util.Collection<android.net.captiveportal.CaptivePortalProbeSpec> parseCaptivePortalProbeSpecs(@NonNull String); method @Nullable public static android.net.captiveportal.CaptivePortalProbeSpec parseSpecOrNull(@Nullable String); } @@ -4328,78 +4322,78 @@ package android.net.metrics { public final class ApfProgramEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class ApfProgramEvent.Builder { + public static final class ApfProgramEvent.Builder { ctor public ApfProgramEvent.Builder(); - method public android.net.metrics.ApfProgramEvent build(); - method public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); - method public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); - method public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); - method public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); - method public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); - method public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); + method @NonNull public android.net.metrics.ApfProgramEvent build(); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); } public final class ApfStats implements android.net.metrics.IpConnectivityLog.Event { } - public static class ApfStats.Builder { + public static final class ApfStats.Builder { ctor public ApfStats.Builder(); - method public android.net.metrics.ApfStats build(); - method public android.net.metrics.ApfStats.Builder setDroppedRas(int); - method public android.net.metrics.ApfStats.Builder setDurationMs(long); - method public android.net.metrics.ApfStats.Builder setMatchingRas(int); - method public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); - method public android.net.metrics.ApfStats.Builder setParseErrors(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdates(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); - method public android.net.metrics.ApfStats.Builder setReceivedRas(int); - method public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); + method @NonNull public android.net.metrics.ApfStats build(); + method @NonNull public android.net.metrics.ApfStats.Builder setDroppedRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setDurationMs(long); + method @NonNull public android.net.metrics.ApfStats.Builder setMatchingRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); + method @NonNull public android.net.metrics.ApfStats.Builder setParseErrors(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdates(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); + method @NonNull public android.net.metrics.ApfStats.Builder setReceivedRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); } public final class DhcpClientEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class DhcpClientEvent.Builder { + public static final class DhcpClientEvent.Builder { ctor public DhcpClientEvent.Builder(); - method public android.net.metrics.DhcpClientEvent build(); - method public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); - method public android.net.metrics.DhcpClientEvent.Builder setMsg(String); + method @NonNull public android.net.metrics.DhcpClientEvent build(); + method @NonNull public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); + method @NonNull public android.net.metrics.DhcpClientEvent.Builder setMsg(String); } public final class DhcpErrorEvent implements android.net.metrics.IpConnectivityLog.Event { ctor public DhcpErrorEvent(int); method public static int errorCodeWithOption(int, int); - field public static final int BOOTP_TOO_SHORT; - field public static final int BUFFER_UNDERFLOW; - field public static final int DHCP_BAD_MAGIC_COOKIE; + field public static final int BOOTP_TOO_SHORT = 67174400; // 0x4010000 + field public static final int BUFFER_UNDERFLOW = 83951616; // 0x5010000 + field public static final int DHCP_BAD_MAGIC_COOKIE = 67239936; // 0x4020000 field public static final int DHCP_ERROR = 4; // 0x4 - field public static final int DHCP_INVALID_OPTION_LENGTH; - field public static final int DHCP_NO_COOKIE; - field public static final int DHCP_NO_MSG_TYPE; - field public static final int DHCP_UNKNOWN_MSG_TYPE; + field public static final int DHCP_INVALID_OPTION_LENGTH = 67305472; // 0x4030000 + field public static final int DHCP_NO_COOKIE = 67502080; // 0x4060000 + field public static final int DHCP_NO_MSG_TYPE = 67371008; // 0x4040000 + field public static final int DHCP_UNKNOWN_MSG_TYPE = 67436544; // 0x4050000 field public static final int L2_ERROR = 1; // 0x1 - field public static final int L2_TOO_SHORT; - field public static final int L2_WRONG_ETH_TYPE; + field public static final int L2_TOO_SHORT = 16842752; // 0x1010000 + field public static final int L2_WRONG_ETH_TYPE = 16908288; // 0x1020000 field public static final int L3_ERROR = 2; // 0x2 - field public static final int L3_INVALID_IP; - field public static final int L3_NOT_IPV4; - field public static final int L3_TOO_SHORT; + field public static final int L3_INVALID_IP = 33751040; // 0x2030000 + field public static final int L3_NOT_IPV4 = 33685504; // 0x2020000 + field public static final int L3_TOO_SHORT = 33619968; // 0x2010000 field public static final int L4_ERROR = 3; // 0x3 - field public static final int L4_NOT_UDP; - field public static final int L4_WRONG_PORT; + field public static final int L4_NOT_UDP = 50397184; // 0x3010000 + field public static final int L4_WRONG_PORT = 50462720; // 0x3020000 field public static final int MISC_ERROR = 5; // 0x5 - field public static final int PARSING_ERROR; - field public static final int RECEIVE_ERROR; + field public static final int PARSING_ERROR = 84082688; // 0x5030000 + field public static final int RECEIVE_ERROR = 84017152; // 0x5020000 } public class IpConnectivityLog { ctor public IpConnectivityLog(); - method public boolean log(long, android.net.metrics.IpConnectivityLog.Event); - method public boolean log(String, android.net.metrics.IpConnectivityLog.Event); - method public boolean log(android.net.Network, int[], android.net.metrics.IpConnectivityLog.Event); - method public boolean log(int, int[], android.net.metrics.IpConnectivityLog.Event); - method public boolean log(android.net.metrics.IpConnectivityLog.Event); + method public boolean log(long, @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull String, @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull android.net.Network, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(int, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull android.net.metrics.IpConnectivityLog.Event); } public static interface IpConnectivityLog.Event extends android.os.Parcelable { @@ -4447,15 +4441,15 @@ package android.net.metrics { public final class RaEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class RaEvent.Builder { + public static final class RaEvent.Builder { ctor public RaEvent.Builder(); - method public android.net.metrics.RaEvent build(); - method public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); - method public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); - method public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); + method @NonNull public android.net.metrics.RaEvent build(); + method @NonNull public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); } public final class ValidationProbeEvent implements android.net.metrics.IpConnectivityLog.Event { @@ -4470,12 +4464,12 @@ package android.net.metrics { field public static final int PROBE_PRIVDNS = 5; // 0x5 } - public static class ValidationProbeEvent.Builder { + public static final class ValidationProbeEvent.Builder { ctor public ValidationProbeEvent.Builder(); - method public android.net.metrics.ValidationProbeEvent build(); - method public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); - method public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); - method public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); + method @NonNull public android.net.metrics.ValidationProbeEvent build(); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); } } @@ -5488,7 +5482,7 @@ package android.os { } public class ServiceSpecificException extends java.lang.RuntimeException { - ctor public ServiceSpecificException(int, String); + ctor public ServiceSpecificException(int, @Nullable String); ctor public ServiceSpecificException(int); field public final int errorCode; } @@ -5726,10 +5720,10 @@ package android.permission { } public final class RuntimePermissionUsageInfo implements android.os.Parcelable { - ctor public RuntimePermissionUsageInfo(@NonNull CharSequence, int); + ctor public RuntimePermissionUsageInfo(@NonNull String, int); method public int describeContents(); method public int getAppAccessCount(); - method @NonNull public CharSequence getName(); + method @NonNull public String getName(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR; } @@ -6636,6 +6630,7 @@ package android.service.notification { method public final void adjustNotifications(@NonNull java.util.List<android.service.notification.Adjustment>); method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int); method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent); + method public void onCapabilitiesChanged(); method public void onNotificationDirectReplied(@NonNull String); method @Nullable public abstract android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification); method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel); @@ -7719,19 +7714,19 @@ package android.telephony { ctor public NetworkService(); method public android.os.IBinder onBind(android.content.Intent); method @Nullable public abstract android.telephony.NetworkService.NetworkServiceProvider onCreateNetworkServiceProvider(int); - field public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService"; + field public static final String SERVICE_INTERFACE = "android.telephony.NetworkService"; } public abstract class NetworkService.NetworkServiceProvider implements java.lang.AutoCloseable { ctor public NetworkService.NetworkServiceProvider(int); method public abstract void close(); - method public void getNetworkRegistrationInfo(int, @NonNull android.telephony.NetworkServiceCallback); method public final int getSlotIndex(); method public final void notifyNetworkRegistrationInfoChanged(); + method public void requestNetworkRegistrationInfo(int, @NonNull android.telephony.NetworkServiceCallback); } public class NetworkServiceCallback { - method public void onGetNetworkRegistrationInfoComplete(int, @Nullable android.telephony.NetworkRegistrationInfo); + method public void onRequestNetworkRegistrationInfoComplete(int, @Nullable android.telephony.NetworkRegistrationInfo); field public static final int RESULT_ERROR_BUSY = 3; // 0x3 field public static final int RESULT_ERROR_FAILED = 5; // 0x5 field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4 @@ -8033,7 +8028,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmi(String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmiForSubscriber(int, String); - method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int); method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String); method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); @@ -8164,39 +8159,55 @@ package android.telephony { package android.telephony.data { public final class DataCallResponse implements android.os.Parcelable { - ctor public DataCallResponse(int, int, int, int, int, @Nullable String, @Nullable java.util.List<android.net.LinkAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.lang.String>, int); method public int describeContents(); - method public int getActive(); method @NonNull public java.util.List<android.net.LinkAddress> getAddresses(); - method public int getCallId(); - method @NonNull public java.util.List<java.net.InetAddress> getDnses(); - method @NonNull public java.util.List<java.net.InetAddress> getGateways(); - method @NonNull public String getIfname(); + method public int getCause(); + method @NonNull public java.util.List<java.net.InetAddress> getDnsAddresses(); + method @NonNull public java.util.List<java.net.InetAddress> getGatewayAddresses(); + method public int getId(); + method @NonNull public String getInterfaceName(); + method public int getLinkStatus(); method public int getMtu(); - method @NonNull public java.util.List<java.lang.String> getPcscfs(); + method @NonNull public java.util.List<java.net.InetAddress> getPcscfAddresses(); method public int getProtocolType(); - method public int getStatus(); method public int getSuggestedRetryTime(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR; + field public static final int LINK_STATUS_ACTIVE = 2; // 0x2 + field public static final int LINK_STATUS_DORMANT = 1; // 0x1 + field public static final int LINK_STATUS_INACTIVE = 0; // 0x0 + field public static final int LINK_STATUS_UNKNOWN = -1; // 0xffffffff + } + + public static final class DataCallResponse.Builder { + ctor public DataCallResponse.Builder(); + method @NonNull public android.telephony.data.DataCallResponse build(); + method @NonNull public android.telephony.data.DataCallResponse.Builder setAddresses(@NonNull java.util.List<android.net.LinkAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setCause(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setDnsAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setGatewayAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setId(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setInterfaceName(@NonNull String); + method @NonNull public android.telephony.data.DataCallResponse.Builder setLinkStatus(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setMtu(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setPcscfAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setProtocolType(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int); } public final class DataProfile implements android.os.Parcelable { method public int describeContents(); method @NonNull public String getApn(); method public int getAuthType(); - method public int getBearerBitmap(); - method public int getMaxConns(); - method public int getMaxConnsTime(); + method public int getBearerBitmask(); method public int getMtu(); method @Nullable public String getPassword(); method public int getProfileId(); - method public int getProtocol(); - method public int getRoamingProtocol(); - method public int getSupportedApnTypesBitmap(); + method public int getProtocolType(); + method public int getRoamingProtocolType(); + method public int getSupportedApnTypesBitmask(); method public int getType(); method @Nullable public String getUserName(); - method public int getWaitTime(); method public boolean isEnabled(); method public boolean isPersistent(); method public boolean isPreferred(); @@ -8207,32 +8218,52 @@ package android.telephony.data { field public static final int TYPE_COMMON = 0; // 0x0 } + public static final class DataProfile.Builder { + ctor public DataProfile.Builder(); + method @NonNull public android.telephony.data.DataProfile build(); + method @NonNull public android.telephony.data.DataProfile.Builder enable(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setApn(@NonNull String); + method @NonNull public android.telephony.data.DataProfile.Builder setAuthType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setBearerBitmask(int); + method @NonNull public android.telephony.data.DataProfile.Builder setMtu(int); + method @NonNull public android.telephony.data.DataProfile.Builder setPassword(@NonNull String); + method @NonNull public android.telephony.data.DataProfile.Builder setPersistent(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setPreferred(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setProfileId(int); + method @NonNull public android.telephony.data.DataProfile.Builder setProtocolType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setRoamingProtocolType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setSupportedApnTypesBitmask(int); + method @NonNull public android.telephony.data.DataProfile.Builder setType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setUserName(@NonNull String); + } + public abstract class DataService extends android.app.Service { ctor public DataService(); method public android.os.IBinder onBind(android.content.Intent); method @Nullable public abstract android.telephony.data.DataService.DataServiceProvider onCreateDataServiceProvider(int); - field public static final String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService"; field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3 field public static final int REQUEST_REASON_NORMAL = 1; // 0x1 field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2 + field public static final int REQUEST_REASON_UNKNOWN = 0; // 0x0 + field public static final String SERVICE_INTERFACE = "android.telephony.data.DataService"; } public abstract class DataService.DataServiceProvider implements java.lang.AutoCloseable { ctor public DataService.DataServiceProvider(int); method public abstract void close(); method public void deactivateDataCall(int, int, @Nullable android.telephony.data.DataServiceCallback); - method public void getDataCallList(@NonNull android.telephony.data.DataServiceCallback); method public final int getSlotIndex(); method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>); - method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @Nullable android.telephony.data.DataServiceCallback); - method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @Nullable android.telephony.data.DataServiceCallback); - method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @Nullable android.telephony.data.DataServiceCallback); + method public void requestDataCallList(@NonNull android.telephony.data.DataServiceCallback); + method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback); + method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback); + method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback); } public class DataServiceCallback { method public void onDataCallListChanged(@NonNull java.util.List<android.telephony.data.DataCallResponse>); method public void onDeactivateDataCallComplete(int); - method public void onGetDataCallListComplete(int, @NonNull java.util.List<android.telephony.data.DataCallResponse>); + method public void onRequestDataCallListComplete(int, @NonNull java.util.List<android.telephony.data.DataCallResponse>); method public void onSetDataProfileComplete(int); method public void onSetInitialAttachApnComplete(int); method public void onSetupDataCallComplete(int, @Nullable android.telephony.data.DataCallResponse); @@ -8245,15 +8276,15 @@ package android.telephony.data { public abstract class QualifiedNetworksService extends android.app.Service { ctor public QualifiedNetworksService(); - method @NonNull public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int); + method @NonNull public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityProvider onCreateNetworkAvailabilityProvider(int); field public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService"; } - public abstract class QualifiedNetworksService.NetworkAvailabilityUpdater implements java.lang.AutoCloseable { - ctor public QualifiedNetworksService.NetworkAvailabilityUpdater(int); + public abstract class QualifiedNetworksService.NetworkAvailabilityProvider implements java.lang.AutoCloseable { + ctor public QualifiedNetworksService.NetworkAvailabilityProvider(int); method public abstract void close(); method public final int getSlotIndex(); - method public final void updateQualifiedNetworkTypes(int, @Nullable int[]); + method public final void updateQualifiedNetworkTypes(int, @NonNull java.util.List<java.lang.Integer>); } } diff --git a/api/system-removed.txt b/api/system-removed.txt index 7e044698c72c..9780d43624fa 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -141,3 +141,11 @@ package android.telephony { } +package android.telephony.data { + + public final class DataCallResponse implements android.os.Parcelable { + ctor public DataCallResponse(int, int, int, int, int, @Nullable String, @Nullable java.util.List<android.net.LinkAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, int); + } + +} + diff --git a/api/test-current.txt b/api/test-current.txt index 583bf62160de..417a9edf3720 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -420,7 +420,8 @@ package android.app.backup { public class BackupManager { method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getConfigurationIntent(String); method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getDataManagementIntent(String); - method @RequiresPermission("android.permission.BACKUP") public String getDataManagementLabel(String); + method @Nullable @RequiresPermission("android.permission.BACKUP") public CharSequence getDataManagementIntentLabel(@NonNull String); + method @Deprecated @Nullable @RequiresPermission("android.permission.BACKUP") public String getDataManagementLabel(@NonNull String); method @RequiresPermission("android.permission.BACKUP") public String getDestinationString(String); } @@ -1077,6 +1078,17 @@ package android.media { method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int); } + public class CallbackDataSourceDesc extends android.media.DataSourceDesc { + method @NonNull public android.media.DataSourceCallback getDataSourceCallback(); + } + + public class FileDataSourceDesc extends android.media.DataSourceDesc { + method public long getLength(); + method public long getOffset(); + method @NonNull public android.os.ParcelFileDescriptor getParcelFileDescriptor(); + field public static final long FD_LENGTH_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL + } + public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint { ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size); ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size); @@ -1101,6 +1113,12 @@ package android.media { method public android.media.PlaybackParams setAudioStretchMode(int); } + public class UriDataSourceDesc extends android.media.DataSourceDesc { + method @Nullable public java.util.List<java.net.HttpCookie> getCookies(); + method @Nullable public java.util.Map<java.lang.String,java.lang.String> getHeaders(); + method @NonNull public android.net.Uri getUri(); + } + public static final class VolumeShaper.Configuration.Builder { method @NonNull public android.media.VolumeShaper.Configuration.Builder setOptionFlags(int); } @@ -1189,8 +1207,8 @@ package android.metrics { package android.net { public class CaptivePortal implements android.os.Parcelable { - ctor public CaptivePortal(android.os.IBinder); - method public void logEvent(int, String); + ctor public CaptivePortal(@NonNull android.os.IBinder); + method public void logEvent(int, @NonNull String); method public void useNetwork(); field public static final int APP_RETURN_DISMISSED = 0; // 0x0 field public static final int APP_RETURN_UNWANTED = 1; // 0x1 @@ -1198,14 +1216,14 @@ package android.net { } public class ConnectivityManager { - method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.net.Network, android.os.Bundle); + method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle); field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; } public final class IpPrefix implements android.os.Parcelable { - ctor public IpPrefix(java.net.InetAddress, int); - ctor public IpPrefix(String); + ctor public IpPrefix(@NonNull java.net.InetAddress, int); + ctor public IpPrefix(@NonNull String); } public final class IpSecManager { @@ -1216,48 +1234,48 @@ package android.net { ctor public LinkAddress(java.net.InetAddress, int, int, int); ctor public LinkAddress(@NonNull java.net.InetAddress, int); ctor public LinkAddress(@NonNull String); - ctor public LinkAddress(String, int, int); + ctor public LinkAddress(@NonNull String, int, int); method public boolean isGlobalPreferred(); - method public boolean isIPv4(); - method public boolean isIPv6(); - method public boolean isSameAddressAs(android.net.LinkAddress); + method public boolean isIpv4(); + method public boolean isIpv6(); + method public boolean isSameAddressAs(@Nullable android.net.LinkAddress); } public final class LinkProperties implements android.os.Parcelable { - ctor public LinkProperties(android.net.LinkProperties); - method public boolean addDnsServer(java.net.InetAddress); - method public boolean addLinkAddress(android.net.LinkAddress); + ctor public LinkProperties(@Nullable android.net.LinkProperties); + method public boolean addDnsServer(@NonNull java.net.InetAddress); + method public boolean addLinkAddress(@NonNull android.net.LinkAddress); method @Nullable public android.net.IpPrefix getNat64Prefix(); - method public java.util.List<java.net.InetAddress> getPcscfServers(); - method public String getTcpBufferSizes(); - method public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); - method public boolean hasGlobalIPv6Address(); - method public boolean hasIPv4Address(); - method public boolean hasIPv6DefaultRoute(); - method public boolean isIPv4Provisioned(); - method public boolean isIPv6Provisioned(); + method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers(); + method @Nullable public String getTcpBufferSizes(); + method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); + method public boolean hasGlobalIpv6Address(); + method public boolean hasIpv4Address(); + method public boolean hasIpv6DefaultRoute(); + method public boolean isIpv4Provisioned(); + method public boolean isIpv6Provisioned(); method public boolean isProvisioned(); - method public boolean isReachable(java.net.InetAddress); - method public boolean removeDnsServer(java.net.InetAddress); - method public boolean removeLinkAddress(android.net.LinkAddress); - method public boolean removeRoute(android.net.RouteInfo); - method public void setNat64Prefix(android.net.IpPrefix); - method public void setPcscfServers(java.util.Collection<java.net.InetAddress>); + method public boolean isReachable(@NonNull java.net.InetAddress); + method public boolean removeDnsServer(@NonNull java.net.InetAddress); + method public boolean removeLinkAddress(@NonNull android.net.LinkAddress); + method public boolean removeRoute(@NonNull android.net.RouteInfo); + method public void setNat64Prefix(@Nullable android.net.IpPrefix); + method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>); method public void setPrivateDnsServerName(@Nullable String); - method public void setTcpBufferSizes(String); + method public void setTcpBufferSizes(@Nullable String); method public void setUsePrivateDns(boolean); - method public void setValidatedPrivateDnsServers(java.util.Collection<java.net.InetAddress>); + method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); } public class Network implements android.os.Parcelable { - ctor public Network(android.net.Network); - method public android.net.Network getPrivateDnsBypassingCopy(); + ctor public Network(@NonNull android.net.Network); + method @NonNull public android.net.Network getPrivateDnsBypassingCopy(); } public final class NetworkCapabilities implements android.os.Parcelable { method public int[] getCapabilities(); - method public int[] getTransportTypes(); - method public boolean satisfiedByNetworkCapabilities(android.net.NetworkCapabilities); + method @NonNull public int[] getTransportTypes(); + method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities); field public static final int TRANSPORT_TEST = 7; // 0x7 } @@ -1266,7 +1284,7 @@ package android.net { } public final class RouteInfo implements android.os.Parcelable { - ctor public RouteInfo(android.net.IpPrefix, java.net.InetAddress, String, int); + ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int); method public int getType(); field public static final int RTN_THROW = 9; // 0x9 field public static final int RTN_UNICAST = 1; // 0x1 @@ -1275,18 +1293,18 @@ package android.net { public final class StaticIpConfiguration implements android.os.Parcelable { ctor public StaticIpConfiguration(); - ctor public StaticIpConfiguration(android.net.StaticIpConfiguration); - method public void addDnsServer(java.net.InetAddress); + ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration); + method public void addDnsServer(@NonNull java.net.InetAddress); method public void clear(); method public int describeContents(); - method public java.util.List<java.net.InetAddress> getDnsServers(); - method public String getDomains(); - method public java.net.InetAddress getGateway(); - method public android.net.LinkAddress getIpAddress(); - method public java.util.List<android.net.RouteInfo> getRoutes(String); - method public void setDomains(String); - method public void setGateway(java.net.InetAddress); - method public void setIpAddress(android.net.LinkAddress); + method @NonNull public java.util.List<java.net.InetAddress> getDnsServers(); + method @Nullable public String getDomains(); + method @Nullable public java.net.InetAddress getGateway(); + method @Nullable public android.net.LinkAddress getIpAddress(); + method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(String); + method public void setDomains(@Nullable String); + method public void setGateway(@Nullable java.net.InetAddress); + method public void setIpAddress(@Nullable android.net.LinkAddress); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR; } @@ -1323,8 +1341,8 @@ package android.net.apf { public final class ApfCapabilities implements android.os.Parcelable { ctor public ApfCapabilities(int, int, int); method public int describeContents(); - method public static boolean getApfDrop8023Frames(android.content.Context); - method public static int[] getApfEthTypeBlackList(android.content.Context); + method public static boolean getApfDrop8023Frames(@NonNull android.content.Context); + method @NonNull public static int[] getApfEthTypeBlackList(@NonNull android.content.Context); method public boolean hasDataAccess(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR; @@ -1339,28 +1357,28 @@ package android.net.captiveportal { public final class CaptivePortalProbeResult { ctor public CaptivePortalProbeResult(int); - ctor public CaptivePortalProbeResult(int, String, String); - ctor public CaptivePortalProbeResult(int, String, String, android.net.captiveportal.CaptivePortalProbeSpec); + ctor public CaptivePortalProbeResult(int, @Nullable String, @Nullable String); + ctor public CaptivePortalProbeResult(int, @Nullable String, @Nullable String, @Nullable android.net.captiveportal.CaptivePortalProbeSpec); method public boolean isFailed(); method public boolean isPartialConnectivity(); method public boolean isPortal(); method public boolean isSuccessful(); - field public static final android.net.captiveportal.CaptivePortalProbeResult FAILED; + field @NonNull public static final android.net.captiveportal.CaptivePortalProbeResult FAILED; field public static final int FAILED_CODE = 599; // 0x257 field public static final android.net.captiveportal.CaptivePortalProbeResult PARTIAL; field public static final int PORTAL_CODE = 302; // 0x12e - field public static final android.net.captiveportal.CaptivePortalProbeResult SUCCESS; + field @NonNull public static final android.net.captiveportal.CaptivePortalProbeResult SUCCESS; field public static final int SUCCESS_CODE = 204; // 0xcc - field public final String detectUrl; + field @Nullable public final String detectUrl; field @Nullable public final android.net.captiveportal.CaptivePortalProbeSpec probeSpec; - field public final String redirectUrl; + field @Nullable public final String redirectUrl; } public abstract class CaptivePortalProbeSpec { - method public String getEncodedSpec(); - method public abstract android.net.captiveportal.CaptivePortalProbeResult getResult(int, @Nullable String); - method public java.net.URL getUrl(); - method public static java.util.Collection<android.net.captiveportal.CaptivePortalProbeSpec> parseCaptivePortalProbeSpecs(String); + method @NonNull public String getEncodedSpec(); + method @NonNull public abstract android.net.captiveportal.CaptivePortalProbeResult getResult(int, @Nullable String); + method @NonNull public java.net.URL getUrl(); + method @NonNull public static java.util.Collection<android.net.captiveportal.CaptivePortalProbeSpec> parseCaptivePortalProbeSpecs(@NonNull String); method @Nullable public static android.net.captiveportal.CaptivePortalProbeSpec parseSpecOrNull(@Nullable String); } @@ -1371,78 +1389,78 @@ package android.net.metrics { public final class ApfProgramEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class ApfProgramEvent.Builder { + public static final class ApfProgramEvent.Builder { ctor public ApfProgramEvent.Builder(); - method public android.net.metrics.ApfProgramEvent build(); - method public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); - method public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); - method public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); - method public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); - method public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); - method public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); + method @NonNull public android.net.metrics.ApfProgramEvent build(); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); + method @NonNull public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); } public final class ApfStats implements android.net.metrics.IpConnectivityLog.Event { } - public static class ApfStats.Builder { + public static final class ApfStats.Builder { ctor public ApfStats.Builder(); - method public android.net.metrics.ApfStats build(); - method public android.net.metrics.ApfStats.Builder setDroppedRas(int); - method public android.net.metrics.ApfStats.Builder setDurationMs(long); - method public android.net.metrics.ApfStats.Builder setMatchingRas(int); - method public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); - method public android.net.metrics.ApfStats.Builder setParseErrors(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdates(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); - method public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); - method public android.net.metrics.ApfStats.Builder setReceivedRas(int); - method public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); + method @NonNull public android.net.metrics.ApfStats build(); + method @NonNull public android.net.metrics.ApfStats.Builder setDroppedRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setDurationMs(long); + method @NonNull public android.net.metrics.ApfStats.Builder setMatchingRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); + method @NonNull public android.net.metrics.ApfStats.Builder setParseErrors(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdates(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); + method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); + method @NonNull public android.net.metrics.ApfStats.Builder setReceivedRas(int); + method @NonNull public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); } public final class DhcpClientEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class DhcpClientEvent.Builder { + public static final class DhcpClientEvent.Builder { ctor public DhcpClientEvent.Builder(); - method public android.net.metrics.DhcpClientEvent build(); - method public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); - method public android.net.metrics.DhcpClientEvent.Builder setMsg(String); + method @NonNull public android.net.metrics.DhcpClientEvent build(); + method @NonNull public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); + method @NonNull public android.net.metrics.DhcpClientEvent.Builder setMsg(String); } public final class DhcpErrorEvent implements android.net.metrics.IpConnectivityLog.Event { ctor public DhcpErrorEvent(int); method public static int errorCodeWithOption(int, int); - field public static final int BOOTP_TOO_SHORT; - field public static final int BUFFER_UNDERFLOW; - field public static final int DHCP_BAD_MAGIC_COOKIE; + field public static final int BOOTP_TOO_SHORT = 67174400; // 0x4010000 + field public static final int BUFFER_UNDERFLOW = 83951616; // 0x5010000 + field public static final int DHCP_BAD_MAGIC_COOKIE = 67239936; // 0x4020000 field public static final int DHCP_ERROR = 4; // 0x4 - field public static final int DHCP_INVALID_OPTION_LENGTH; - field public static final int DHCP_NO_COOKIE; - field public static final int DHCP_NO_MSG_TYPE; - field public static final int DHCP_UNKNOWN_MSG_TYPE; + field public static final int DHCP_INVALID_OPTION_LENGTH = 67305472; // 0x4030000 + field public static final int DHCP_NO_COOKIE = 67502080; // 0x4060000 + field public static final int DHCP_NO_MSG_TYPE = 67371008; // 0x4040000 + field public static final int DHCP_UNKNOWN_MSG_TYPE = 67436544; // 0x4050000 field public static final int L2_ERROR = 1; // 0x1 - field public static final int L2_TOO_SHORT; - field public static final int L2_WRONG_ETH_TYPE; + field public static final int L2_TOO_SHORT = 16842752; // 0x1010000 + field public static final int L2_WRONG_ETH_TYPE = 16908288; // 0x1020000 field public static final int L3_ERROR = 2; // 0x2 - field public static final int L3_INVALID_IP; - field public static final int L3_NOT_IPV4; - field public static final int L3_TOO_SHORT; + field public static final int L3_INVALID_IP = 33751040; // 0x2030000 + field public static final int L3_NOT_IPV4 = 33685504; // 0x2020000 + field public static final int L3_TOO_SHORT = 33619968; // 0x2010000 field public static final int L4_ERROR = 3; // 0x3 - field public static final int L4_NOT_UDP; - field public static final int L4_WRONG_PORT; + field public static final int L4_NOT_UDP = 50397184; // 0x3010000 + field public static final int L4_WRONG_PORT = 50462720; // 0x3020000 field public static final int MISC_ERROR = 5; // 0x5 - field public static final int PARSING_ERROR; - field public static final int RECEIVE_ERROR; + field public static final int PARSING_ERROR = 84082688; // 0x5030000 + field public static final int RECEIVE_ERROR = 84017152; // 0x5020000 } public class IpConnectivityLog { ctor public IpConnectivityLog(); - method public boolean log(long, android.net.metrics.IpConnectivityLog.Event); - method public boolean log(String, android.net.metrics.IpConnectivityLog.Event); - method public boolean log(android.net.Network, int[], android.net.metrics.IpConnectivityLog.Event); - method public boolean log(int, int[], android.net.metrics.IpConnectivityLog.Event); - method public boolean log(android.net.metrics.IpConnectivityLog.Event); + method public boolean log(long, @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull String, @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull android.net.Network, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(int, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); + method public boolean log(@NonNull android.net.metrics.IpConnectivityLog.Event); } public static interface IpConnectivityLog.Event extends android.os.Parcelable { @@ -1490,15 +1508,15 @@ package android.net.metrics { public final class RaEvent implements android.net.metrics.IpConnectivityLog.Event { } - public static class RaEvent.Builder { + public static final class RaEvent.Builder { ctor public RaEvent.Builder(); - method public android.net.metrics.RaEvent build(); - method public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); - method public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); - method public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); - method public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); + method @NonNull public android.net.metrics.RaEvent build(); + method @NonNull public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); + method @NonNull public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); } public final class ValidationProbeEvent implements android.net.metrics.IpConnectivityLog.Event { @@ -1513,12 +1531,12 @@ package android.net.metrics { field public static final int PROBE_PRIVDNS = 5; // 0x5 } - public static class ValidationProbeEvent.Builder { + public static final class ValidationProbeEvent.Builder { ctor public ValidationProbeEvent.Builder(); - method public android.net.metrics.ValidationProbeEvent build(); - method public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); - method public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); - method public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); + method @NonNull public android.net.metrics.ValidationProbeEvent build(); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); + method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); } } @@ -3185,10 +3203,6 @@ package android.view.inputmethod { package android.view.inspector { - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public @interface InspectableNodeName { - method public abstract String value(); - } - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface InspectableProperty { method public abstract int attributeId() default android.content.res.Resources.ID_NULL; method public abstract android.view.inspector.InspectableProperty.EnumEntry[] enumMapping() default {}; diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp index fdbb21044176..47617e045c12 100644 --- a/cmds/idmap2/idmap2/Create.cpp +++ b/cmds/idmap2/idmap2/Create.cpp @@ -98,12 +98,10 @@ Result<Unit> Create(const std::vector<std::string>& args) { return Error("failed to load apk %s", overlay_apk_path.c_str()); } - std::stringstream stream; - const std::unique_ptr<const Idmap> idmap = - Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - fulfilled_policies, !ignore_overlayable, stream); + const auto idmap = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, + *overlay_apk, fulfilled_policies, !ignore_overlayable); if (!idmap) { - return Error("failed to create idmap: %s", stream.str().c_str()); + return Error(idmap.GetError(), "failed to create idmap"); } umask(kIdmapFilePermissionMask); @@ -112,7 +110,7 @@ Result<Unit> Create(const std::vector<std::string>& args) { return Error("failed to open idmap path %s", idmap_path.c_str()); } BinaryStreamVisitor visitor(fout); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); fout.close(); if (fout.fail()) { return Error("failed to write to idmap path %s", idmap_path.c_str()); diff --git a/cmds/idmap2/idmap2/Dump.cpp b/cmds/idmap2/idmap2/Dump.cpp index fd5822251188..8716bf313ed0 100644 --- a/cmds/idmap2/idmap2/Dump.cpp +++ b/cmds/idmap2/idmap2/Dump.cpp @@ -49,20 +49,19 @@ Result<Unit> Dump(const std::vector<std::string>& args) { if (!opts_ok) { return opts_ok.GetError(); } - std::stringstream stream; std::ifstream fin(idmap_path); - const std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(fin, stream); + const auto idmap = Idmap::FromBinaryStream(fin); fin.close(); if (!idmap) { - return Error("failed to load idmap: %s", stream.str().c_str()); + return Error(idmap.GetError(), "failed to load idmap"); } if (verbose) { RawPrintVisitor visitor(std::cout); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); } else { PrettyPrintVisitor visitor(std::cout); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); } return Unit{}; diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index e03a9cc1032e..4f653796ce3f 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -138,12 +138,10 @@ Status Idmap2Service::createIdmap(const std::string& target_apk_path, return error("failed to load apk " + overlay_apk_path); } - std::stringstream err; - const std::unique_ptr<const Idmap> idmap = - Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - policy_bitmask, enforce_overlayable, err); + const auto idmap = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, + *overlay_apk, policy_bitmask, enforce_overlayable); if (!idmap) { - return error(err.str()); + return error(idmap.GetErrorMessage()); } umask(kIdmapFilePermissionMask); @@ -152,7 +150,7 @@ Status Idmap2Service::createIdmap(const std::string& target_apk_path, return error("failed to open idmap path " + idmap_path); } BinaryStreamVisitor visitor(fout); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); fout.close(); if (fout.fail()) { return error("failed to write to idmap path " + idmap_path); diff --git a/cmds/idmap2/include/idmap2/Idmap.h b/cmds/idmap2/include/idmap2/Idmap.h index 673d18d25907..5cc0664b2bed 100644 --- a/cmds/idmap2/include/idmap2/Idmap.h +++ b/cmds/idmap2/include/idmap2/Idmap.h @@ -228,17 +228,18 @@ class Idmap { static std::string CanonicalIdmapPathFor(const std::string& absolute_dir, const std::string& absolute_apk_path); - static std::unique_ptr<const Idmap> FromBinaryStream(std::istream& stream, - std::ostream& out_error); + static Result<std::unique_ptr<const Idmap>> FromBinaryStream(std::istream& stream); // In the current version of idmap, the first package in each resources.arsc // file is used; change this in the next version of idmap to use a named // package instead; also update FromApkAssets to take additional parameters: // the target and overlay package names - static std::unique_ptr<const Idmap> FromApkAssets( - const std::string& target_apk_path, const ApkAssets& target_apk_assets, - const std::string& overlay_apk_path, const ApkAssets& overlay_apk_assets, - const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, std::ostream& out_error); + static Result<std::unique_ptr<const Idmap>> FromApkAssets(const std::string& target_apk_path, + const ApkAssets& target_apk_assets, + const std::string& overlay_apk_path, + const ApkAssets& overlay_apk_assets, + const PolicyBitmask& fulfilled_policies, + bool enforce_overlayable); inline const std::unique_ptr<const IdmapHeader>& GetHeader() const { return header_; diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index 9afdd437491f..6d5fe7b3446a 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -56,7 +56,7 @@ class MatchingResources { } inline const std::map<TypeId, std::set<std::pair<ResourceId, ResourceId>>>& WARN_UNUSED - Map() const { + Map() const { return map_; } @@ -124,7 +124,7 @@ Result<uint32_t> GetCrc(const ZipFile& zip) { const Result<uint32_t> b = zip.Crc("AndroidManifest.xml"); return a && b ? Result<uint32_t>(*a ^ *b) - : Error("Couldn't get CRC for \"%s\"", a ? "AndroidManifest.xml" : "resources.arsc"); + : Error("failed to get CRC for \"%s\"", a ? "AndroidManifest.xml" : "resources.arsc"); } } // namespace @@ -244,15 +244,13 @@ std::string Idmap::CanonicalIdmapPathFor(const std::string& absolute_dir, return absolute_dir + "/" + copy + "@idmap"; } -std::unique_ptr<const Idmap> Idmap::FromBinaryStream(std::istream& stream, - std::ostream& out_error) { +Result<std::unique_ptr<const Idmap>> Idmap::FromBinaryStream(std::istream& stream) { SYSTRACE << "Idmap::FromBinaryStream"; std::unique_ptr<Idmap> idmap(new Idmap()); idmap->header_ = IdmapHeader::FromBinaryStream(stream); if (!idmap->header_) { - out_error << "error: failed to parse idmap header" << std::endl; - return nullptr; + return Error("failed to parse idmap header"); } // idmap version 0x01 does not specify the number of data blocks that follow @@ -260,13 +258,12 @@ std::unique_ptr<const Idmap> Idmap::FromBinaryStream(std::istream& stream, for (int i = 0; i < 1; i++) { std::unique_ptr<const IdmapData> data = IdmapData::FromBinaryStream(stream); if (!data) { - out_error << "error: failed to parse data block " << i << std::endl; - return nullptr; + return Error("failed to parse data block %d", i); } idmap->data_.push_back(std::move(data)); } - return std::move(idmap); + return {std::move(idmap)}; } std::string ConcatPolicies(const std::vector<std::string>& policies) { @@ -323,63 +320,56 @@ Result<Unit> CheckOverlayable(const LoadedPackage& target_package, return Result<Unit>({}); } -std::unique_ptr<const Idmap> Idmap::FromApkAssets( - const std::string& target_apk_path, const ApkAssets& target_apk_assets, - const std::string& overlay_apk_path, const ApkAssets& overlay_apk_assets, - const PolicyBitmask& fulfilled_policies, bool enforce_overlayable, std::ostream& out_error) { +Result<std::unique_ptr<const Idmap>> Idmap::FromApkAssets(const std::string& target_apk_path, + const ApkAssets& target_apk_assets, + const std::string& overlay_apk_path, + const ApkAssets& overlay_apk_assets, + const PolicyBitmask& fulfilled_policies, + bool enforce_overlayable) { SYSTRACE << "Idmap::FromApkAssets"; AssetManager2 target_asset_manager; if (!target_asset_manager.SetApkAssets({&target_apk_assets}, true, false)) { - out_error << "error: failed to create target asset manager" << std::endl; - return nullptr; + return Error("failed to create target asset manager"); } AssetManager2 overlay_asset_manager; if (!overlay_asset_manager.SetApkAssets({&overlay_apk_assets}, true, false)) { - out_error << "error: failed to create overlay asset manager" << std::endl; - return nullptr; + return Error("failed to create overlay asset manager"); } const LoadedArsc* target_arsc = target_apk_assets.GetLoadedArsc(); if (target_arsc == nullptr) { - out_error << "error: failed to load target resources.arsc" << std::endl; - return nullptr; + return Error("failed to load target resources.arsc"); } const LoadedArsc* overlay_arsc = overlay_apk_assets.GetLoadedArsc(); if (overlay_arsc == nullptr) { - out_error << "error: failed to load overlay resources.arsc" << std::endl; - return nullptr; + return Error("failed to load overlay resources.arsc"); } const LoadedPackage* target_pkg = GetPackageAtIndex0(*target_arsc); if (target_pkg == nullptr) { - out_error << "error: failed to load target package from resources.arsc" << std::endl; - return nullptr; + return Error("failed to load target package from resources.arsc"); } const LoadedPackage* overlay_pkg = GetPackageAtIndex0(*overlay_arsc); if (overlay_pkg == nullptr) { - out_error << "error: failed to load overlay package from resources.arsc" << std::endl; - return nullptr; + return Error("failed to load overlay package from resources.arsc"); } const std::unique_ptr<const ZipFile> target_zip = ZipFile::Open(target_apk_path); if (!target_zip) { - out_error << "error: failed to open target as zip" << std::endl; - return nullptr; + return Error("failed to open target as zip"); } const std::unique_ptr<const ZipFile> overlay_zip = ZipFile::Open(overlay_apk_path); if (!overlay_zip) { - out_error << "error: failed to open overlay as zip" << std::endl; - return nullptr; + return Error("failed to open overlay as zip"); } auto overlay_info = utils::ExtractOverlayManifestInfo(overlay_apk_path); if (!overlay_info) { - out_error << "error: " << overlay_info.GetErrorMessage() << std::endl; - return nullptr; + return overlay_info.GetError(); } std::unique_ptr<IdmapHeader> header(new IdmapHeader()); @@ -388,30 +378,26 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets( Result<uint32_t> crc = GetCrc(*target_zip); if (!crc) { - out_error << "error: failed to get zip crc for target" << std::endl; - return nullptr; + return Error(crc.GetError(), "failed to get zip CRC for target"); } header->target_crc_ = *crc; crc = GetCrc(*overlay_zip); if (!crc) { - out_error << "error: failed to get zip crc for overlay" << std::endl; - return nullptr; + return Error(crc.GetError(), "failed to get zip CRC for overlay"); } header->overlay_crc_ = *crc; if (target_apk_path.size() > sizeof(header->target_path_)) { - out_error << "error: target apk path \"" << target_apk_path << "\" longer that maximum size " - << sizeof(header->target_path_) << std::endl; - return nullptr; + return Error("target apk path \"%s\" longer than maximum size %zu", target_apk_path.c_str(), + sizeof(header->target_path_)); } memset(header->target_path_, 0, sizeof(header->target_path_)); memcpy(header->target_path_, target_apk_path.data(), target_apk_path.size()); if (overlay_apk_path.size() > sizeof(header->overlay_path_)) { - out_error << "error: overlay apk path \"" << overlay_apk_path << "\" longer that maximum size " - << sizeof(header->overlay_path_) << std::endl; - return nullptr; + return Error("overlay apk path \"%s\" longer than maximum size %zu", target_apk_path.c_str(), + sizeof(header->target_path_)); } memset(header->overlay_path_, 0, sizeof(header->overlay_path_)); memcpy(header->overlay_path_, overlay_apk_path.data(), overlay_apk_path.size()); @@ -451,9 +437,8 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets( } if (matching_resources.Map().empty()) { - out_error << "overlay \"" << overlay_apk_path << "\" does not successfully overlay any resource" - << std::endl; - return nullptr; + return Error("overlay \"%s\" does not successfully overlay any resource", + overlay_apk_path.c_str()); } // encode idmap data @@ -484,7 +469,7 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets( idmap->data_.push_back(std::move(data)); - return std::move(idmap); + return {std::move(idmap)}; } void IdmapHeader::accept(Visitor* v) const { diff --git a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp index 9a0412efbde4..9a5b6331cb20 100644 --- a/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp +++ b/cmds/idmap2/tests/BinaryStreamVisitorTests.cpp @@ -17,6 +17,7 @@ #include <memory> #include <sstream> #include <string> +#include <utility> #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -37,16 +38,17 @@ TEST(BinaryStreamVisitorTests, CreateBinaryStreamViaBinaryStreamVisitor) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); std::istringstream raw_stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap1 = Idmap::FromBinaryStream(raw_stream, error); - ASSERT_THAT(idmap1, NotNull()); + auto result1 = Idmap::FromBinaryStream(raw_stream); + ASSERT_TRUE(result1); + const auto idmap1 = std::move(*result1); std::stringstream stream; BinaryStreamVisitor visitor(stream); idmap1->accept(&visitor); - std::unique_ptr<const Idmap> idmap2 = Idmap::FromBinaryStream(stream, error); - ASSERT_THAT(idmap2, NotNull()); + auto result2 = Idmap::FromBinaryStream(stream); + ASSERT_TRUE(result2); + const auto idmap2 = std::move(*result2); ASSERT_EQ(idmap1->GetHeader()->GetTargetCrc(), idmap2->GetHeader()->GetTargetCrc()); ASSERT_EQ(idmap1->GetHeader()->GetTargetPath(), idmap2->GetHeader()->GetTargetPath()); @@ -76,15 +78,14 @@ TEST(BinaryStreamVisitorTests, CreateIdmapFromApkAssetsInteropWithLoadedIdmap) { std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = + const auto idmap = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); - ASSERT_THAT(idmap, NotNull()); + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true); + ASSERT_TRUE(idmap); std::stringstream stream; BinaryStreamVisitor visitor(stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); const std::string str = stream.str(); const StringPiece data(str); std::unique_ptr<const LoadedIdmap> loaded_idmap = LoadedIdmap::Load(data); diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp index a6a2ada76712..91bc4ddb397f 100644 --- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp +++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp @@ -100,13 +100,12 @@ TEST_F(Idmap2BinaryTests, Create) { struct stat st; ASSERT_EQ(stat(GetIdmapPath().c_str(), &st), 0); - std::stringstream error; std::ifstream fin(GetIdmapPath()); - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(fin, error); + const auto idmap = Idmap::FromBinaryStream(fin); fin.close(); - ASSERT_THAT(idmap, NotNull()); - ASSERT_IDMAP(*idmap, GetTargetApkPath(), GetOverlayApkPath()); + ASSERT_TRUE(idmap); + ASSERT_IDMAP(**idmap, GetTargetApkPath(), GetOverlayApkPath()); unlink(GetIdmapPath().c_str()); } @@ -193,24 +192,23 @@ TEST_F(Idmap2BinaryTests, Scan) { expected << idmap_static_2_path << std::endl; ASSERT_EQ(result->stdout, expected.str()); - std::stringstream error; auto idmap_static_no_name_raw_string = utils::ReadFile(idmap_static_no_name_path); auto idmap_static_no_name_raw_stream = std::istringstream(*idmap_static_no_name_raw_string); - auto idmap_static_no_name = Idmap::FromBinaryStream(idmap_static_no_name_raw_stream, error); - ASSERT_THAT(idmap_static_no_name, NotNull()); - ASSERT_IDMAP(*idmap_static_no_name, GetTargetApkPath(), overlay_static_no_name_apk_path); + auto idmap_static_no_name = Idmap::FromBinaryStream(idmap_static_no_name_raw_stream); + ASSERT_TRUE(idmap_static_no_name); + ASSERT_IDMAP(**idmap_static_no_name, GetTargetApkPath(), overlay_static_no_name_apk_path); auto idmap_static_1_raw_string = utils::ReadFile(idmap_static_1_path); auto idmap_static_1_raw_stream = std::istringstream(*idmap_static_1_raw_string); - auto idmap_static_1 = Idmap::FromBinaryStream(idmap_static_1_raw_stream, error); - ASSERT_THAT(idmap_static_1, NotNull()); - ASSERT_IDMAP(*idmap_static_1, GetTargetApkPath(), overlay_static_1_apk_path); + auto idmap_static_1 = Idmap::FromBinaryStream(idmap_static_1_raw_stream); + ASSERT_TRUE(idmap_static_1); + ASSERT_IDMAP(**idmap_static_1, GetTargetApkPath(), overlay_static_1_apk_path); auto idmap_static_2_raw_string = utils::ReadFile(idmap_static_2_path); auto idmap_static_2_raw_stream = std::istringstream(*idmap_static_2_raw_string); - auto idmap_static_2 = Idmap::FromBinaryStream(idmap_static_2_raw_stream, error); - ASSERT_THAT(idmap_static_2, NotNull()); - ASSERT_IDMAP(*idmap_static_2, GetTargetApkPath(), overlay_static_2_apk_path); + auto idmap_static_2 = Idmap::FromBinaryStream(idmap_static_2_raw_stream); + ASSERT_TRUE(idmap_static_2); + ASSERT_IDMAP(**idmap_static_2, GetTargetApkPath(), overlay_static_2_apk_path); unlink(idmap_static_no_name_path.c_str()); unlink(idmap_static_2_path.c_str()); diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index c20ae7b798a3..621f50337aa3 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -20,6 +20,7 @@ #include <memory> #include <sstream> #include <string> +#include <utility> #include <vector> #include "gmock/gmock.h" @@ -127,9 +128,9 @@ TEST(IdmapTests, CreateIdmapFromBinaryStream) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); std::istringstream stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(stream, error); - ASSERT_THAT(idmap, NotNull()); + auto result = Idmap::FromBinaryStream(stream); + ASSERT_TRUE(result); + const auto idmap = std::move(*result); ASSERT_THAT(idmap->GetHeader(), NotNull()); ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U); @@ -168,9 +169,8 @@ TEST(IdmapTests, GracefullyFailToCreateIdmapFromCorruptBinaryStream) { 10); // data too small std::istringstream stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(stream, error); - ASSERT_THAT(idmap, IsNull()); + const auto result = Idmap::FromBinaryStream(stream); + ASSERT_FALSE(result); } void CreateIdmap(const StringPiece& target_apk_path, const StringPiece& overlay_apk_path, @@ -182,10 +182,10 @@ void CreateIdmap(const StringPiece& target_apk_path, const StringPiece& overlay_ std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path.to_string()); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - *out_idmap = + auto result = Idmap::FromApkAssets(target_apk_path.to_string(), *target_apk, overlay_apk_path.to_string(), - *overlay_apk, fulfilled_policies, enforce_overlayable, error); + *overlay_apk, fulfilled_policies, enforce_overlayable); + *out_idmap = result ? std::move(*result) : nullptr; } TEST(IdmapTests, CreateIdmapFromApkAssets) { @@ -471,11 +471,10 @@ TEST(IdmapTests, FailToCreateIdmapFromApkAssetsIfPathTooLong) { std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = + const auto result = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); - ASSERT_THAT(idmap, IsNull()); + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true); + ASSERT_FALSE(result); } TEST(IdmapTests, IdmapHeaderIsUpToDate) { @@ -489,11 +488,11 @@ TEST(IdmapTests, IdmapHeaderIsUpToDate) { std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromApkAssets( - target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, PolicyFlags::POLICY_PUBLIC, - /* enforce_overlayable */ true, error); - ASSERT_THAT(idmap, NotNull()); + auto result = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, + PolicyFlags::POLICY_PUBLIC, + /* enforce_overlayable */ true); + ASSERT_TRUE(result); + const auto idmap = std::move(*result); std::stringstream stream; BinaryStreamVisitor visitor(stream); @@ -609,13 +608,12 @@ TEST(IdmapTests, TestVisitor) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); std::istringstream stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(stream, error); - ASSERT_THAT(idmap, NotNull()); + const auto idmap = Idmap::FromBinaryStream(stream); + ASSERT_TRUE(idmap); std::stringstream test_stream; TestVisitor visitor(test_stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); ASSERT_EQ(test_stream.str(), "TestVisitor::visit(Idmap)\n" diff --git a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp index eaa47cd79533..27a3880f67b6 100644 --- a/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/PrettyPrintVisitorTests.cpp @@ -46,15 +46,14 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitor) { std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = + const auto idmap = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); - ASSERT_THAT(idmap, NotNull()); + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true); + ASSERT_TRUE(idmap); std::stringstream stream; PrettyPrintVisitor visitor(stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); ASSERT_NE(stream.str().find("target apk path : "), std::string::npos); ASSERT_NE(stream.str().find("overlay apk path : "), std::string::npos); @@ -67,13 +66,12 @@ TEST(PrettyPrintVisitorTests, CreatePrettyPrintVisitorWithoutAccessToApks) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); std::istringstream raw_stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(raw_stream, error); - ASSERT_THAT(idmap, NotNull()); + const auto idmap = Idmap::FromBinaryStream(raw_stream); + ASSERT_TRUE(idmap); std::stringstream stream; PrettyPrintVisitor visitor(stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); ASSERT_NE(stream.str().find("target apk path : "), std::string::npos); ASSERT_NE(stream.str().find("overlay apk path : "), std::string::npos); diff --git a/cmds/idmap2/tests/RawPrintVisitorTests.cpp b/cmds/idmap2/tests/RawPrintVisitorTests.cpp index 7ec13ed0ade7..7372148f0f0e 100644 --- a/cmds/idmap2/tests/RawPrintVisitorTests.cpp +++ b/cmds/idmap2/tests/RawPrintVisitorTests.cpp @@ -40,15 +40,14 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) { std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = + const auto idmap = Idmap::FromApkAssets(target_apk_path, *target_apk, overlay_apk_path, *overlay_apk, - PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true, error); - ASSERT_THAT(idmap, NotNull()); + PolicyFlags::POLICY_PUBLIC, /* enforce_overlayable */ true); + ASSERT_TRUE(idmap); std::stringstream stream; RawPrintVisitor visitor(stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); ASSERT_NE(stream.str().find("00000000: 504d4449 magic\n"), std::string::npos); ASSERT_NE(stream.str().find("00000004: 00000001 version\n"), std::string::npos); @@ -64,13 +63,12 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitorWithoutAccessToApks) { std::string raw(reinterpret_cast<const char*>(idmap_raw_data), idmap_raw_data_len); std::istringstream raw_stream(raw); - std::stringstream error; - std::unique_ptr<const Idmap> idmap = Idmap::FromBinaryStream(raw_stream, error); - ASSERT_THAT(idmap, NotNull()); + const auto idmap = Idmap::FromBinaryStream(raw_stream); + ASSERT_TRUE(idmap); std::stringstream stream; RawPrintVisitor visitor(stream); - idmap->accept(&visitor); + (*idmap)->accept(&visitor); ASSERT_NE(stream.str().find("00000000: 504d4449 magic\n"), std::string::npos); ASSERT_NE(stream.str().find("00000004: 00000001 version\n"), std::string::npos); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index d331c0f026f6..1735b05148fa 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3422,7 +3422,6 @@ message HiddenApiUsed { * - When user clicks privacy chip * - How does the user exit the Privacy Dialog * Logged from: - * packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt * packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java */ message PrivacyIndicatorsInteracted { diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index b3f003730c53..76d69cdce5cf 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -123,7 +123,6 @@ Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;-><init>()V Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V -Landroid/companion/IFindDeviceCallback;->onSuccess(Landroid/app/PendingIntent;)V Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard; Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V @@ -198,8 +197,6 @@ Landroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landr Landroid/database/IContentObserver;->onChange(ZLandroid/net/Uri;I)V Landroid/database/sqlite/SQLiteConnectionPool;->$assertionsDisabled:Z Landroid/database/sqlite/SQLiteDatabase;->$assertionsDisabled:Z -Landroid/filterfw/GraphEnvironment;->addReferences([Ljava/lang/Object;)V -Landroid/hardware/camera2/utils/HashCodeHelpers;->hashCode([I)I Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager; Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/fingerprint/IFingerprintService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/fingerprint/IFingerprintService; @@ -211,8 +208,6 @@ Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService; Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager; -Landroid/inputmethodservice/IInputMethodSessionWrapper;->mCaller:Lcom/android/internal/os/HandlerCaller; -Landroid/inputmethodservice/IInputMethodWrapper;->mCaller:Lcom/android/internal/os/HandlerCaller; Landroid/location/ICountryDetector$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryDetector; Landroid/location/ICountryListener$Stub;-><init>()V Landroid/location/IGeocodeProvider$Stub;-><init>()V @@ -230,7 +225,6 @@ Landroid/location/LocationManager$ListenerTransport;-><init>(Landroid/location/L Landroid/Manifest$permission;->CAPTURE_SECURE_VIDEO_OUTPUT:Ljava/lang/String; Landroid/Manifest$permission;->CAPTURE_VIDEO_OUTPUT:Ljava/lang/String; Landroid/Manifest$permission;->READ_FRAME_BUFFER:Ljava/lang/String; -Landroid/media/effect/SingleFilterEffect;-><init>(Landroid/media/effect/EffectContext;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V Landroid/media/IAudioRoutesObserver$Stub;-><init>()V Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/media/IAudioService$Stub;-><init>()V @@ -266,7 +260,6 @@ Landroid/net/InterfaceConfiguration;-><init>()V Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange; Landroid/net/MobileLinkQualityInfo;-><init>()V Landroid/net/nsd/INsdManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/nsd/INsdManager; -Landroid/net/nsd/INsdManager;->getMessenger()Landroid/os/Messenger; Landroid/net/sip/ISipSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/sip/ISipSession; Landroid/net/SntpClient;-><init>()V Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V @@ -295,7 +288,6 @@ Landroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z Landroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager; Landroid/os/IPowerManager$Stub;->TRANSACTION_acquireWakeLock:I Landroid/os/IPowerManager$Stub;->TRANSACTION_goToSleep:I -Landroid/os/IPowerManager;->releaseWakeLock(Landroid/os/IBinder;I)V Landroid/os/IRecoverySystem$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IRecoverySystem; Landroid/os/IRemoteCallback$Stub;-><init>()V Landroid/os/IUpdateEngine$Stub;-><init>()V @@ -310,7 +302,6 @@ Landroid/os/storage/IObbActionListener$Stub;-><init>()V Landroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager; Landroid/os/storage/StorageEventListener;-><init>()V -Landroid/preference/PreferenceGroupAdapter;->getItem(I)Landroid/preference/Preference; Landroid/R$styleable;->ActionBar:[I Landroid/R$styleable;->ActionBar_background:I Landroid/R$styleable;->ActionBar_backgroundSplit:I @@ -576,17 +567,6 @@ Landroid/R$styleable;->Window:[I Landroid/R$styleable;->Window_windowBackground:I Landroid/R$styleable;->Window_windowFrame:I Landroid/security/IKeyChainService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/IKeyChainService; -Landroid/security/keymaster/KeymasterBlobArgument;-><init>(ILandroid/os/Parcel;)V -Landroid/security/keymaster/KeymasterBlobArgument;-><init>(I[B)V -Landroid/security/keymaster/KeymasterBlobArgument;->blob:[B -Landroid/security/keymaster/KeymasterBooleanArgument;-><init>(ILandroid/os/Parcel;)V -Landroid/security/keymaster/KeymasterDateArgument;-><init>(ILandroid/os/Parcel;)V -Landroid/security/keymaster/KeymasterIntArgument;-><init>(II)V -Landroid/security/keymaster/KeymasterIntArgument;-><init>(ILandroid/os/Parcel;)V -Landroid/security/keymaster/KeymasterIntArgument;->value:I -Landroid/security/keymaster/KeymasterLongArgument;-><init>(IJ)V -Landroid/security/keymaster/KeymasterLongArgument;-><init>(ILandroid/os/Parcel;)V -Landroid/security/keymaster/KeymasterLongArgument;->value:J Landroid/security/keystore/IKeystoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/keystore/IKeystoreService; Landroid/security/keystore/IKeystoreService;->clear_uid(J)I Landroid/security/keystore/IKeystoreService;->del(Ljava/lang/String;I)I @@ -599,24 +579,17 @@ Landroid/security/keystore/IKeystoreService;->list(Ljava/lang/String;I)[Ljava/la Landroid/security/keystore/IKeystoreService;->reset()I Landroid/security/keystore/IKeystoreService;->ungrant(Ljava/lang/String;I)I Landroid/service/dreams/IDreamManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/dreams/IDreamManager; -Landroid/service/dreams/IDreamManager;->awaken()V -Landroid/service/dreams/IDreamManager;->dream()V Landroid/service/dreams/IDreamManager;->getDreamComponents()[Landroid/content/ComponentName; -Landroid/service/dreams/IDreamManager;->isDreaming()Z -Landroid/service/dreams/IDreamManager;->setDreamComponents([Landroid/content/ComponentName;)V Landroid/service/euicc/IEuiccService$Stub;-><init>()V Landroid/service/notification/INotificationListener$Stub;-><init>()V Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService; Landroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager; Landroid/service/wallpaper/IWallpaperConnection$Stub;-><init>()V Landroid/service/wallpaper/IWallpaperService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/wallpaper/IWallpaperService; -Landroid/telecom/Log;->i(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V -Landroid/telecom/Log;->w(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V Landroid/telephony/ims/compat/ImsService;-><init>()V Landroid/telephony/ims/compat/stub/ImsCallSessionImplBase;-><init>()V Landroid/telephony/ims/compat/stub/ImsUtListenerImplBase;-><init>()V -Landroid/telephony/JapanesePhoneNumberFormatter;->format(Landroid/text/Editable;)V Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService; @@ -646,14 +619,8 @@ Landroid/telephony/SmsCbMessage;->isCmasMessage()Z Landroid/telephony/SmsCbMessage;->isEmergencyMessage()Z Landroid/telephony/TelephonyManager$MultiSimVariants;->values()[Landroid/telephony/TelephonyManager$MultiSimVariants; Landroid/util/Singleton;-><init>()V -Landroid/util/XmlPullAttributes;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V -Landroid/util/XmlPullAttributes;->mParser:Lorg/xmlpull/v1/XmlPullParser; -Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;->setFindAccessibilityNodeInfoResult(Landroid/view/accessibility/AccessibilityNodeInfo;I)V -Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;->setFindAccessibilityNodeInfosResult(Ljava/util/List;I)V -Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;->setPerformAccessibilityActionResult(ZI)V Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager; -Landroid/view/accessibility/IAccessibilityManager;->getEnabledAccessibilityServiceList(II)Ljava/util/List; Landroid/view/AccessibilityIterators$AbstractTextSegmentIterator;-><init>()V Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager; diff --git a/core/java/android/accessibilityservice/AccessibilityButtonController.java b/core/java/android/accessibilityservice/AccessibilityButtonController.java index a70085cbde4f..af5af9cb9b17 100644 --- a/core/java/android/accessibilityservice/AccessibilityButtonController.java +++ b/core/java/android/accessibilityservice/AccessibilityButtonController.java @@ -17,7 +17,6 @@ package android.accessibilityservice; import android.annotation.NonNull; -import android.annotation.Nullable; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; @@ -76,13 +75,16 @@ public final class AccessibilityButtonController { * available to the calling service, {@code false} otherwise */ public boolean isAccessibilityButtonAvailable() { - try { - return mServiceConnection.isAccessibilityButtonAvailable(); - } catch (RemoteException re) { - Slog.w(LOG_TAG, "Failed to get accessibility button availability.", re); - re.rethrowFromSystemServer(); - return false; + if (mServiceConnection != null) { + try { + return mServiceConnection.isAccessibilityButtonAvailable(); + } catch (RemoteException re) { + Slog.w(LOG_TAG, "Failed to get accessibility button availability.", re); + re.rethrowFromSystemServer(); + return false; + } } + return false; } /** diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 15084de0d7dd..7884872a7ef3 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -70,6 +70,10 @@ interface INotificationManager boolean areNotificationsEnabled(String pkg); int getPackageImportance(String pkg); + List<String> getAllowedAssistantCapabilities(String pkg); + void allowAssistantCapability(String adjustmentType); + void disallowAssistantCapability(String adjustmentType); + boolean shouldHideSilentStatusIcons(String callingPkg); void setHideSilentStatusIcons(boolean hide); @@ -86,10 +90,10 @@ interface INotificationManager NotificationChannelGroup getPopulatedNotificationChannelGroupForPackage(String pkg, int uid, String groupId, boolean includeDeleted); void updateNotificationChannelGroupForPackage(String pkg, int uid, in NotificationChannelGroup group); void updateNotificationChannelForPackage(String pkg, int uid, in NotificationChannel channel); - NotificationChannel getNotificationChannel(String pkg, String channelId); + NotificationChannel getNotificationChannel(String callingPkg, int userId, String pkg, String channelId); NotificationChannel getNotificationChannelForPackage(String pkg, int uid, String channelId, boolean includeDeleted); void deleteNotificationChannel(String pkg, String channelId); - ParceledListSlice getNotificationChannels(String pkg); + ParceledListSlice getNotificationChannels(String callingPkg, String targetPkg, int userId); ParceledListSlice getNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted); int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted); int getDeletedChannelCount(String pkg, int uid); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 523b2005fb72..7ba614685ad8 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -16,6 +16,8 @@ package android.app; +import static android.graphics.drawable.Icon.TYPE_BITMAP; + import static com.android.internal.util.ContrastColorUtil.satisfiesTextContrast; import android.annotation.ColorInt; @@ -8707,12 +8709,25 @@ public class Notification implements Parcelable * <p>An icon is required and should be representative of the content within the bubble. * If your app produces multiple bubbles, the image should be unique for each of them. * </p> + * + * <p>The shape of a bubble icon is adaptive and can match the device theme. + * + * If your icon is bitmap-based, you should create it using + * {@link Icon#createWithAdaptiveBitmap(Bitmap)}, otherwise this method will throw. + * + * If your icon is not bitmap-based, you should expect that the icon will be tinted. + * </p> */ @NonNull public BubbleMetadata.Builder setIcon(@NonNull Icon icon) { if (icon == null) { throw new IllegalArgumentException("Bubbles require non-null icon"); } + if (icon.getType() == TYPE_BITMAP) { + throw new IllegalArgumentException("When using bitmap based icons, Bubbles " + + "require TYPE_ADAPTIVE_BITMAP, please use" + + " Icon#createWithAdaptiveBitmap instead"); + } mIcon = icon; return this; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 6a301c91bb06..1aacf966fc14 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -42,6 +42,7 @@ import android.os.ServiceManager; import android.os.StrictMode; import android.os.UserHandle; import android.provider.Settings.Global; +import android.service.notification.Adjustment; import android.service.notification.Condition; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; @@ -715,12 +716,16 @@ public class NotificationManager { /** * Returns the notification channel settings for a given channel id. * - * The channel must belong to your package, or it will not be returned. + * <p>The channel must belong to your package, or to a package you are an approved notification + * delegate for (see {@link #canNotifyAsPackage(String)}), or it will not be returned. To query + * a channel as a notification delegate, call this method from a context created for that + * package (see {@link Context#createPackageContext(String, int)}).</p> */ public NotificationChannel getNotificationChannel(String channelId) { INotificationManager service = getService(); try { - return service.getNotificationChannel(mContext.getPackageName(), channelId); + return service.getNotificationChannel(mContext.getOpPackageName(), + mContext.getUserId(), mContext.getPackageName(), channelId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -728,11 +733,17 @@ public class NotificationManager { /** * Returns all notification channels belonging to the calling package. + * + * <p>Approved notification delegates (see {@link #canNotifyAsPackage(String)}) can query + * notification channels belonging to packages they are the delegate for. To do so, call this + * method from a context created for that package (see + * {@link Context#createPackageContext(String, int)}).</p> */ public List<NotificationChannel> getNotificationChannels() { INotificationManager service = getService(); try { - return service.getNotificationChannels(mContext.getPackageName()).getList(); + return service.getNotificationChannels(mContext.getOpPackageName(), + mContext.getPackageName(), mContext.getUserId()).getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1182,6 +1193,25 @@ public class NotificationManager { } } + /** + * Returns the list of {@link android.service.notification.Adjustment adjustment keys} that can + * be modified by the current {@link android.service.notification.NotificationAssistantService}. + * + * <p>Only callable by the current + * {@link android.service.notification.NotificationAssistantService}. + * See {@link #isNotificationAssistantAccessGranted(ComponentName)}</p> + * @hide + */ + @SystemApi + public @NonNull @Adjustment.Keys List<String> getAllowedAssistantCapabilities() { + INotificationManager service = getService(); + try { + return service.getAllowedAssistantCapabilities(mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @hide */ public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) { INotificationManager service = getService(); diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index bcc4974e4e64..25caaaa6e5ad 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -16,6 +16,7 @@ package android.app.backup; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; @@ -502,32 +503,76 @@ public class BackupManager { * @param transportComponent The identity of the transport being described. * @param name A {@link String} with the new name for the transport. This is NOT for * identification. MUST NOT be {@code null}. - * @param configurationIntent An {@link Intent} that can be passed to - * {@link Context#startActivity} in order to launch the transport's configuration UI. It may - * be {@code null} if the transport does not offer any user-facing configuration UI. + * @param configurationIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's configuration UI. It may be + * {@code null} if the transport does not offer any user-facing configuration UI. * @param currentDestinationString A {@link String} describing the destination to which the * transport is currently sending data. MUST NOT be {@code null}. - * @param dataManagementIntent An {@link Intent} that can be passed to - * {@link Context#startActivity} in order to launch the transport's data-management UI. It - * may be {@code null} if the transport does not offer any user-facing data - * management UI. + * @param dataManagementIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's data-management UI. It may be + * {@code null} if the transport does not offer any user-facing data management UI. * @param dataManagementLabel A {@link String} to be used as the label for the transport's data - * management affordance. This MUST be {@code null} when dataManagementIntent is - * {@code null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. + * management affordance. This MUST be {@code null} when dataManagementIntent is {@code + * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. - * + * @deprecated Since Android Q, please use the variant {@link + * #updateTransportAttributes(ComponentName, String, Intent, String, Intent, CharSequence)} + * instead. * @hide */ + @Deprecated @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public void updateTransportAttributes( - ComponentName transportComponent, - String name, + @NonNull ComponentName transportComponent, + @NonNull String name, @Nullable Intent configurationIntent, - String currentDestinationString, + @NonNull String currentDestinationString, @Nullable Intent dataManagementIntent, @Nullable String dataManagementLabel) { + updateTransportAttributes( + transportComponent, + name, + configurationIntent, + currentDestinationString, + dataManagementIntent, + (CharSequence) dataManagementLabel); + } + + /** + * Update the attributes of the transport identified by {@code transportComponent}. If the + * specified transport has not been bound at least once (for registration), this call will be + * ignored. Only the host process of the transport can change its description, otherwise a + * {@link SecurityException} will be thrown. + * + * @param transportComponent The identity of the transport being described. + * @param name A {@link String} with the new name for the transport. This is NOT for + * identification. MUST NOT be {@code null}. + * @param configurationIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's configuration UI. It may be + * {@code null} if the transport does not offer any user-facing configuration UI. + * @param currentDestinationString A {@link String} describing the destination to which the + * transport is currently sending data. MUST NOT be {@code null}. + * @param dataManagementIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's data-management UI. It may be + * {@code null} if the transport does not offer any user-facing data management UI. + * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's + * data management affordance. This MUST be {@code null} when dataManagementIntent is {@code + * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. + * @throws SecurityException If the UID of the calling process differs from the package UID of + * {@code transportComponent} or if the caller does NOT have BACKUP permission. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.BACKUP) + public void updateTransportAttributes( + @NonNull ComponentName transportComponent, + @NonNull String name, + @Nullable Intent configurationIntent, + @NonNull String currentDestinationString, + @Nullable Intent dataManagementIntent, + @Nullable CharSequence dataManagementLabel) { checkServiceBinder(); if (sService != null) { try { @@ -796,7 +841,7 @@ public class BackupManager { /** * Returns an {@link Intent} for the specified transport's configuration UI. * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, - * Intent, String)}. + * Intent, CharSequence)}. * @param transportName The name of the registered transport. * @hide */ @@ -818,7 +863,7 @@ public class BackupManager { /** * Returns a {@link String} describing where the specified transport is sending data. * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, - * Intent, String)}. + * Intent, CharSequence)}. * @param transportName The name of the registered transport. * @hide */ @@ -840,7 +885,7 @@ public class BackupManager { /** * Returns an {@link Intent} for the specified transport's data management UI. * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, - * Intent, String)}. + * Intent, CharSequence)}. * @param transportName The name of the registered transport. * @hide */ @@ -861,23 +906,43 @@ public class BackupManager { /** * Returns a {@link String} describing what the specified transport's data management intent is - * used for. - * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, - * Intent, String)}. + * used for. This value is set by {@link #updateTransportAttributes(ComponentName, String, + * Intent, String, Intent, CharSequence)}. * * @param transportName The name of the registered transport. + * @deprecated Since Android Q, please use the variant {@link + * #getDataManagementIntentLabel(String)} instead. * @hide */ + @Deprecated @SystemApi @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) - public String getDataManagementLabel(String transportName) { + @Nullable + public String getDataManagementLabel(@NonNull String transportName) { + CharSequence label = getDataManagementIntentLabel(transportName); + return label == null ? null : label.toString(); + } + + /** + * Returns a {@link CharSequence} describing what the specified transport's data management + * intent is used for. This value is set by {@link #updateTransportAttributes(ComponentName, + * String, Intent, String, Intent, CharSequence)}. + * + * @param transportName The name of the registered transport. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(android.Manifest.permission.BACKUP) + @Nullable + public CharSequence getDataManagementIntentLabel(@NonNull String transportName) { checkServiceBinder(); if (sService != null) { try { return sService.getDataManagementLabelForUser(mContext.getUserId(), transportName); } catch (RemoteException e) { - Log.e(TAG, "getDataManagementLabel() couldn't connect"); + Log.e(TAG, "getDataManagementIntentLabel() couldn't connect"); } } return null; diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java index 0963594bc00e..c8f2ff34a70c 100644 --- a/core/java/android/app/backup/BackupTransport.java +++ b/core/java/android/app/backup/BackupTransport.java @@ -16,6 +16,7 @@ package android.app.backup; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Intent; import android.content.pm.PackageInfo; @@ -164,19 +165,36 @@ public class BackupTransport { } /** - * On demand, supply a short string that can be shown to the user as the label - * on an overflow menu item used to invoked the data management UI. + * On demand, supply a short string that can be shown to the user as the label on an overflow + * menu item used to invoke the data management UI. * - * @return A string to be used as the label for the transport's data management - * affordance. If the transport supplies a data management intent, this - * method must not return {@code null}. + * @return A string to be used as the label for the transport's data management affordance. If + * the transport supplies a data management intent, this method must not return {@code + * null}. + * @deprecated Since Android Q, please use the variant {@link #dataManagementIntentLabel()} + * instead. */ + @Deprecated + @Nullable public String dataManagementLabel() { throw new UnsupportedOperationException( "Transport dataManagementLabel() not implemented"); } /** + * On demand, supply a short CharSequence that can be shown to the user as the label on an + * overflow menu item used to invoke the data management UI. + * + * @return A CharSequence to be used as the label for the transport's data management + * affordance. If the transport supplies a data management intent, this method must not + * return {@code null}. + */ + @Nullable + public CharSequence dataManagementIntentLabel() { + return dataManagementLabel(); + } + + /** * Ask the transport where, on local device storage, to keep backup state blobs. * This is per-transport so that mock transports used for testing can coexist with * "live" backup services without interfering with the live bookkeeping. The @@ -651,8 +669,8 @@ public class BackupTransport { } @Override - public String dataManagementLabel() { - return BackupTransport.this.dataManagementLabel(); + public CharSequence dataManagementIntentLabel() { + return BackupTransport.this.dataManagementIntentLabel(); } @Override diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl index 70ecdae92652..2dfaad759d3f 100644 --- a/core/java/android/app/backup/IBackupManager.aidl +++ b/core/java/android/app/backup/IBackupManager.aidl @@ -353,16 +353,16 @@ interface IBackupManager { * {@link Context#startActivity} in order to launch the transport's data-management UI. It * may be {@code null} if the transport does not offer any user-facing data * management UI. - * @param dataManagementLabel A {@link String} to be used as the label for the transport's data - * management affordance. This MUST be {@code null} when dataManagementIntent is - * {@code null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. + * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's + * data management affordance. This MUST be {@code null} when dataManagementIntent is {@code + * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. */ void updateTransportAttributesForUser(int userId, in ComponentName transportComponent, in String name, in Intent configurationIntent, in String currentDestinationString, - in Intent dataManagementIntent, in String dataManagementLabel); + in Intent dataManagementIntent, in CharSequence dataManagementLabel); /** * Identify the currently selected transport. Callers must hold the @@ -525,13 +525,7 @@ interface IBackupManager { * * @param userId User id for which the manage-data menu label should be reported. */ - String getDataManagementLabelForUser(int userId, String transport); - - /** - * {@link android.app.backup.IBackupManager.getDataManagementLabelForUser} for the calling user - * id. - */ - String getDataManagementLabel(String transport); + CharSequence getDataManagementLabelForUser(int userId, String transport); /** * Begin a restore session. Either or both of packageName and transportID diff --git a/core/java/android/companion/IFindDeviceCallback.aidl b/core/java/android/companion/IFindDeviceCallback.aidl index 919e15198efa..4e9fa19e5ce5 100644 --- a/core/java/android/companion/IFindDeviceCallback.aidl +++ b/core/java/android/companion/IFindDeviceCallback.aidl @@ -20,6 +20,7 @@ import android.app.PendingIntent; /** @hide */ interface IFindDeviceCallback { + @UnsupportedAppUsage void onSuccess(in PendingIntent launcher); void onFailure(in CharSequence reason); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 93a9daced987..6bb949804390 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2078,6 +2078,9 @@ public class Intent implements Parcelable, Cloneable { * <p> * Output: Nothing. * </p> + * <p class="note"> + * This requires {@link android.Manifest.permission#GRANT_RUNTIME_PERMISSIONS} permission. + * </p> * * @see #EXTRA_PERMISSION_NAME * @see #EXTRA_PERMISSION_GROUP_NAME @@ -2086,11 +2089,35 @@ public class Intent implements Parcelable, Cloneable { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE"; /** + * Activity action: Launch UI to review ongoing app uses of permissions. + * <p> + * Input: {@link #EXTRA_DURATION_MILLIS} specifies the minimum number of milliseconds of recent + * activity to show (optional). Must be non-negative. + * </p> + * <p> + * Output: Nothing. + * </p> + * <p class="note"> + * This requires {@link android.Manifest.permission#GRANT_RUNTIME_PERMISSIONS} permission. + * </p> + * + * @see #EXTRA_DURATION_MILLIS + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_REVIEW_ONGOING_PERMISSION_USAGE = + "android.intent.action.REVIEW_ONGOING_PERMISSION_USAGE"; + + /** * Activity action: Launch UI to review uses of permissions for a single app. * <p> * Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index fa5247c955d7..461045ed4d0f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -5901,9 +5901,8 @@ public abstract class PackageManager { * @param packageName The package name of the app * @return Returns the enabled state for the synthetic app details activity. * - * @hide + * */ - @SystemApi public boolean getSyntheticAppDetailsActivityEnabled(@NonNull String packageName) { throw new UnsupportedOperationException( "getSyntheticAppDetailsActivityEnabled not implemented"); diff --git a/core/java/android/hardware/camera2/utils/HashCodeHelpers.java b/core/java/android/hardware/camera2/utils/HashCodeHelpers.java index 731da8b6a721..526f086f4baa 100644 --- a/core/java/android/hardware/camera2/utils/HashCodeHelpers.java +++ b/core/java/android/hardware/camera2/utils/HashCodeHelpers.java @@ -16,6 +16,8 @@ package android.hardware.camera2.utils; +import android.annotation.UnsupportedAppUsage; + /** * Provide hashing functions using the Modified Bernstein hash */ @@ -30,6 +32,7 @@ public final class HashCodeHelpers { * * @return the numeric hash code */ + @UnsupportedAppUsage public static int hashCode(int... array) { if (array == null) { return 0; diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index ffae361e76d4..7d4849f7562d 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -16,6 +16,7 @@ package android.inputmethodservice; +import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; @@ -53,6 +54,7 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub private static final int DO_VIEW_CLICKED = 115; private static final int DO_NOTIFY_IME_HIDDEN = 120; + @UnsupportedAppUsage HandlerCaller mCaller; InputMethodSession mInputMethodSession; InputChannel mChannel; diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java index 37b25c8fec0c..a47f601033cf 100644 --- a/core/java/android/inputmethodservice/IInputMethodWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java @@ -18,6 +18,7 @@ package android.inputmethodservice; import android.annotation.BinderThread; import android.annotation.MainThread; +import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; @@ -74,6 +75,7 @@ class IInputMethodWrapper extends IInputMethod.Stub final WeakReference<AbstractInputMethodService> mTarget; final Context mContext; + @UnsupportedAppUsage final HandlerCaller mCaller; final WeakReference<InputMethod> mInputMethod; final int mTargetSdkVersion; diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java index 7873fc021b92..3e4e35a8f16d 100644 --- a/core/java/android/net/CaptivePortal.java +++ b/core/java/android/net/CaptivePortal.java @@ -15,6 +15,7 @@ */ package android.net; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.os.IBinder; @@ -65,7 +66,7 @@ public class CaptivePortal implements Parcelable { /** @hide */ @SystemApi @TestApi - public CaptivePortal(IBinder binder) { + public CaptivePortal(@NonNull IBinder binder) { mBinder = binder; } @@ -142,7 +143,7 @@ public class CaptivePortal implements Parcelable { */ @SystemApi @TestApi - public void logEvent(int eventId, String packageName) { + public void logEvent(int eventId, @NonNull String packageName) { try { ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName); } catch (RemoteException e) { diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index e5802c23eb6f..16322353add2 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -4088,7 +4088,7 @@ public class ConnectivityManager { @SystemApi @TestApi @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) - public void startCaptivePortalApp(Network network, Bundle appExtras) { + public void startCaptivePortalApp(@NonNull Network network, @NonNull Bundle appExtras) { try { mService.startCaptivePortalAppInternal(network, appExtras); } catch (RemoteException e) { diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index 21bbd304a81b..402bffdc2a97 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -16,6 +16,7 @@ package android.net; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.os.Parcel; @@ -70,7 +71,7 @@ public final class IpPrefix implements Parcelable { * * @hide */ - public IpPrefix(byte[] address, int prefixLength) { + public IpPrefix(@NonNull byte[] address, int prefixLength) { this.address = address.clone(); this.prefixLength = prefixLength; checkAndMaskAddressAndPrefixLength(); @@ -87,7 +88,7 @@ public final class IpPrefix implements Parcelable { */ @SystemApi @TestApi - public IpPrefix(InetAddress address, int prefixLength) { + public IpPrefix(@NonNull InetAddress address, int prefixLength) { // We don't reuse the (byte[], int) constructor because it calls clone() on the byte array, // which is unnecessary because getAddress() already returns a clone. this.address = address.getAddress(); @@ -106,7 +107,7 @@ public final class IpPrefix implements Parcelable { */ @SystemApi @TestApi - public IpPrefix(String prefix) { + public IpPrefix(@NonNull String prefix) { // We don't reuse the (InetAddress, int) constructor because "error: call to this must be // first statement in constructor". We could factor out setting the member variables to an // init() method, but if we did, then we'd have to make the members non-final, or "error: diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java index 78a4e7293947..333603f3a0f2 100644 --- a/core/java/android/net/LinkAddress.java +++ b/core/java/android/net/LinkAddress.java @@ -26,6 +26,7 @@ import static android.system.OsConstants.RT_SCOPE_SITE; import static android.system.OsConstants.RT_SCOPE_UNIVERSE; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -107,8 +108,8 @@ public class LinkAddress implements Parcelable { * * Per RFC 4193 section 8, fc00::/7 identifies these addresses. */ - private boolean isIPv6ULA() { - if (isIPv6()) { + private boolean isIpv6ULA() { + if (isIpv6()) { byte[] bytes = address.getAddress(); return ((bytes[0] & (byte)0xfe) == (byte)0xfc); } @@ -121,17 +122,29 @@ public class LinkAddress implements Parcelable { */ @TestApi @SystemApi - public boolean isIPv6() { + public boolean isIpv6() { return address instanceof Inet6Address; } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return true if the address is IPv6. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean isIPv6() { + return isIpv6(); + } + + /** * @return true if the address is IPv4 or is a mapped IPv4 address. * @hide */ @TestApi @SystemApi - public boolean isIPv4() { + public boolean isIpv4() { return address instanceof Inet4Address; } @@ -217,7 +230,7 @@ public class LinkAddress implements Parcelable { */ @SystemApi @TestApi - public LinkAddress(String address, int flags, int scope) { + public LinkAddress(@NonNull String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(address); @@ -276,7 +289,10 @@ public class LinkAddress implements Parcelable { */ @TestApi @SystemApi - public boolean isSameAddressAs(LinkAddress other) { + public boolean isSameAddressAs(@Nullable LinkAddress other) { + if (other == null) { + return false; + } return address.equals(other.address) && prefixLength == other.prefixLength; } @@ -331,10 +347,10 @@ public class LinkAddress implements Parcelable { * state has cleared either DAD has succeeded or failed, and both * flags are cleared regardless). */ - return (scope == RT_SCOPE_UNIVERSE && - !isIPv6ULA() && - (flags & (IFA_F_DADFAILED | IFA_F_DEPRECATED)) == 0L && - ((flags & IFA_F_TENTATIVE) == 0L || (flags & IFA_F_OPTIMISTIC) != 0L)); + return (scope == RT_SCOPE_UNIVERSE + && !isIpv6ULA() + && (flags & (IFA_F_DADFAILED | IFA_F_DEPRECATED)) == 0L + && ((flags & IFA_F_TENTATIVE) == 0L || (flags & IFA_F_OPTIMISTIC) != 0L)); } /** diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index b52b15e6dd51..d5ca6642a3c3 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -54,11 +54,11 @@ public final class LinkProperties implements Parcelable { // The interface described by the network link. @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private String mIfaceName; - private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>(); - private ArrayList<InetAddress> mDnses = new ArrayList<>(); + private final ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>(); + private final ArrayList<InetAddress> mDnses = new ArrayList<>(); // PCSCF addresses are addresses of SIP proxies that only exist for the IMS core service. - private ArrayList<InetAddress> mPcscfs = new ArrayList<InetAddress>(); - private ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<>(); + private final ArrayList<InetAddress> mPcscfs = new ArrayList<InetAddress>(); + private final ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<>(); private boolean mUsePrivateDns; private String mPrivateDnsServerName; private String mDomains; @@ -150,8 +150,8 @@ public final class LinkProperties implements Parcelable { // connections getting stuck until timeouts fire and other // baffling failures. Therefore, loss of either IPv4 or IPv6 on a // previously dual-stack network is deemed a lost of provisioning. - if ((before.isIPv4Provisioned() && !after.isIPv4Provisioned()) || - (before.isIPv6Provisioned() && !after.isIPv6Provisioned())) { + if ((before.isIpv4Provisioned() && !after.isIpv4Provisioned()) + || (before.isIpv6Provisioned() && !after.isIpv6Provisioned())) { return ProvisioningChange.LOST_PROVISIONING; } return ProvisioningChange.STILL_PROVISIONED; @@ -165,9 +165,8 @@ public final class LinkProperties implements Parcelable { } /** - * @hide + * Constructs a new {@code LinkProperties} with default values. */ - @SystemApi public LinkProperties() { } @@ -176,7 +175,7 @@ public final class LinkProperties implements Parcelable { */ @SystemApi @TestApi - public LinkProperties(LinkProperties source) { + public LinkProperties(@Nullable LinkProperties source) { if (source != null) { mIfaceName = source.mIfaceName; mLinkAddresses.addAll(source.mLinkAddresses); @@ -202,10 +201,8 @@ public final class LinkProperties implements Parcelable { * will have their interface changed to match this new value. * * @param iface The name of the network interface used for this link. - * @hide */ - @SystemApi - public void setInterfaceName(String iface) { + public void setInterfaceName(@Nullable String iface) { mIfaceName = iface; ArrayList<RouteInfo> newRoutes = new ArrayList<>(mRoutes.size()); for (RouteInfo route : mRoutes) { @@ -227,7 +224,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public List<String> getAllInterfaceNames() { + public @NonNull List<String> getAllInterfaceNames() { List<String> interfaceNames = new ArrayList<>(mStackedLinks.size() + 1); if (mIfaceName != null) interfaceNames.add(mIfaceName); for (LinkProperties stacked: mStackedLinks.values()) { @@ -247,8 +244,8 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public List<InetAddress> getAddresses() { - List<InetAddress> addresses = new ArrayList<>(); + public @NonNull List<InetAddress> getAddresses() { + final List<InetAddress> addresses = new ArrayList<>(); for (LinkAddress linkAddress : mLinkAddresses) { addresses.add(linkAddress.getAddress()); } @@ -260,7 +257,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public List<InetAddress> getAllAddresses() { + public @NonNull List<InetAddress> getAllAddresses() { List<InetAddress> addresses = new ArrayList<>(); for (LinkAddress linkAddress : mLinkAddresses) { addresses.add(linkAddress.getAddress()); @@ -289,7 +286,7 @@ public final class LinkProperties implements Parcelable { */ @SystemApi @TestApi - public boolean addLinkAddress(LinkAddress address) { + public boolean addLinkAddress(@NonNull LinkAddress address) { if (address == null) { return false; } @@ -318,7 +315,10 @@ public final class LinkProperties implements Parcelable { */ @SystemApi @TestApi - public boolean removeLinkAddress(LinkAddress toRemove) { + public boolean removeLinkAddress(@NonNull LinkAddress toRemove) { + if (toRemove == null) { + return false; + } int i = findLinkAddressIndex(toRemove); if (i >= 0) { mLinkAddresses.remove(i); @@ -333,7 +333,7 @@ public final class LinkProperties implements Parcelable { * * @return An unmodifiable {@link List} of {@link LinkAddress} for this link. */ - public List<LinkAddress> getLinkAddresses() { + public @NonNull List<LinkAddress> getLinkAddresses() { return Collections.unmodifiableList(mLinkAddresses); } @@ -356,10 +356,8 @@ public final class LinkProperties implements Parcelable { * * @param addresses The {@link Collection} of {@link LinkAddress} to set in this * object. - * @hide */ - @SystemApi - public void setLinkAddresses(Collection<LinkAddress> addresses) { + public void setLinkAddresses(@NonNull Collection<LinkAddress> addresses) { mLinkAddresses.clear(); for (LinkAddress address: addresses) { addLinkAddress(address); @@ -375,7 +373,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean addDnsServer(InetAddress dnsServer) { + public boolean addDnsServer(@NonNull InetAddress dnsServer) { if (dnsServer != null && !mDnses.contains(dnsServer)) { mDnses.add(dnsServer); return true; @@ -392,7 +390,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean removeDnsServer(InetAddress dnsServer) { + public boolean removeDnsServer(@NonNull InetAddress dnsServer) { if (dnsServer != null) { return mDnses.remove(dnsServer); } @@ -404,10 +402,8 @@ public final class LinkProperties implements Parcelable { * the given {@link Collection} of {@link InetAddress} objects. * * @param dnsServers The {@link Collection} of DNS servers to set in this object. - * @hide */ - @SystemApi - public void setDnsServers(Collection<InetAddress> dnsServers) { + public void setDnsServers(@NonNull Collection<InetAddress> dnsServers) { mDnses.clear(); for (InetAddress dnsServer: dnsServers) { addDnsServer(dnsServer); @@ -420,7 +416,7 @@ public final class LinkProperties implements Parcelable { * @return An unmodifiable {@link List} of {@link InetAddress} for DNS servers on * this link. */ - public List<InetAddress> getDnsServers() { + public @NonNull List<InetAddress> getDnsServers() { return Collections.unmodifiableList(mDnses); } @@ -490,7 +486,7 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was added, false if it was already present. * @hide */ - public boolean addValidatedPrivateDnsServer(InetAddress dnsServer) { + public boolean addValidatedPrivateDnsServer(@NonNull InetAddress dnsServer) { if (dnsServer != null && !mValidatedPrivateDnses.contains(dnsServer)) { mValidatedPrivateDnses.add(dnsServer); return true; @@ -506,11 +502,8 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was removed, false if it did not exist. * @hide */ - public boolean removeValidatedPrivateDnsServer(InetAddress dnsServer) { - if (dnsServer != null) { - return mValidatedPrivateDnses.remove(dnsServer); - } - return false; + public boolean removeValidatedPrivateDnsServer(@NonNull InetAddress dnsServer) { + return mValidatedPrivateDnses.remove(dnsServer); } /** @@ -523,7 +516,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public void setValidatedPrivateDnsServers(Collection<InetAddress> dnsServers) { + public void setValidatedPrivateDnsServers(@NonNull Collection<InetAddress> dnsServers) { mValidatedPrivateDnses.clear(); for (InetAddress dnsServer: dnsServers) { addValidatedPrivateDnsServer(dnsServer); @@ -534,13 +527,13 @@ public final class LinkProperties implements Parcelable { * Returns all the {@link InetAddress} for validated private DNS servers on this link. * These are resolved from the private DNS server name. * - * @return An umodifiable {@link List} of {@link InetAddress} for validated private + * @return An unmodifiable {@link List} of {@link InetAddress} for validated private * DNS servers on this link. * @hide */ @TestApi @SystemApi - public List<InetAddress> getValidatedPrivateDnsServers() { + public @NonNull List<InetAddress> getValidatedPrivateDnsServers() { return Collections.unmodifiableList(mValidatedPrivateDnses); } @@ -551,7 +544,7 @@ public final class LinkProperties implements Parcelable { * @return true if the PCSCF server was added, false otherwise. * @hide */ - public boolean addPcscfServer(InetAddress pcscfServer) { + public boolean addPcscfServer(@NonNull InetAddress pcscfServer) { if (pcscfServer != null && !mPcscfs.contains(pcscfServer)) { mPcscfs.add(pcscfServer); return true; @@ -562,27 +555,24 @@ public final class LinkProperties implements Parcelable { /** * Removes the given {@link InetAddress} from the list of PCSCF servers. * - * @param pcscf Server The {@link InetAddress} to remove from the list of PCSCF servers. + * @param pcscfServer The {@link InetAddress} to remove from the list of PCSCF servers. * @return true if the PCSCF server was removed, false otherwise. * @hide */ - public boolean removePcscfServer(InetAddress pcscfServer) { - if (pcscfServer != null) { - return mPcscfs.remove(pcscfServer); - } - return false; + public boolean removePcscfServer(@NonNull InetAddress pcscfServer) { + return mPcscfs.remove(pcscfServer); } /** * Replaces the PCSCF servers in this {@code LinkProperties} with * the given {@link Collection} of {@link InetAddress} objects. * - * @param addresses The {@link Collection} of PCSCF servers to set in this object. + * @param pcscfServers The {@link Collection} of PCSCF servers to set in this object. * @hide */ @SystemApi @TestApi - public void setPcscfServers(Collection<InetAddress> pcscfServers) { + public void setPcscfServers(@NonNull Collection<InetAddress> pcscfServers) { mPcscfs.clear(); for (InetAddress pcscfServer: pcscfServers) { addPcscfServer(pcscfServer); @@ -598,7 +588,7 @@ public final class LinkProperties implements Parcelable { */ @SystemApi @TestApi - public List<InetAddress> getPcscfServers() { + public @NonNull List<InetAddress> getPcscfServers() { return Collections.unmodifiableList(mPcscfs); } @@ -607,20 +597,18 @@ public final class LinkProperties implements Parcelable { * * @param domains A {@link String} listing in priority order the comma separated * domains to search when resolving host names on this link. - * @hide */ - @SystemApi - public void setDomains(String domains) { + public void setDomains(@Nullable String domains) { mDomains = domains; } /** - * Get the DNS domains search path set for this link. + * Get the DNS domains search path set for this link. May be {@code null} if not set. * - * @return A {@link String} containing the comma separated domains to search when resolving - * host names on this link. + * @return A {@link String} containing the comma separated domains to search when resolving host + * names on this link or {@code null}. */ - public String getDomains() { + public @Nullable String getDomains() { return mDomains; } @@ -630,9 +618,7 @@ public final class LinkProperties implements Parcelable { * 10000 will be ignored. * * @param mtu The MTU to use for this link. - * @hide */ - @SystemApi public void setMtu(int mtu) { mMtu = mtu; } @@ -657,20 +643,20 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public void setTcpBufferSizes(String tcpBufferSizes) { + public void setTcpBufferSizes(@Nullable String tcpBufferSizes) { mTcpBufferSizes = tcpBufferSizes; } /** - * Gets the tcp buffer sizes. + * Gets the tcp buffer sizes. May be {@code null} if not set. * - * @return the tcp buffer sizes to use when this link is the system default. + * @return the tcp buffer sizes to use when this link is the system default or {@code null}. * * @hide */ @TestApi @SystemApi - public String getTcpBufferSizes() { + public @Nullable String getTcpBufferSizes() { return mTcpBufferSizes; } @@ -690,23 +676,18 @@ public final class LinkProperties implements Parcelable { * * @param route A {@link RouteInfo} to add to this object. * @return {@code false} if the route was already present, {@code true} if it was added. - * - * @hide */ - @SystemApi - public boolean addRoute(RouteInfo route) { - if (route != null) { - String routeIface = route.getInterface(); - if (routeIface != null && !routeIface.equals(mIfaceName)) { - throw new IllegalArgumentException( - "Route added with non-matching interface: " + routeIface + - " vs. " + mIfaceName); - } - route = routeWithInterface(route); - if (!mRoutes.contains(route)) { - mRoutes.add(route); - return true; - } + public boolean addRoute(@NonNull RouteInfo route) { + String routeIface = route.getInterface(); + if (routeIface != null && !routeIface.equals(mIfaceName)) { + throw new IllegalArgumentException( + "Route added with non-matching interface: " + routeIface + + " vs. " + mIfaceName); + } + route = routeWithInterface(route); + if (!mRoutes.contains(route)) { + mRoutes.add(route); + return true; } return false; } @@ -722,10 +703,8 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean removeRoute(RouteInfo route) { - return route != null && - Objects.equals(mIfaceName, route.getInterface()) && - mRoutes.remove(route); + public boolean removeRoute(@NonNull RouteInfo route) { + return Objects.equals(mIfaceName, route.getInterface()) && mRoutes.remove(route); } /** @@ -733,7 +712,7 @@ public final class LinkProperties implements Parcelable { * * @return An unmodifiable {@link List} of {@link RouteInfo} for this link. */ - public List<RouteInfo> getRoutes() { + public @NonNull List<RouteInfo> getRoutes() { return Collections.unmodifiableList(mRoutes); } @@ -753,7 +732,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public List<RouteInfo> getAllRoutes() { + public @NonNull List<RouteInfo> getAllRoutes() { List<RouteInfo> routes = new ArrayList<>(mRoutes); for (LinkProperties stacked: mStackedLinks.values()) { routes.addAll(stacked.getAllRoutes()); @@ -767,26 +746,24 @@ public final class LinkProperties implements Parcelable { * not enforce it and applications may ignore them. * * @param proxy A {@link ProxyInfo} defining the HTTP Proxy to use on this link. - * @hide */ - @SystemApi - public void setHttpProxy(ProxyInfo proxy) { + public void setHttpProxy(@Nullable ProxyInfo proxy) { mHttpProxy = proxy; } /** * Gets the recommended {@link ProxyInfo} (or {@code null}) set on this link. * - * @return The {@link ProxyInfo} set on this link + * @return The {@link ProxyInfo} set on this link or {@code null}. */ - public ProxyInfo getHttpProxy() { + public @Nullable ProxyInfo getHttpProxy() { return mHttpProxy; } /** * Returns the NAT64 prefix in use on this link, if any. * - * @return the NAT64 prefix. + * @return the NAT64 prefix or {@code null}. * @hide */ @SystemApi @@ -799,14 +776,14 @@ public final class LinkProperties implements Parcelable { * Sets the NAT64 prefix in use on this link. * * Currently, only 96-bit prefixes (i.e., where the 32-bit IPv4 address is at the end of the - * 128-bit IPv6 address) are supported. + * 128-bit IPv6 address) are supported or {@code null} for no prefix. * * @param prefix the NAT64 prefix. * @hide */ @SystemApi @TestApi - public void setNat64Prefix(IpPrefix prefix) { + public void setNat64Prefix(@Nullable IpPrefix prefix) { if (prefix != null && prefix.getPrefixLength() != 96) { throw new IllegalArgumentException("Only 96-bit prefixes are supported: " + prefix); } @@ -818,15 +795,15 @@ public final class LinkProperties implements Parcelable { * * If there is already a stacked link with the same interface name as link, * that link is replaced with link. Otherwise, link is added to the list - * of stacked links. If link is null, nothing changes. + * of stacked links. * * @param link The link to add. * @return true if the link was stacked, false otherwise. * @hide */ @UnsupportedAppUsage - public boolean addStackedLink(LinkProperties link) { - if (link != null && link.getInterfaceName() != null) { + public boolean addStackedLink(@NonNull LinkProperties link) { + if (link.getInterfaceName() != null) { mStackedLinks.put(link.getInterfaceName(), link); return true; } @@ -843,12 +820,9 @@ public final class LinkProperties implements Parcelable { * @return true if the link was removed, false otherwise. * @hide */ - public boolean removeStackedLink(String iface) { - if (iface != null) { - LinkProperties removed = mStackedLinks.remove(iface); - return removed != null; - } - return false; + public boolean removeStackedLink(@NonNull String iface) { + LinkProperties removed = mStackedLinks.remove(iface); + return removed != null; } /** @@ -860,7 +834,7 @@ public final class LinkProperties implements Parcelable { if (mStackedLinks.isEmpty()) { return Collections.emptyList(); } - List<LinkProperties> stacked = new ArrayList<>(); + final List<LinkProperties> stacked = new ArrayList<>(); for (LinkProperties link : mStackedLinks.values()) { stacked.add(new LinkProperties(link)); } @@ -869,9 +843,7 @@ public final class LinkProperties implements Parcelable { /** * Clears this object to its initial state. - * @hide */ - @SystemApi public void clear() { mIfaceName = null; mLinkAddresses.clear(); @@ -988,7 +960,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean hasIPv4Address() { + public boolean hasIpv4Address() { for (LinkAddress address : mLinkAddresses) { if (address.getAddress() instanceof Inet4Address) { return true; @@ -998,15 +970,27 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is an IPv4 address, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasIPv4Address() { + return hasIpv4Address(); + } + + /** * Returns true if this link or any of its stacked interfaces has an IPv4 address. * * @return {@code true} if there is an IPv4 address, {@code false} otherwise. */ - private boolean hasIPv4AddressOnInterface(String iface) { + private boolean hasIpv4AddressOnInterface(String iface) { // mIfaceName can be null. - return (Objects.equals(iface, mIfaceName) && hasIPv4Address()) || - (iface != null && mStackedLinks.containsKey(iface) && - mStackedLinks.get(iface).hasIPv4Address()); + return (Objects.equals(iface, mIfaceName) && hasIpv4Address()) + || (iface != null && mStackedLinks.containsKey(iface) + && mStackedLinks.get(iface).hasIpv4Address()); } /** @@ -1017,7 +1001,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean hasGlobalIPv6Address() { + public boolean hasGlobalIpv6Address() { for (LinkAddress address : mLinkAddresses) { if (address.getAddress() instanceof Inet6Address && address.isGlobalPreferred()) { return true; @@ -1027,13 +1011,25 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is a global preferred IPv6 address, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasGlobalIPv6Address() { + return hasGlobalIpv6Address(); + } + + /** * Returns true if this link has an IPv4 default route. * * @return {@code true} if there is an IPv4 default route, {@code false} otherwise. * @hide */ @UnsupportedAppUsage - public boolean hasIPv4DefaultRoute() { + public boolean hasIpv4DefaultRoute() { for (RouteInfo r : mRoutes) { if (r.isIPv4Default()) { return true; @@ -1043,6 +1039,18 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is an IPv4 default route, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasIPv4DefaultRoute() { + return hasIpv4DefaultRoute(); + } + + /** * Returns true if this link has an IPv6 default route. * * @return {@code true} if there is an IPv6 default route, {@code false} otherwise. @@ -1050,7 +1058,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean hasIPv6DefaultRoute() { + public boolean hasIpv6DefaultRoute() { for (RouteInfo r : mRoutes) { if (r.isIPv6Default()) { return true; @@ -1060,13 +1068,25 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is an IPv6 default route, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasIPv6DefaultRoute() { + return hasIpv6DefaultRoute(); + } + + /** * Returns true if this link has an IPv4 DNS server. * * @return {@code true} if there is an IPv4 DNS server, {@code false} otherwise. * @hide */ @UnsupportedAppUsage - public boolean hasIPv4DnsServer() { + public boolean hasIpv4DnsServer() { for (InetAddress ia : mDnses) { if (ia instanceof Inet4Address) { return true; @@ -1076,13 +1096,25 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is an IPv4 DNS server, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasIPv4DnsServer() { + return hasIpv4DnsServer(); + } + + /** * Returns true if this link has an IPv6 DNS server. * * @return {@code true} if there is an IPv6 DNS server, {@code false} otherwise. * @hide */ @UnsupportedAppUsage - public boolean hasIPv6DnsServer() { + public boolean hasIpv6DnsServer() { for (InetAddress ia : mDnses) { if (ia instanceof Inet6Address) { return true; @@ -1092,12 +1124,24 @@ public final class LinkProperties implements Parcelable { } /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if there is an IPv6 DNS server, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + public boolean hasIPv6DnsServer() { + return hasIpv6DnsServer(); + } + + /** * Returns true if this link has an IPv4 PCSCF server. * * @return {@code true} if there is an IPv4 PCSCF server, {@code false} otherwise. * @hide */ - public boolean hasIPv4PcscfServer() { + public boolean hasIpv4PcscfServer() { for (InetAddress ia : mPcscfs) { if (ia instanceof Inet4Address) { return true; @@ -1112,7 +1156,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv6 PCSCF server, {@code false} otherwise. * @hide */ - public boolean hasIPv6PcscfServer() { + public boolean hasIpv6PcscfServer() { for (InetAddress ia : mPcscfs) { if (ia instanceof Inet6Address) { return true; @@ -1130,10 +1174,10 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean isIPv4Provisioned() { - return (hasIPv4Address() && - hasIPv4DefaultRoute() && - hasIPv4DnsServer()); + public boolean isIpv4Provisioned() { + return (hasIpv4Address() + && hasIpv4DefaultRoute() + && hasIpv4DnsServer()); } /** @@ -1145,12 +1189,25 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi + public boolean isIpv6Provisioned() { + return (hasGlobalIpv6Address() + && hasIpv6DefaultRoute() + && hasIpv6DnsServer()); + } + + /** + * For backward compatibility. + * This was annotated with @UnsupportedAppUsage in P, so we can't remove the method completely + * just yet. + * @return {@code true} if the link is provisioned, {@code false} otherwise. + * @hide + */ + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public boolean isIPv6Provisioned() { - return (hasGlobalIPv6Address() && - hasIPv6DefaultRoute() && - hasIPv6DnsServer()); + return isIpv6Provisioned(); } + /** * Returns true if this link is provisioned for global connectivity, * for at least one Internet Protocol family. @@ -1161,7 +1218,7 @@ public final class LinkProperties implements Parcelable { @TestApi @SystemApi public boolean isProvisioned() { - return (isIPv4Provisioned() || isIPv6Provisioned()); + return (isIpv4Provisioned() || isIpv6Provisioned()); } /** @@ -1173,7 +1230,7 @@ public final class LinkProperties implements Parcelable { */ @TestApi @SystemApi - public boolean isReachable(InetAddress ip) { + public boolean isReachable(@NonNull InetAddress ip) { final List<RouteInfo> allRoutes = getAllRoutes(); // If we don't have a route to this IP address, it's not reachable. final RouteInfo bestRoute = RouteInfo.selectBestRoute(allRoutes, ip); @@ -1185,7 +1242,7 @@ public final class LinkProperties implements Parcelable { if (ip instanceof Inet4Address) { // For IPv4, it suffices for now to simply have any address. - return hasIPv4AddressOnInterface(bestRoute.getInterface()); + return hasIpv4AddressOnInterface(bestRoute.getInterface()); } else if (ip instanceof Inet6Address) { if (ip.isLinkLocalAddress()) { // For now, just make sure link-local destinations have @@ -1196,7 +1253,7 @@ public final class LinkProperties implements Parcelable { // For non-link-local destinations check that either the best route // is directly connected or that some global preferred address exists. // TODO: reconsider all cases (disconnected ULA networks, ...). - return (!bestRoute.hasGateway() || hasGlobalIPv6Address()); + return (!bestRoute.hasGateway() || hasGlobalIpv6Address()); } } @@ -1211,7 +1268,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public boolean isIdenticalInterfaceName(LinkProperties target) { + public boolean isIdenticalInterfaceName(@NonNull LinkProperties target) { return TextUtils.equals(getInterfaceName(), target.getInterfaceName()); } @@ -1223,7 +1280,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public boolean isIdenticalAddresses(LinkProperties target) { + public boolean isIdenticalAddresses(@NonNull LinkProperties target) { Collection<InetAddress> targetAddresses = target.getAddresses(); Collection<InetAddress> sourceAddresses = getAddresses(); return (sourceAddresses.size() == targetAddresses.size()) ? @@ -1238,7 +1295,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public boolean isIdenticalDnses(LinkProperties target) { + public boolean isIdenticalDnses(@NonNull LinkProperties target) { Collection<InetAddress> targetDnses = target.getDnsServers(); String targetDomains = target.getDomains(); if (mDomains == null) { @@ -1258,7 +1315,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalPrivateDns(LinkProperties target) { + public boolean isIdenticalPrivateDns(@NonNull LinkProperties target) { return (isPrivateDnsActive() == target.isPrivateDnsActive() && TextUtils.equals(getPrivateDnsServerName(), target.getPrivateDnsServerName())); @@ -1272,7 +1329,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalValidatedPrivateDnses(LinkProperties target) { + public boolean isIdenticalValidatedPrivateDnses(@NonNull LinkProperties target) { Collection<InetAddress> targetDnses = target.getValidatedPrivateDnsServers(); return (mValidatedPrivateDnses.size() == targetDnses.size()) ? mValidatedPrivateDnses.containsAll(targetDnses) : false; @@ -1285,7 +1342,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalPcscfs(LinkProperties target) { + public boolean isIdenticalPcscfs(@NonNull LinkProperties target) { Collection<InetAddress> targetPcscfs = target.getPcscfServers(); return (mPcscfs.size() == targetPcscfs.size()) ? mPcscfs.containsAll(targetPcscfs) : false; @@ -1299,7 +1356,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public boolean isIdenticalRoutes(LinkProperties target) { + public boolean isIdenticalRoutes(@NonNull LinkProperties target) { Collection<RouteInfo> targetRoutes = target.getRoutes(); return (mRoutes.size() == targetRoutes.size()) ? mRoutes.containsAll(targetRoutes) : false; @@ -1313,7 +1370,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) - public boolean isIdenticalHttpProxy(LinkProperties target) { + public boolean isIdenticalHttpProxy(@NonNull LinkProperties target) { return getHttpProxy() == null ? target.getHttpProxy() == null : getHttpProxy().equals(target.getHttpProxy()); } @@ -1326,7 +1383,7 @@ public final class LinkProperties implements Parcelable { * @hide */ @UnsupportedAppUsage - public boolean isIdenticalStackedLinks(LinkProperties target) { + public boolean isIdenticalStackedLinks(@NonNull LinkProperties target) { if (!mStackedLinks.keySet().equals(target.mStackedLinks.keySet())) { return false; } @@ -1347,7 +1404,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalMtu(LinkProperties target) { + public boolean isIdenticalMtu(@NonNull LinkProperties target) { return getMtu() == target.getMtu(); } @@ -1358,7 +1415,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalTcpBufferSizes(LinkProperties target) { + public boolean isIdenticalTcpBufferSizes(@NonNull LinkProperties target) { return Objects.equals(mTcpBufferSizes, target.mTcpBufferSizes); } @@ -1369,7 +1426,7 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if both are identical, {@code false} otherwise. * @hide */ - public boolean isIdenticalNat64Prefix(LinkProperties target) { + public boolean isIdenticalNat64Prefix(@NonNull LinkProperties target) { return Objects.equals(mNat64Prefix, target.mNat64Prefix); } @@ -1421,7 +1478,7 @@ public final class LinkProperties implements Parcelable { * @return the differences between the addresses. * @hide */ - public CompareResult<LinkAddress> compareAddresses(LinkProperties target) { + public @NonNull CompareResult<LinkAddress> compareAddresses(@Nullable LinkProperties target) { /* * Duplicate the LinkAddresses into removed, we will be removing * address which are common between mLinkAddresses and target @@ -1441,7 +1498,7 @@ public final class LinkProperties implements Parcelable { * @return the differences between the DNS addresses. * @hide */ - public CompareResult<InetAddress> compareDnses(LinkProperties target) { + public @NonNull CompareResult<InetAddress> compareDnses(@Nullable LinkProperties target) { /* * Duplicate the InetAddresses into removed, we will be removing * dns address which are common between mDnses and target @@ -1460,7 +1517,8 @@ public final class LinkProperties implements Parcelable { * @return the differences between the DNS addresses. * @hide */ - public CompareResult<InetAddress> compareValidatedPrivateDnses(LinkProperties target) { + public @NonNull CompareResult<InetAddress> compareValidatedPrivateDnses( + @Nullable LinkProperties target) { return new CompareResult<>(mValidatedPrivateDnses, target != null ? target.getValidatedPrivateDnsServers() : null); } @@ -1473,7 +1531,7 @@ public final class LinkProperties implements Parcelable { * @return the differences between the routes. * @hide */ - public CompareResult<RouteInfo> compareAllRoutes(LinkProperties target) { + public @NonNull CompareResult<RouteInfo> compareAllRoutes(@Nullable LinkProperties target) { /* * Duplicate the RouteInfos into removed, we will be removing * routes which are common between mRoutes and target @@ -1491,7 +1549,8 @@ public final class LinkProperties implements Parcelable { * @return the differences between the interface names. * @hide */ - public CompareResult<String> compareAllInterfaceNames(LinkProperties target) { + public @NonNull CompareResult<String> compareAllInterfaceNames( + @Nullable LinkProperties target) { /* * Duplicate the interface names into removed, we will be removing * interface names which are common between this and target diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 0fafdf76b491..3f56def6d7d5 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -16,6 +16,7 @@ package android.net; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -125,7 +126,7 @@ public class Network implements Parcelable { */ @SystemApi @TestApi - public Network(Network that) { + public Network(@NonNull Network that) { this(that.netId, that.mPrivateDnsBypass); } @@ -163,7 +164,7 @@ public class Network implements Parcelable { */ @TestApi @SystemApi - public Network getPrivateDnsBypassingCopy() { + public @NonNull Network getPrivateDnsBypassingCopy() { return new Network(netId, true); } diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index c57ae0c9fc32..02145f2705c7 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -17,6 +17,7 @@ package android.net; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -91,7 +92,7 @@ public final class NetworkCapabilities implements Parcelable { * Set all contents of this object to the contents of a NetworkCapabilities. * @hide */ - public void set(NetworkCapabilities nc) { + public void set(@NonNull NetworkCapabilities nc) { mNetworkCapabilities = nc.mNetworkCapabilities; mTransportTypes = nc.mTransportTypes; mLinkUpBandwidthKbps = nc.mLinkUpBandwidthKbps; @@ -405,7 +406,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @UnsupportedAppUsage - public NetworkCapabilities addCapability(@NetCapability int capability) { + public @NonNull NetworkCapabilities addCapability(@NetCapability int capability) { checkValidCapability(capability); mNetworkCapabilities |= 1 << capability; mUnwantedNetworkCapabilities &= ~(1 << capability); // remove from unwanted capability list @@ -442,7 +443,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @UnsupportedAppUsage - public NetworkCapabilities removeCapability(@NetCapability int capability) { + public @NonNull NetworkCapabilities removeCapability(@NetCapability int capability) { checkValidCapability(capability); final long mask = ~(1 << capability); mNetworkCapabilities &= mask; @@ -456,7 +457,8 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public NetworkCapabilities setCapability(@NetCapability int capability, boolean value) { + public @NonNull NetworkCapabilities setCapability(@NetCapability int capability, + boolean value) { if (value) { addCapability(capability); } else { @@ -534,7 +536,7 @@ public final class NetworkCapabilities implements Parcelable { } /** Note this method may result in having the same capability in wanted and unwanted lists. */ - private void combineNetCapabilities(NetworkCapabilities nc) { + private void combineNetCapabilities(@NonNull NetworkCapabilities nc) { this.mNetworkCapabilities |= nc.mNetworkCapabilities; this.mUnwantedNetworkCapabilities |= nc.mUnwantedNetworkCapabilities; } @@ -546,7 +548,7 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public String describeFirstNonRequestableCapability() { + public @Nullable String describeFirstNonRequestableCapability() { final long nonRequestable = (mNetworkCapabilities | mUnwantedNetworkCapabilities) & NON_REQUESTABLE_CAPABILITIES; @@ -558,7 +560,8 @@ public final class NetworkCapabilities implements Parcelable { return null; } - private boolean satisfiedByNetCapabilities(NetworkCapabilities nc, boolean onlyImmutable) { + private boolean satisfiedByNetCapabilities(@NonNull NetworkCapabilities nc, + boolean onlyImmutable) { long requestedCapabilities = mNetworkCapabilities; long requestedUnwantedCapabilities = mUnwantedNetworkCapabilities; long providedCapabilities = nc.mNetworkCapabilities; @@ -572,12 +575,12 @@ public final class NetworkCapabilities implements Parcelable { } /** @hide */ - public boolean equalsNetCapabilities(NetworkCapabilities nc) { + public boolean equalsNetCapabilities(@NonNull NetworkCapabilities nc) { return (nc.mNetworkCapabilities == this.mNetworkCapabilities) && (nc.mUnwantedNetworkCapabilities == this.mUnwantedNetworkCapabilities); } - private boolean equalsNetCapabilitiesRequestable(NetworkCapabilities that) { + private boolean equalsNetCapabilitiesRequestable(@NonNull NetworkCapabilities that) { return ((this.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == (that.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)) && ((this.mUnwantedNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == @@ -713,7 +716,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @UnsupportedAppUsage - public NetworkCapabilities addTransportType(@Transport int transportType) { + public @NonNull NetworkCapabilities addTransportType(@Transport int transportType) { checkValidTransportType(transportType); mTransportTypes |= 1 << transportType; setNetworkSpecifier(mNetworkSpecifier); // used for exception checking @@ -727,7 +730,7 @@ public final class NetworkCapabilities implements Parcelable { * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ - public NetworkCapabilities removeTransportType(@Transport int transportType) { + public @NonNull NetworkCapabilities removeTransportType(@Transport int transportType) { checkValidTransportType(transportType); mTransportTypes &= ~(1 << transportType); setNetworkSpecifier(mNetworkSpecifier); // used for exception checking @@ -740,7 +743,8 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public NetworkCapabilities setTransportType(@Transport int transportType, boolean value) { + public @NonNull NetworkCapabilities setTransportType(@Transport int transportType, + boolean value) { if (value) { addTransportType(transportType); } else { @@ -757,7 +761,7 @@ public final class NetworkCapabilities implements Parcelable { */ @TestApi @SystemApi - public @Transport int[] getTransportTypes() { + @NonNull public @Transport int[] getTransportTypes() { return BitUtils.unpackBits(mTransportTypes); } @@ -847,7 +851,7 @@ public final class NetworkCapabilities implements Parcelable { * @param upKbps the estimated first hop upstream (device to network) bandwidth. * @hide */ - public NetworkCapabilities setLinkUpstreamBandwidthKbps(int upKbps) { + public @NonNull NetworkCapabilities setLinkUpstreamBandwidthKbps(int upKbps) { mLinkUpBandwidthKbps = upKbps; return this; } @@ -877,7 +881,7 @@ public final class NetworkCapabilities implements Parcelable { * @param downKbps the estimated first hop downstream (network to device) bandwidth. * @hide */ - public NetworkCapabilities setLinkDownstreamBandwidthKbps(int downKbps) { + public @NonNull NetworkCapabilities setLinkDownstreamBandwidthKbps(int downKbps) { mLinkDownBandwidthKbps = downKbps; return this; } @@ -936,7 +940,7 @@ public final class NetworkCapabilities implements Parcelable { * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ - public NetworkCapabilities setNetworkSpecifier(NetworkSpecifier networkSpecifier) { + public @NonNull NetworkCapabilities setNetworkSpecifier(NetworkSpecifier networkSpecifier) { if (networkSpecifier != null && Long.bitCount(mTransportTypes) != 1) { throw new IllegalStateException("Must have a single transport specified to use " + "setNetworkSpecifier"); @@ -955,20 +959,20 @@ public final class NetworkCapabilities implements Parcelable { * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ - public NetworkCapabilities setTransportInfo(TransportInfo transportInfo) { + public @NonNull NetworkCapabilities setTransportInfo(TransportInfo transportInfo) { mTransportInfo = transportInfo; return this; } /** - * Gets the optional bearer specific network specifier. + * Gets the optional bearer specific network specifier. May be {@code null} if not set. * * @return The optional {@link NetworkSpecifier} specifying the bearer specific network - * specifier. See {@link #setNetworkSpecifier}. + * specifier or {@code null}. See {@link #setNetworkSpecifier}. * @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) - public NetworkSpecifier getNetworkSpecifier() { + public @Nullable NetworkSpecifier getNetworkSpecifier() { return mNetworkSpecifier; } @@ -1015,8 +1019,6 @@ public final class NetworkCapabilities implements Parcelable { /** * Magic value that indicates no signal strength provided. A request specifying this value is * always satisfied. - * - * @hide */ public static final int SIGNAL_STRENGTH_UNSPECIFIED = Integer.MIN_VALUE; @@ -1024,7 +1026,7 @@ public final class NetworkCapabilities implements Parcelable { * Signal strength. This is a signed integer, and higher values indicate better signal. * The exact units are bearer-dependent. For example, Wi-Fi uses RSSI. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) private int mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED; /** @@ -1041,7 +1043,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @UnsupportedAppUsage - public NetworkCapabilities setSignalStrength(int signalStrength) { + public @NonNull NetworkCapabilities setSignalStrength(int signalStrength) { mSignalStrength = signalStrength; return this; } @@ -1060,9 +1062,7 @@ public final class NetworkCapabilities implements Parcelable { * Retrieves the signal strength. * * @return The bearer-specific signal strength. - * @hide */ - @SystemApi public int getSignalStrength() { return mSignalStrength; } @@ -1120,7 +1120,7 @@ public final class NetworkCapabilities implements Parcelable { * Convenience method to set the UIDs this network applies to to a single UID. * @hide */ - public NetworkCapabilities setSingleUid(int uid) { + public @NonNull NetworkCapabilities setSingleUid(int uid) { final ArraySet<UidRange> identity = new ArraySet<>(1); identity.add(new UidRange(uid, uid)); setUids(identity); @@ -1132,7 +1132,7 @@ public final class NetworkCapabilities implements Parcelable { * This makes a copy of the set so that callers can't modify it after the call. * @hide */ - public NetworkCapabilities setUids(Set<UidRange> uids) { + public @NonNull NetworkCapabilities setUids(Set<UidRange> uids) { if (null == uids) { mUids = null; } else { @@ -1146,7 +1146,7 @@ public final class NetworkCapabilities implements Parcelable { * This returns a copy of the set so that callers can't modify the original object. * @hide */ - public Set<UidRange> getUids() { + public @Nullable Set<UidRange> getUids() { return null == mUids ? null : new ArraySet<>(mUids); } @@ -1179,7 +1179,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @VisibleForTesting - public boolean equalsUids(NetworkCapabilities nc) { + public boolean equalsUids(@NonNull NetworkCapabilities nc) { Set<UidRange> comparedUids = nc.mUids; if (null == comparedUids) return null == mUids; if (null == mUids) return false; @@ -1212,7 +1212,7 @@ public final class NetworkCapabilities implements Parcelable { * @see #appliesToUid * @hide */ - public boolean satisfiedByUids(NetworkCapabilities nc) { + public boolean satisfiedByUids(@NonNull NetworkCapabilities nc) { if (null == nc.mUids || null == mUids) return true; // The network satisfies everything. for (UidRange requiredRange : mUids) { if (requiredRange.contains(nc.mEstablishingVpnAppUid)) return true; @@ -1232,7 +1232,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @VisibleForTesting - public boolean appliesToUidRange(UidRange requiredRange) { + public boolean appliesToUidRange(@Nullable UidRange requiredRange) { if (null == mUids) return true; for (UidRange uidRange : mUids) { if (uidRange.containsRange(requiredRange)) { @@ -1247,7 +1247,7 @@ public final class NetworkCapabilities implements Parcelable { * NetworkCapabilities apply to. * nc is assumed nonnull. */ - private void combineUids(NetworkCapabilities nc) { + private void combineUids(@NonNull NetworkCapabilities nc) { if (null == nc.mUids || null == mUids) { mUids = null; return; @@ -1268,7 +1268,7 @@ public final class NetworkCapabilities implements Parcelable { * Sets the SSID of this network. * @hide */ - public NetworkCapabilities setSSID(String ssid) { + public @NonNull NetworkCapabilities setSSID(@Nullable String ssid) { mSSID = ssid; return this; } @@ -1277,7 +1277,7 @@ public final class NetworkCapabilities implements Parcelable { * Gets the SSID of this network, or null if none or unknown. * @hide */ - public String getSSID() { + public @Nullable String getSSID() { return mSSID; } @@ -1285,7 +1285,7 @@ public final class NetworkCapabilities implements Parcelable { * Tests if the SSID of this network is the same as the SSID of the passed network. * @hide */ - public boolean equalsSSID(NetworkCapabilities nc) { + public boolean equalsSSID(@NonNull NetworkCapabilities nc) { return Objects.equals(mSSID, nc.mSSID); } @@ -1293,7 +1293,7 @@ public final class NetworkCapabilities implements Parcelable { * Check if the SSID requirements of this object are matched by the passed object. * @hide */ - public boolean satisfiedBySSID(NetworkCapabilities nc) { + public boolean satisfiedBySSID(@NonNull NetworkCapabilities nc) { return mSSID == null || mSSID.equals(nc.mSSID); } @@ -1304,7 +1304,7 @@ public final class NetworkCapabilities implements Parcelable { * equal. * @hide */ - private void combineSSIDs(NetworkCapabilities nc) { + private void combineSSIDs(@NonNull NetworkCapabilities nc) { if (mSSID != null && !mSSID.equals(nc.mSSID)) { throw new IllegalStateException("Can't combine two SSIDs"); } @@ -1319,7 +1319,7 @@ public final class NetworkCapabilities implements Parcelable { * both lists will never be satisfied. * @hide */ - public void combineCapabilities(NetworkCapabilities nc) { + public void combineCapabilities(@NonNull NetworkCapabilities nc) { combineNetCapabilities(nc); combineTransportTypes(nc); combineLinkBandwidths(nc); @@ -1359,7 +1359,7 @@ public final class NetworkCapabilities implements Parcelable { */ @TestApi @SystemApi - public boolean satisfiedByNetworkCapabilities(NetworkCapabilities nc) { + public boolean satisfiedByNetworkCapabilities(@Nullable NetworkCapabilities nc) { return satisfiedByNetworkCapabilities(nc, false); } @@ -1370,7 +1370,7 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public boolean satisfiedByImmutableNetworkCapabilities(NetworkCapabilities nc) { + public boolean satisfiedByImmutableNetworkCapabilities(@Nullable NetworkCapabilities nc) { return satisfiedByNetworkCapabilities(nc, true); } @@ -1381,7 +1381,7 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public String describeImmutableDifferences(NetworkCapabilities that) { + public String describeImmutableDifferences(@Nullable NetworkCapabilities that) { if (that == null) { return "other NetworkCapabilities was null"; } @@ -1420,7 +1420,7 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - public boolean equalRequestableCapabilities(NetworkCapabilities nc) { + public boolean equalRequestableCapabilities(@Nullable NetworkCapabilities nc) { if (nc == null) return false; return (equalsNetCapabilitiesRequestable(nc) && equalsTransportTypes(nc) && @@ -1428,7 +1428,7 @@ public final class NetworkCapabilities implements Parcelable { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == null || (obj instanceof NetworkCapabilities == false)) return false; NetworkCapabilities that = (NetworkCapabilities) obj; return (equalsNetCapabilities(that) @@ -1502,7 +1502,7 @@ public final class NetworkCapabilities implements Parcelable { }; @Override - public String toString() { + public @NonNull String toString() { final StringBuilder sb = new StringBuilder("["); if (0 != mTransportTypes) { sb.append(" Transports: "); @@ -1561,8 +1561,8 @@ public final class NetworkCapabilities implements Parcelable { /** * @hide */ - public static void appendStringRepresentationOfBitMaskToStringBuilder(StringBuilder sb, - long bitMask, NameOf nameFetcher, String separator) { + public static void appendStringRepresentationOfBitMaskToStringBuilder(@NonNull StringBuilder sb, + long bitMask, @NonNull NameOf nameFetcher, @NonNull String separator) { int bitPos = 0; boolean firstElementAdded = false; while (bitMask != 0) { @@ -1580,7 +1580,7 @@ public final class NetworkCapabilities implements Parcelable { } /** @hide */ - public void writeToProto(ProtoOutputStream proto, long fieldId) { + public void writeToProto(@NonNull ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); for (int transport : getTransportTypes()) { @@ -1610,7 +1610,7 @@ public final class NetworkCapabilities implements Parcelable { /** * @hide */ - public static String capabilityNamesOf(@NetCapability int[] capabilities) { + public static @NonNull String capabilityNamesOf(@Nullable @NetCapability int[] capabilities) { StringJoiner joiner = new StringJoiner("|"); if (capabilities != null) { for (int c : capabilities) { @@ -1623,7 +1623,7 @@ public final class NetworkCapabilities implements Parcelable { /** * @hide */ - public static String capabilityNameOf(@NetCapability int capability) { + public static @NonNull String capabilityNameOf(@NetCapability int capability) { switch (capability) { case NET_CAPABILITY_MMS: return "MMS"; case NET_CAPABILITY_SUPL: return "SUPL"; @@ -1658,7 +1658,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @UnsupportedAppUsage - public static String transportNamesOf(@Transport int[] types) { + public static @NonNull String transportNamesOf(@Nullable @Transport int[] types) { StringJoiner joiner = new StringJoiner("|"); if (types != null) { for (int t : types) { @@ -1671,7 +1671,7 @@ public final class NetworkCapabilities implements Parcelable { /** * @hide */ - public static String transportNameOf(@Transport int transport) { + public static @NonNull String transportNameOf(@Transport int transport) { if (!isValidTransport(transport)) { return "UNKNOWN"; } diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java index cd835317a3a2..92f105f77172 100644 --- a/core/java/android/net/NetworkInfo.java +++ b/core/java/android/net/NetworkInfo.java @@ -16,6 +16,7 @@ package android.net; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -138,7 +139,9 @@ public class NetworkInfo implements Parcelable { private int mSubtype; private String mTypeName; private String mSubtypeName; + @NonNull private State mState; + @NonNull private DetailedState mDetailedState; private String mReason; private String mExtraInfo; @@ -451,7 +454,7 @@ public class NetworkInfo implements Parcelable { * the device and let apps react more easily and quickly to changes. */ @Deprecated - public DetailedState getDetailedState() { + public @NonNull DetailedState getDetailedState() { synchronized (this) { return mDetailedState; } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index dcb027d187b3..51cbed48e021 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -347,7 +347,7 @@ public class NetworkRequest implements Parcelable { * @hide */ @SystemApi - public Builder setSignalStrength(int signalStrength) { + public @NonNull Builder setSignalStrength(int signalStrength) { mNetworkCapabilities.setSignalStrength(signalStrength); return this; } diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java index c1c8f6eaf3c0..b0239c839348 100644 --- a/core/java/android/net/RouteInfo.java +++ b/core/java/android/net/RouteInfo.java @@ -16,6 +16,7 @@ package android.net; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -112,7 +113,8 @@ public final class RouteInfo implements Parcelable { */ @SystemApi @TestApi - public RouteInfo(IpPrefix destination, InetAddress gateway, String iface, int type) { + public RouteInfo(@Nullable IpPrefix destination, @Nullable InetAddress gateway, + @Nullable String iface, int type) { switch (type) { case RTN_UNICAST: case RTN_UNREACHABLE: diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java index 8b264eeee3c9..e2531059ac61 100644 --- a/core/java/android/net/StaticIpConfiguration.java +++ b/core/java/android/net/StaticIpConfiguration.java @@ -16,6 +16,8 @@ package android.net; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -53,22 +55,26 @@ import java.util.Objects; public final class StaticIpConfiguration implements Parcelable { /** @hide */ @UnsupportedAppUsage + @Nullable public LinkAddress ipAddress; /** @hide */ @UnsupportedAppUsage + @Nullable public InetAddress gateway; /** @hide */ @UnsupportedAppUsage + @NonNull public final ArrayList<InetAddress> dnsServers; /** @hide */ @UnsupportedAppUsage + @Nullable public String domains; public StaticIpConfiguration() { dnsServers = new ArrayList<InetAddress>(); } - public StaticIpConfiguration(StaticIpConfiguration source) { + public StaticIpConfiguration(@Nullable StaticIpConfiguration source) { this(); if (source != null) { // All of these except dnsServers are immutable, so no need to make copies. @@ -86,38 +92,38 @@ public final class StaticIpConfiguration implements Parcelable { domains = null; } - public LinkAddress getIpAddress() { + public @Nullable LinkAddress getIpAddress() { return ipAddress; } - public void setIpAddress(LinkAddress ipAddress) { + public void setIpAddress(@Nullable LinkAddress ipAddress) { this.ipAddress = ipAddress; } - public InetAddress getGateway() { + public @Nullable InetAddress getGateway() { return gateway; } - public void setGateway(InetAddress gateway) { + public void setGateway(@Nullable InetAddress gateway) { this.gateway = gateway; } - public List<InetAddress> getDnsServers() { + public @NonNull List<InetAddress> getDnsServers() { return dnsServers; } - public String getDomains() { + public @Nullable String getDomains() { return domains; } - public void setDomains(String newDomains) { + public void setDomains(@Nullable String newDomains) { domains = newDomains; } /** * Add a DNS server to this configuration. */ - public void addDnsServer(InetAddress server) { + public void addDnsServer(@NonNull InetAddress server) { dnsServers.add(server); } @@ -128,7 +134,7 @@ public final class StaticIpConfiguration implements Parcelable { * route to the gateway as well. This configuration is arguably invalid, but it used to work * in K and earlier, and other OSes appear to accept it. */ - public List<RouteInfo> getRoutes(String iface) { + public @NonNull List<RouteInfo> getRoutes(String iface) { List<RouteInfo> routes = new ArrayList<RouteInfo>(3); if (ipAddress != null) { RouteInfo connectedRoute = new RouteInfo(ipAddress, null, iface); @@ -150,7 +156,7 @@ public final class StaticIpConfiguration implements Parcelable { * IPv6 configuration) will not be included. * @hide */ - public LinkProperties toLinkProperties(String iface) { + public @NonNull LinkProperties toLinkProperties(String iface) { LinkProperties lp = new LinkProperties(); lp.setInterfaceName(iface); if (ipAddress != null) { diff --git a/core/java/android/net/TcpKeepalivePacketDataParcelable.aidl b/core/java/android/net/TcpKeepalivePacketDataParcelable.aidl index 7329c63b09be..d66b6ae3ab54 100644 --- a/core/java/android/net/TcpKeepalivePacketDataParcelable.aidl +++ b/core/java/android/net/TcpKeepalivePacketDataParcelable.aidl @@ -23,4 +23,6 @@ parcelable TcpKeepalivePacketDataParcelable { int dstPort; int seq; int ack; + int rcvWnd; + int rcvWndScale; } diff --git a/core/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java index d6023d701762..17a03c7c8933 100644 --- a/core/java/android/net/apf/ApfCapabilities.java +++ b/core/java/android/net/apf/ApfCapabilities.java @@ -16,6 +16,7 @@ package android.net.apf; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.content.Context; @@ -115,14 +116,14 @@ public final class ApfCapabilities implements Parcelable { /** * @return Whether the APF Filter in the device should filter out IEEE 802.3 Frames. */ - public static boolean getApfDrop8023Frames(Context context) { + public static boolean getApfDrop8023Frames(@NonNull Context context) { return context.getResources().getBoolean(R.bool.config_apfDrop802_3Frames); } /** * @return An array of blacklisted EtherType, packets with EtherTypes within it will be dropped. */ - public static int[] getApfEthTypeBlackList(Context context) { + public static @NonNull int[] getApfEthTypeBlackList(@NonNull Context context) { return context.getResources().getIntArray(R.array.config_apfEthTypeBlackList); } } diff --git a/core/java/android/net/captiveportal/CaptivePortalProbeResult.java b/core/java/android/net/captiveportal/CaptivePortalProbeResult.java index 3930344e5d27..a1d3de248a96 100644 --- a/core/java/android/net/captiveportal/CaptivePortalProbeResult.java +++ b/core/java/android/net/captiveportal/CaptivePortalProbeResult.java @@ -16,6 +16,7 @@ package android.net.captiveportal; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -39,14 +40,18 @@ public final class CaptivePortalProbeResult { */ public static final int PARTIAL_CODE = -1; + @NonNull public static final CaptivePortalProbeResult FAILED = new CaptivePortalProbeResult(FAILED_CODE); + @NonNull public static final CaptivePortalProbeResult SUCCESS = new CaptivePortalProbeResult(SUCCESS_CODE); public static final CaptivePortalProbeResult PARTIAL = new CaptivePortalProbeResult(PARTIAL_CODE); private final int mHttpResponseCode; // HTTP response code returned from Internet probe. + @Nullable public final String redirectUrl; // Redirect destination returned from Internet probe. + @Nullable public final String detectUrl; // URL where a 204 response code indicates // captive portal has been appeased. @Nullable @@ -56,12 +61,13 @@ public final class CaptivePortalProbeResult { this(httpResponseCode, null, null); } - public CaptivePortalProbeResult(int httpResponseCode, String redirectUrl, String detectUrl) { + public CaptivePortalProbeResult(int httpResponseCode, @Nullable String redirectUrl, + @Nullable String detectUrl) { this(httpResponseCode, redirectUrl, detectUrl, null); } - public CaptivePortalProbeResult(int httpResponseCode, String redirectUrl, String detectUrl, - CaptivePortalProbeSpec probeSpec) { + public CaptivePortalProbeResult(int httpResponseCode, @Nullable String redirectUrl, + @Nullable String detectUrl, @Nullable CaptivePortalProbeSpec probeSpec) { mHttpResponseCode = httpResponseCode; this.redirectUrl = redirectUrl; this.detectUrl = detectUrl; diff --git a/core/java/android/net/captiveportal/CaptivePortalProbeSpec.java b/core/java/android/net/captiveportal/CaptivePortalProbeSpec.java index 7ad4ecf2264c..6c6a16c4534e 100644 --- a/core/java/android/net/captiveportal/CaptivePortalProbeSpec.java +++ b/core/java/android/net/captiveportal/CaptivePortalProbeSpec.java @@ -19,6 +19,8 @@ package android.net.captiveportal; import static android.net.captiveportal.CaptivePortalProbeResult.PORTAL_CODE; import static android.net.captiveportal.CaptivePortalProbeResult.SUCCESS_CODE; +import static com.android.internal.util.Preconditions.checkNotNull; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; @@ -48,9 +50,10 @@ public abstract class CaptivePortalProbeSpec { private final String mEncodedSpec; private final URL mUrl; - CaptivePortalProbeSpec(String encodedSpec, URL url) { - mEncodedSpec = encodedSpec; - mUrl = url; + CaptivePortalProbeSpec(@NonNull String encodedSpec, @NonNull URL url) + throws NullPointerException { + mEncodedSpec = checkNotNull(encodedSpec); + mUrl = checkNotNull(url); } /** @@ -64,7 +67,7 @@ public abstract class CaptivePortalProbeSpec { */ @VisibleForTesting @NonNull - public static CaptivePortalProbeSpec parseSpec(String spec) throws ParseException, + public static CaptivePortalProbeSpec parseSpec(@NonNull String spec) throws ParseException, MalformedURLException { if (TextUtils.isEmpty(spec)) { throw new ParseException("Empty probe spec", 0 /* errorOffset */); @@ -84,7 +87,8 @@ public abstract class CaptivePortalProbeSpec { } @Nullable - private static Pattern parsePatternIfNonEmpty(String pattern, int pos) throws ParseException { + private static Pattern parsePatternIfNonEmpty(@Nullable String pattern, int pos) + throws ParseException { if (TextUtils.isEmpty(pattern)) { return null; } @@ -120,8 +124,9 @@ public abstract class CaptivePortalProbeSpec { * <p>Each spec is separated by @@,@@ and follows the format for {@link #parseSpec(String)}. * <p>This method does not throw but ignores any entry that could not be parsed. */ + @NonNull public static Collection<CaptivePortalProbeSpec> parseCaptivePortalProbeSpecs( - String settingsVal) { + @NonNull String settingsVal) { List<CaptivePortalProbeSpec> specs = new ArrayList<>(); if (settingsVal != null) { for (String spec : TextUtils.split(settingsVal, SPEC_SEPARATOR)) { @@ -142,12 +147,15 @@ public abstract class CaptivePortalProbeSpec { /** * Get the probe result from HTTP status and location header. */ + @NonNull public abstract CaptivePortalProbeResult getResult(int status, @Nullable String locationHeader); + @NonNull public String getEncodedSpec() { return mEncodedSpec; } + @NonNull public URL getUrl() { return mUrl; } diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java index b30d8cb04f4c..2bd43782d523 100644 --- a/core/java/android/net/metrics/ApfProgramEvent.java +++ b/core/java/android/net/metrics/ApfProgramEvent.java @@ -17,6 +17,7 @@ package android.net.metrics; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -95,7 +96,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Utility to create an instance of {@link ApfProgramEvent}. */ - public static class Builder { + public static final class Builder { private long mLifetime; private long mActualLifetime; private int mFilteredRas; @@ -106,6 +107,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the maximum computed lifetime of the program in seconds. */ + @NonNull public Builder setLifetime(long lifetime) { mLifetime = lifetime; return this; @@ -114,6 +116,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the effective program lifetime in seconds. */ + @NonNull public Builder setActualLifetime(long lifetime) { mActualLifetime = lifetime; return this; @@ -122,6 +125,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the number of RAs filtered by the APF program. */ + @NonNull public Builder setFilteredRas(int filteredRas) { mFilteredRas = filteredRas; return this; @@ -130,6 +134,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the total number of current RAs at generation time. */ + @NonNull public Builder setCurrentRas(int currentRas) { mCurrentRas = currentRas; return this; @@ -138,6 +143,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the length of the APF program in bytes. */ + @NonNull public Builder setProgramLength(int programLength) { mProgramLength = programLength; return this; @@ -146,6 +152,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Set the flags describing what an Apf program filters. */ + @NonNull public Builder setFlags(boolean hasIPv4, boolean multicastFilterOn) { mFlags = flagsFor(hasIPv4, multicastFilterOn); return this; @@ -154,6 +161,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { /** * Build a new {@link ApfProgramEvent}. */ + @NonNull public ApfProgramEvent build() { return new ApfProgramEvent(mLifetime, mActualLifetime, mFilteredRas, mCurrentRas, mProgramLength, mFlags); diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java index e1c8888deff7..6c3b7af6b888 100644 --- a/core/java/android/net/metrics/ApfStats.java +++ b/core/java/android/net/metrics/ApfStats.java @@ -16,6 +16,7 @@ package android.net.metrics; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -125,7 +126,7 @@ public final class ApfStats implements IpConnectivityLog.Event { */ @SystemApi @TestApi - public static class Builder { + public static final class Builder { private long mDurationMs; private int mReceivedRas; private int mMatchingRas; @@ -140,6 +141,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the time interval in milliseconds these statistics covers. */ + @NonNull public Builder setDurationMs(long durationMs) { mDurationMs = durationMs; return this; @@ -148,6 +150,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of received RAs. */ + @NonNull public Builder setReceivedRas(int receivedRas) { mReceivedRas = receivedRas; return this; @@ -156,6 +159,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of received RAs matching a known RA. */ + @NonNull public Builder setMatchingRas(int matchingRas) { mMatchingRas = matchingRas; return this; @@ -164,6 +168,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of received RAs ignored due to the MAX_RAS limit. */ + @NonNull public Builder setDroppedRas(int droppedRas) { mDroppedRas = droppedRas; return this; @@ -172,6 +177,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of received RAs with a minimum lifetime of 0. */ + @NonNull public Builder setZeroLifetimeRas(int zeroLifetimeRas) { mZeroLifetimeRas = zeroLifetimeRas; return this; @@ -180,6 +186,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of received RAs that could not be parsed. */ + @NonNull public Builder setParseErrors(int parseErrors) { mParseErrors = parseErrors; return this; @@ -188,6 +195,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of APF program updates from receiving RAs. */ + @NonNull public Builder setProgramUpdates(int programUpdates) { mProgramUpdates = programUpdates; return this; @@ -196,6 +204,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the total number of APF program updates. */ + @NonNull public Builder setProgramUpdatesAll(int programUpdatesAll) { mProgramUpdatesAll = programUpdatesAll; return this; @@ -204,6 +213,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the number of APF program updates from allowing multicast traffic. */ + @NonNull public Builder setProgramUpdatesAllowingMulticast(int programUpdatesAllowingMulticast) { mProgramUpdatesAllowingMulticast = programUpdatesAllowingMulticast; return this; @@ -212,6 +222,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Set the maximum APF program size advertised by hardware. */ + @NonNull public Builder setMaxProgramSize(int maxProgramSize) { mMaxProgramSize = maxProgramSize; return this; @@ -220,6 +231,7 @@ public final class ApfStats implements IpConnectivityLog.Event { /** * Create a new {@link ApfStats}. */ + @NonNull public ApfStats build() { return new ApfStats(mDurationMs, mReceivedRas, mMatchingRas, mDroppedRas, mZeroLifetimeRas, mParseErrors, mProgramUpdates, mProgramUpdatesAll, diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index e4faea9247d7..a3d0a20194f2 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -16,6 +16,7 @@ package android.net.metrics; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -51,13 +52,14 @@ public final class DhcpClientEvent implements IpConnectivityLog.Event { /** * Utility to create an instance of {@link ApfProgramEvent}. */ - public static class Builder { + public static final class Builder { private String mMsg; private int mDurationMs; /** * Set the message of the event. */ + @NonNull public Builder setMsg(String msg) { mMsg = msg; return this; @@ -66,6 +68,7 @@ public final class DhcpClientEvent implements IpConnectivityLog.Event { /** * Set the duration of the event in milliseconds. */ + @NonNull public Builder setDurationMs(int durationMs) { mDurationMs = durationMs; return this; @@ -74,6 +77,7 @@ public final class DhcpClientEvent implements IpConnectivityLog.Event { /** * Create a new {@link DhcpClientEvent}. */ + @NonNull public DhcpClientEvent build() { return new DhcpClientEvent(mMsg, mDurationMs); } diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java index 91318a2459d2..652ce5dd19a3 100644 --- a/core/java/android/net/metrics/DhcpErrorEvent.java +++ b/core/java/android/net/metrics/DhcpErrorEvent.java @@ -37,26 +37,26 @@ public final class DhcpErrorEvent implements IpConnectivityLog.Event { public static final int DHCP_ERROR = 4; public static final int MISC_ERROR = 5; - public static final int L2_TOO_SHORT = makeErrorCode(L2_ERROR, 1); - public static final int L2_WRONG_ETH_TYPE = makeErrorCode(L2_ERROR, 2); + public static final int L2_TOO_SHORT = (L2_ERROR << 24) | (1 << 16); + public static final int L2_WRONG_ETH_TYPE = (L2_ERROR << 24) | (2 << 16); - public static final int L3_TOO_SHORT = makeErrorCode(L3_ERROR, 1); - public static final int L3_NOT_IPV4 = makeErrorCode(L3_ERROR, 2); - public static final int L3_INVALID_IP = makeErrorCode(L3_ERROR, 3); + public static final int L3_TOO_SHORT = (L3_ERROR << 24) | (1 << 16); + public static final int L3_NOT_IPV4 = (L3_ERROR << 24) | (2 << 16); + public static final int L3_INVALID_IP = (L3_ERROR << 24) | (3 << 16); - public static final int L4_NOT_UDP = makeErrorCode(L4_ERROR, 1); - public static final int L4_WRONG_PORT = makeErrorCode(L4_ERROR, 2); + public static final int L4_NOT_UDP = (L4_ERROR << 24) | (1 << 16); + public static final int L4_WRONG_PORT = (L4_ERROR << 24) | (2 << 16); - public static final int BOOTP_TOO_SHORT = makeErrorCode(DHCP_ERROR, 1); - public static final int DHCP_BAD_MAGIC_COOKIE = makeErrorCode(DHCP_ERROR, 2); - public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3); - public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4); - public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5); - public static final int DHCP_NO_COOKIE = makeErrorCode(DHCP_ERROR, 6); + public static final int BOOTP_TOO_SHORT = (DHCP_ERROR << 24) | (1 << 16); + public static final int DHCP_BAD_MAGIC_COOKIE = (DHCP_ERROR << 24) | (2 << 16); + public static final int DHCP_INVALID_OPTION_LENGTH = (DHCP_ERROR << 24) | (3 << 16); + public static final int DHCP_NO_MSG_TYPE = (DHCP_ERROR << 24) | (4 << 16); + public static final int DHCP_UNKNOWN_MSG_TYPE = (DHCP_ERROR << 24) | (5 << 16); + public static final int DHCP_NO_COOKIE = (DHCP_ERROR << 24) | (6 << 16); - public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1); - public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2); - public static final int PARSING_ERROR = makeErrorCode(MISC_ERROR, 3); + public static final int BUFFER_UNDERFLOW = (MISC_ERROR << 24) | (1 << 16); + public static final int RECEIVE_ERROR = (MISC_ERROR << 24) | (2 << 16); + public static final int PARSING_ERROR = (MISC_ERROR << 24) | (3 << 16); // error code byte format (MSB to LSB): // byte 0: error type @@ -102,10 +102,6 @@ public final class DhcpErrorEvent implements IpConnectivityLog.Event { return (0xFFFF0000 & errorCode) | (0xFF & option); } - private static int makeErrorCode(int type, int subtype) { - return (type << 24) | ((0xFF & subtype) << 16); - } - @Override public String toString() { return String.format("DhcpErrorEvent(%s)", Decoder.constants.get(errorCode)); diff --git a/core/java/android/net/metrics/IpConnectivityLog.java b/core/java/android/net/metrics/IpConnectivityLog.java index 5b5a23578954..680c01573f98 100644 --- a/core/java/android/net/metrics/IpConnectivityLog.java +++ b/core/java/android/net/metrics/IpConnectivityLog.java @@ -16,6 +16,7 @@ package android.net.metrics; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.net.ConnectivityMetricsEvent; @@ -41,7 +42,7 @@ public class IpConnectivityLog { /** @hide */ public static final String SERVICE_NAME = "connmetrics"; - + @NonNull private IIpConnectivityMetrics mService; /** @@ -57,7 +58,7 @@ public class IpConnectivityLog { /** @hide */ @VisibleForTesting - public IpConnectivityLog(IIpConnectivityMetrics service) { + public IpConnectivityLog(@NonNull IIpConnectivityMetrics service) { mService = service; } @@ -83,7 +84,7 @@ public class IpConnectivityLog { * @return true if the event was successfully logged. * @hide */ - public boolean log(ConnectivityMetricsEvent ev) { + public boolean log(@NonNull ConnectivityMetricsEvent ev) { if (!checkLoggerService()) { if (DBG) { Log.d(TAG, SERVICE_NAME + " service was not ready"); @@ -109,7 +110,7 @@ public class IpConnectivityLog { * @param data is a Parcelable instance representing the event. * @return true if the event was successfully logged. */ - public boolean log(long timestamp, Event data) { + public boolean log(long timestamp, @NonNull Event data) { ConnectivityMetricsEvent ev = makeEv(data); ev.timestamp = timestamp; return log(ev); @@ -121,7 +122,7 @@ public class IpConnectivityLog { * @param data is a Parcelable instance representing the event. * @return true if the event was successfully logged. */ - public boolean log(String ifname, Event data) { + public boolean log(@NonNull String ifname, @NonNull Event data) { ConnectivityMetricsEvent ev = makeEv(data); ev.ifname = ifname; return log(ev); @@ -135,7 +136,7 @@ public class IpConnectivityLog { * @param data is a Parcelable instance representing the event. * @return true if the event was successfully logged. */ - public boolean log(Network network, int[] transports, Event data) { + public boolean log(@NonNull Network network, @NonNull int[] transports, @NonNull Event data) { return log(network.netId, transports, data); } @@ -147,7 +148,7 @@ public class IpConnectivityLog { * @param data is a Parcelable instance representing the event. * @return true if the event was successfully logged. */ - public boolean log(int netid, int[] transports, Event data) { + public boolean log(int netid, @NonNull int[] transports, @NonNull Event data) { ConnectivityMetricsEvent ev = makeEv(data); ev.netId = netid; ev.transports = BitUtils.packBits(transports); @@ -159,7 +160,7 @@ public class IpConnectivityLog { * @param data is a Parcelable instance representing the event. * @return true if the event was successfully logged. */ - public boolean log(Event data) { + public boolean log(@NonNull Event data) { return log(makeEv(data)); } diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java index 0d43f12e6537..b2f6585cc2fc 100644 --- a/core/java/android/net/metrics/RaEvent.java +++ b/core/java/android/net/metrics/RaEvent.java @@ -16,6 +16,7 @@ package android.net.metrics; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.os.Parcel; @@ -107,7 +108,7 @@ public final class RaEvent implements IpConnectivityLog.Event { } }; - public static class Builder { + public static final class Builder { long routerLifetime = NO_LIFETIME; long prefixValidLifetime = NO_LIFETIME; @@ -119,37 +120,37 @@ public final class RaEvent implements IpConnectivityLog.Event { public Builder() { } - public RaEvent build() { + public @NonNull RaEvent build() { return new RaEvent(routerLifetime, prefixValidLifetime, prefixPreferredLifetime, routeInfoLifetime, rdnssLifetime, dnsslLifetime); } - public Builder updateRouterLifetime(long lifetime) { + public @NonNull Builder updateRouterLifetime(long lifetime) { routerLifetime = updateLifetime(routerLifetime, lifetime); return this; } - public Builder updatePrefixValidLifetime(long lifetime) { + public @NonNull Builder updatePrefixValidLifetime(long lifetime) { prefixValidLifetime = updateLifetime(prefixValidLifetime, lifetime); return this; } - public Builder updatePrefixPreferredLifetime(long lifetime) { + public @NonNull Builder updatePrefixPreferredLifetime(long lifetime) { prefixPreferredLifetime = updateLifetime(prefixPreferredLifetime, lifetime); return this; } - public Builder updateRouteInfoLifetime(long lifetime) { + public @NonNull Builder updateRouteInfoLifetime(long lifetime) { routeInfoLifetime = updateLifetime(routeInfoLifetime, lifetime); return this; } - public Builder updateRdnssLifetime(long lifetime) { + public @NonNull Builder updateRdnssLifetime(long lifetime) { rdnssLifetime = updateLifetime(rdnssLifetime, lifetime); return this; } - public Builder updateDnsslLifetime(long lifetime) { + public @NonNull Builder updateDnsslLifetime(long lifetime) { dnsslLifetime = updateLifetime(dnsslLifetime, lifetime); return this; } diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index 052758da7aba..45b665d45cc5 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -17,6 +17,7 @@ package android.net.metrics; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; import android.os.Parcel; @@ -81,7 +82,7 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { /** * Utility to create an instance of {@link ValidationProbeEvent}. */ - public static class Builder { + public static final class Builder { private long mDurationMs; private int mProbeType; private int mReturnCode; @@ -89,6 +90,7 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { /** * Set the duration of the probe in milliseconds. */ + @NonNull public Builder setDurationMs(long durationMs) { mDurationMs = durationMs; return this; @@ -97,6 +99,7 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { /** * Set the probe type based on whether it was the first validation. */ + @NonNull public Builder setProbeType(int probeType, boolean firstValidation) { mProbeType = makeProbeType(probeType, firstValidation); return this; @@ -105,6 +108,7 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { /** * Set the return code of the probe. */ + @NonNull public Builder setReturnCode(int returnCode) { mReturnCode = returnCode; return this; @@ -113,6 +117,7 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { /** * Create a new {@link ValidationProbeEvent}. */ + @NonNull public ValidationProbeEvent build() { return new ValidationProbeEvent(mDurationMs, mProbeType, mReturnCode); } diff --git a/core/java/android/net/nsd/INsdManager.aidl b/core/java/android/net/nsd/INsdManager.aidl index 3361a7b84b53..9484c74bcb23 100644 --- a/core/java/android/net/nsd/INsdManager.aidl +++ b/core/java/android/net/nsd/INsdManager.aidl @@ -25,6 +25,7 @@ import android.os.Messenger; */ interface INsdManager { + @UnsupportedAppUsage Messenger getMessenger(); void setEnabled(boolean enable); } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 4fae3a8d52a8..b64fe007bcd9 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -200,13 +200,21 @@ public abstract class BatteryStats implements Parcelable { /** * Include only the current run in the stats. + * + * @deprecated As of {@link android.os.Build.VERSION_CODES#Q}, only {@link #STATS_SINCE_CHARGED} + * is supported. */ @UnsupportedAppUsage + @Deprecated public static final int STATS_CURRENT = 1; /** * Include only the run since the last time the device was unplugged in the stats. + * + * @deprecated As of {@link android.os.Build.VERSION_CODES#Q}, only {@link #STATS_SINCE_CHARGED} + * is supported. */ + @Deprecated public static final int STATS_SINCE_UNPLUGGED = 2; // NOTE: Update this list if you add/change any stats above. @@ -255,8 +263,10 @@ public abstract class BatteryStats implements Parcelable { * - Ambient display properly output in data dump. * New in version 33: * - Fixed bug in min learned capacity updating process. + * New in version 34: + * - Deprecated STATS_SINCE_UNPLUGGED and STATS_CURRENT. */ - static final int CHECKIN_VERSION = 33; + static final int CHECKIN_VERSION = 34; /** * Old version, we hit 9 and ran out of room, need to remove. @@ -3651,6 +3661,14 @@ public abstract class BatteryStats implements Parcelable { */ public final void dumpCheckinLocked(Context context, PrintWriter pw, int which, int reqUid, boolean wifiOnly) { + + if (which != BatteryStats.STATS_SINCE_CHARGED) { + dumpLine(pw, 0, STAT_NAMES[which], "err", + "ERROR: BatteryStats.dumpCheckin called for which type " + which + + " but only STATS_SINCE_CHARGED is supported."); + return; + } + final long rawUptime = SystemClock.uptimeMillis() * 1000; final long rawRealtimeMs = SystemClock.elapsedRealtime(); final long rawRealtime = rawRealtimeMs * 1000; @@ -3848,28 +3866,13 @@ public abstract class BatteryStats implements Parcelable { multicastWakeLockTimeTotalMicros / 1000, multicastWakeLockCountTotal); - if (which == STATS_SINCE_UNPLUGGED) { - dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(), - getDischargeCurrentLevel()); - } - - if (which == STATS_SINCE_UNPLUGGED) { - dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, - getDischargeStartLevel()-getDischargeCurrentLevel(), - getDischargeStartLevel()-getDischargeCurrentLevel(), - getDischargeAmountScreenOn(), getDischargeAmountScreenOff(), - dischargeCount / 1000, dischargeScreenOffCount / 1000, - getDischargeAmountScreenDoze(), dischargeScreenDozeCount / 1000, - dischargeLightDozeCount / 1000, dischargeDeepDozeCount / 1000); - } else { - dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, - getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(), - getDischargeAmountScreenOnSinceCharge(), - getDischargeAmountScreenOffSinceCharge(), - dischargeCount / 1000, dischargeScreenOffCount / 1000, - getDischargeAmountScreenDozeSinceCharge(), dischargeScreenDozeCount / 1000, - dischargeLightDozeCount / 1000, dischargeDeepDozeCount / 1000); - } + dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, + getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(), + getDischargeAmountScreenOnSinceCharge(), + getDischargeAmountScreenOffSinceCharge(), + dischargeCount / 1000, dischargeScreenOffCount / 1000, + getDischargeAmountScreenDozeSinceCharge(), dischargeScreenDozeCount / 1000, + dischargeLightDozeCount / 1000, dischargeDeepDozeCount / 1000); if (reqUid < 0) { final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats(); @@ -4432,6 +4435,13 @@ public abstract class BatteryStats implements Parcelable { @SuppressWarnings("unused") public final void dumpLocked(Context context, PrintWriter pw, String prefix, final int which, int reqUid, boolean wifiOnly) { + + if (which != BatteryStats.STATS_SINCE_CHARGED) { + pw.println("ERROR: BatteryStats.dump called for which type " + which + + " but only STATS_SINCE_CHARGED is supported"); + return; + } + final long rawUptime = SystemClock.uptimeMillis() * 1000; final long rawRealtime = SystemClock.elapsedRealtime() * 1000; final long rawRealtimeMs = (rawRealtime + 500) / 1000; @@ -5044,41 +5054,18 @@ public abstract class BatteryStats implements Parcelable { pw.println(); - if (which == STATS_SINCE_UNPLUGGED) { - if (getIsOnBattery()) { - pw.print(prefix); pw.println(" Device is currently unplugged"); - pw.print(prefix); pw.print(" Discharge cycle start level: "); - pw.println(getDischargeStartLevel()); - pw.print(prefix); pw.print(" Discharge cycle current level: "); - pw.println(getDischargeCurrentLevel()); - } else { - pw.print(prefix); pw.println(" Device is currently plugged into power"); - pw.print(prefix); pw.print(" Last discharge cycle start level: "); - pw.println(getDischargeStartLevel()); - pw.print(prefix); pw.print(" Last discharge cycle end level: "); - pw.println(getDischargeCurrentLevel()); - } - pw.print(prefix); pw.print(" Amount discharged while screen on: "); - pw.println(getDischargeAmountScreenOn()); - pw.print(prefix); pw.print(" Amount discharged while screen off: "); - pw.println(getDischargeAmountScreenOff()); - pw.print(prefix); pw.print(" Amount discharged while screen doze: "); - pw.println(getDischargeAmountScreenDoze()); - pw.println(" "); - } else { - pw.print(prefix); pw.println(" Device battery use since last full charge"); - pw.print(prefix); pw.print(" Amount discharged (lower bound): "); - pw.println(getLowDischargeAmountSinceCharge()); - pw.print(prefix); pw.print(" Amount discharged (upper bound): "); - pw.println(getHighDischargeAmountSinceCharge()); - pw.print(prefix); pw.print(" Amount discharged while screen on: "); - pw.println(getDischargeAmountScreenOnSinceCharge()); - pw.print(prefix); pw.print(" Amount discharged while screen off: "); - pw.println(getDischargeAmountScreenOffSinceCharge()); - pw.print(prefix); pw.print(" Amount discharged while screen doze: "); - pw.println(getDischargeAmountScreenDozeSinceCharge()); - pw.println(); - } + pw.print(prefix); pw.println(" Device battery use since last full charge"); + pw.print(prefix); pw.print(" Amount discharged (lower bound): "); + pw.println(getLowDischargeAmountSinceCharge()); + pw.print(prefix); pw.print(" Amount discharged (upper bound): "); + pw.println(getHighDischargeAmountSinceCharge()); + pw.print(prefix); pw.print(" Amount discharged while screen on: "); + pw.println(getDischargeAmountScreenOnSinceCharge()); + pw.print(prefix); pw.print(" Amount discharged while screen off: "); + pw.println(getDischargeAmountScreenOffSinceCharge()); + pw.print(prefix); pw.print(" Amount discharged while screen doze: "); + pw.println(getDischargeAmountScreenDozeSinceCharge()); + pw.println(); final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly); helper.create(this); diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 423334008818..b5c6604c8b99 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -34,6 +34,7 @@ interface IPowerManager String historyTag); void acquireWakeLockWithUid(IBinder lock, int flags, String tag, String packageName, int uidtoblame); + @UnsupportedAppUsage void releaseWakeLock(IBinder lock, int flags); void updateWakeLockUids(IBinder lock, in int[] uids); oneway void powerHint(int hintId, int data); diff --git a/core/java/android/os/ServiceSpecificException.java b/core/java/android/os/ServiceSpecificException.java index 3b0f26ae8867..03d5d3e195e0 100644 --- a/core/java/android/os/ServiceSpecificException.java +++ b/core/java/android/os/ServiceSpecificException.java @@ -15,6 +15,7 @@ */ package android.os; +import android.annotation.Nullable; import android.annotation.SystemApi; /** @@ -34,7 +35,7 @@ import android.annotation.SystemApi; public class ServiceSpecificException extends RuntimeException { public final int errorCode; - public ServiceSpecificException(int errorCode, String message) { + public ServiceSpecificException(int errorCode, @Nullable String message) { super(message); this.errorCode = errorCode; } diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java index e695a1b21593..64effb8fa0cc 100644 --- a/core/java/android/os/SystemClock.java +++ b/core/java/android/os/SystemClock.java @@ -20,6 +20,8 @@ import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.app.IAlarmManager; import android.content.Context; +import android.location.ILocationManager; +import android.location.LocationTime; import android.util.Slog; import dalvik.annotation.optimization.CriticalNative; @@ -317,4 +319,33 @@ public final class SystemClock { } }; } + + /** + * Returns a {@link Clock} that starts at January 1, 1970 00:00:00.0 UTC, + * synchronized using the device's location provider. + * + * @throws DateTimeException when the location provider has not had a location fix since boot. + */ + public static @NonNull Clock currentGnssTimeClock() { + return new SimpleClock(ZoneOffset.UTC) { + private final ILocationManager mMgr = ILocationManager.Stub + .asInterface(ServiceManager.getService(Context.LOCATION_SERVICE)); + @Override + public long millis() { + LocationTime time; + try { + time = mMgr.getGnssTimeMillis(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return 0; + } + if (time == null) { + throw new DateTimeException("Gnss based time is not available."); + } + long currentNanos = elapsedRealtimeNanos(); + long deltaMs = (currentNanos - time.getElapsedRealtimeNanos()) / 1000000L; + return time.getTime() + deltaMs; + } + }; + } } diff --git a/core/java/android/os/health/SystemHealthManager.java b/core/java/android/os/health/SystemHealthManager.java index 71eda19e165b..a92e28a47660 100644 --- a/core/java/android/os/health/SystemHealthManager.java +++ b/core/java/android/os/health/SystemHealthManager.java @@ -37,11 +37,13 @@ import com.android.internal.app.IBatteryStats; * by the logging itself. It can be substantial. * <p> * <b>Battery Usage</b><br> - * The statistics related to power (battery) usage are recorded since the device - * was last unplugged. It is expected that applications schedule more work to do - * while the device is plugged in (e.g. using {@link android.app.job.JobScheduler - * JobScheduler}), and while that can affect charging rates, it is still preferable - * to actually draining the battery. + * Since Android version {@link android.os.Build.VERSION_CODES#Q}, the statistics related to power + * (battery) usage are recorded since the device was last considered fully charged (for previous + * versions, it is instead since the device was last unplugged). + * It is expected that applications schedule more work to do while the device is + * plugged in (e.g. using {@link android.app.job.JobScheduler JobScheduler}), and + * while that can affect charging rates, it is still preferable to actually draining + * the battery. */ @SystemService(Context.SYSTEM_HEALTH_SERVICE) public class SystemHealthManager { diff --git a/core/java/android/permission/RuntimePermissionUsageInfo.java b/core/java/android/permission/RuntimePermissionUsageInfo.java index 9f954f7dcbe9..863b0ad9c3d4 100644 --- a/core/java/android/permission/RuntimePermissionUsageInfo.java +++ b/core/java/android/permission/RuntimePermissionUsageInfo.java @@ -35,7 +35,7 @@ import android.os.Parcelable; */ @SystemApi public final class RuntimePermissionUsageInfo implements Parcelable { - private final @NonNull CharSequence mName; + private final @NonNull String mName; private final int mNumUsers; /** @@ -44,7 +44,7 @@ public final class RuntimePermissionUsageInfo implements Parcelable { * @param name The permission group name. * @param numUsers The number of apps that have used this permission. */ - public RuntimePermissionUsageInfo(@NonNull CharSequence name, int numUsers) { + public RuntimePermissionUsageInfo(@NonNull String name, int numUsers) { checkNotNull(name); checkArgumentNonnegative(numUsers); @@ -53,7 +53,7 @@ public final class RuntimePermissionUsageInfo implements Parcelable { } private RuntimePermissionUsageInfo(Parcel parcel) { - this(parcel.readCharSequence(), parcel.readInt()); + this(parcel.readString(), parcel.readInt()); } /** @@ -68,7 +68,7 @@ public final class RuntimePermissionUsageInfo implements Parcelable { * * @return The name. */ - public @NonNull CharSequence getName() { + public @NonNull String getName() { return mName; } @@ -79,7 +79,7 @@ public final class RuntimePermissionUsageInfo implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeCharSequence(mName); + parcel.writeString(mName); parcel.writeInt(mNumUsers); } diff --git a/core/java/android/preference/PreferenceGroupAdapter.java b/core/java/android/preference/PreferenceGroupAdapter.java index fb41ea8218b7..dcc5d4c58784 100644 --- a/core/java/android/preference/PreferenceGroupAdapter.java +++ b/core/java/android/preference/PreferenceGroupAdapter.java @@ -16,6 +16,7 @@ package android.preference; +import android.annotation.UnsupportedAppUsage; import android.graphics.drawable.Drawable; import android.os.Handler; import android.preference.Preference.OnPreferenceChangeInternalListener; @@ -215,6 +216,7 @@ public class PreferenceGroupAdapter extends BaseAdapter return mPreferenceList.size(); } + @UnsupportedAppUsage public Preference getItem(int position) { if (position < 0 || position >= getCount()) return null; return mPreferenceList.get(position); diff --git a/core/java/android/security/keymaster/KeymasterBlobArgument.java b/core/java/android/security/keymaster/KeymasterBlobArgument.java index 541d33ef614f..fc562bd2174e 100644 --- a/core/java/android/security/keymaster/KeymasterBlobArgument.java +++ b/core/java/android/security/keymaster/KeymasterBlobArgument.java @@ -16,14 +16,17 @@ package android.security.keymaster; +import android.annotation.UnsupportedAppUsage; import android.os.Parcel; /** * @hide */ class KeymasterBlobArgument extends KeymasterArgument { + @UnsupportedAppUsage public final byte[] blob; + @UnsupportedAppUsage public KeymasterBlobArgument(int tag, byte[] blob) { super(tag); switch (KeymasterDefs.getTagType(tag)) { @@ -36,6 +39,7 @@ class KeymasterBlobArgument extends KeymasterArgument { this.blob = blob; } + @UnsupportedAppUsage public KeymasterBlobArgument(int tag, Parcel in) { super(tag); blob = in.createByteArray(); diff --git a/core/java/android/security/keymaster/KeymasterBooleanArgument.java b/core/java/android/security/keymaster/KeymasterBooleanArgument.java index 67b3281a8a64..4286aa0d4ae3 100644 --- a/core/java/android/security/keymaster/KeymasterBooleanArgument.java +++ b/core/java/android/security/keymaster/KeymasterBooleanArgument.java @@ -16,6 +16,7 @@ package android.security.keymaster; +import android.annotation.UnsupportedAppUsage; import android.os.Parcel; /** @@ -36,6 +37,7 @@ class KeymasterBooleanArgument extends KeymasterArgument { } } + @UnsupportedAppUsage public KeymasterBooleanArgument(int tag, Parcel in) { super(tag); } diff --git a/core/java/android/security/keymaster/KeymasterDateArgument.java b/core/java/android/security/keymaster/KeymasterDateArgument.java index aa15e34e3e86..3e04c1543117 100644 --- a/core/java/android/security/keymaster/KeymasterDateArgument.java +++ b/core/java/android/security/keymaster/KeymasterDateArgument.java @@ -16,6 +16,7 @@ package android.security.keymaster; +import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import java.util.Date; @@ -36,6 +37,7 @@ class KeymasterDateArgument extends KeymasterArgument { this.date = date; } + @UnsupportedAppUsage public KeymasterDateArgument(int tag, Parcel in) { super(tag); date = new Date(in.readLong()); diff --git a/core/java/android/security/keymaster/KeymasterIntArgument.java b/core/java/android/security/keymaster/KeymasterIntArgument.java index 578d2498612d..4aadce458395 100644 --- a/core/java/android/security/keymaster/KeymasterIntArgument.java +++ b/core/java/android/security/keymaster/KeymasterIntArgument.java @@ -16,14 +16,17 @@ package android.security.keymaster; +import android.annotation.UnsupportedAppUsage; import android.os.Parcel; /** * @hide */ class KeymasterIntArgument extends KeymasterArgument { + @UnsupportedAppUsage public final int value; + @UnsupportedAppUsage public KeymasterIntArgument(int tag, int value) { super(tag); switch (KeymasterDefs.getTagType(tag)) { @@ -38,6 +41,7 @@ class KeymasterIntArgument extends KeymasterArgument { this.value = value; } + @UnsupportedAppUsage public KeymasterIntArgument(int tag, Parcel in) { super(tag); value = in.readInt(); diff --git a/core/java/android/security/keymaster/KeymasterLongArgument.java b/core/java/android/security/keymaster/KeymasterLongArgument.java index d3d40ba0cb9d..bc2255e22a69 100644 --- a/core/java/android/security/keymaster/KeymasterLongArgument.java +++ b/core/java/android/security/keymaster/KeymasterLongArgument.java @@ -16,14 +16,17 @@ package android.security.keymaster; +import android.annotation.UnsupportedAppUsage; import android.os.Parcel; /** * @hide */ class KeymasterLongArgument extends KeymasterArgument { + @UnsupportedAppUsage public final long value; + @UnsupportedAppUsage public KeymasterLongArgument(int tag, long value) { super(tag); switch (KeymasterDefs.getTagType(tag)) { @@ -36,6 +39,7 @@ class KeymasterLongArgument extends KeymasterArgument { this.value = value; } + @UnsupportedAppUsage public KeymasterLongArgument(int tag, Parcel in) { super(tag); value = in.readLong(); diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl index b84e6c9bc962..d3f2a70029f7 100644 --- a/core/java/android/service/dreams/IDreamManager.aidl +++ b/core/java/android/service/dreams/IDreamManager.aidl @@ -23,12 +23,16 @@ import android.os.IBinder; /** @hide */ interface IDreamManager { + @UnsupportedAppUsage void dream(); + @UnsupportedAppUsage void awaken(); + @UnsupportedAppUsage void setDreamComponents(in ComponentName[] componentNames); ComponentName[] getDreamComponents(); ComponentName getDefaultDreamComponent(); void testDream(in ComponentName componentName); + @UnsupportedAppUsage boolean isDreaming(); void finishSelf(in IBinder token, boolean immediate); void startDozing(in IBinder token, int screenState, int screenBrightness); diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java index 1cdb62fe8934..8ba9a8357c65 100644 --- a/core/java/android/service/notification/Adjustment.java +++ b/core/java/android/service/notification/Adjustment.java @@ -16,6 +16,7 @@ package android.service.notification; import android.annotation.NonNull; +import android.annotation.StringDef; import android.annotation.SystemApi; import android.app.Notification; import android.os.Bundle; @@ -23,6 +24,9 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Ranking updates from the Assistant. * @@ -43,6 +47,14 @@ public final class Adjustment implements Parcelable { private final Bundle mSignals; private final int mUser; + /** @hide */ + @StringDef (prefix = { "KEY_" }, value = { + KEY_CONTEXTUAL_ACTIONS, KEY_GROUP_KEY, KEY_IMPORTANCE, KEY_PEOPLE, KEY_SNOOZE_CRITERIA, + KEY_TEXT_REPLIES, KEY_USER_SENTIMENT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Keys {} + /** * Data type: ArrayList of {@code String}, where each is a representation of a * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}. diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index 780b576d71f3..a1932b8861b0 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -25,6 +25,7 @@ import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.app.Notification; import android.app.NotificationChannel; +import android.app.NotificationManager; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; @@ -141,7 +142,6 @@ public abstract class NotificationAssistantService extends NotificationListenerS return onNotificationEnqueued(sbn); } - /** * Implement this method to learn when notifications are removed, how they were interacted with * before removal, and why they were removed. @@ -216,6 +216,15 @@ public abstract class NotificationAssistantService extends NotificationListenerS } /** + * Implement this to know when a user has changed which features of + * their notifications the assistant can modify. + * <p> Query {@link NotificationManager#getAllowedAssistantCapabilities()} to see what + * {@link Adjustment adjustments} you are currently allowed to make.</p> + */ + public void onCapabilitiesChanged() { + } + + /** * Updates a notification. N.B. this won’t cause * an existing notification to alert, but might allow a future update to * this notification to alert. diff --git a/core/java/android/util/XmlPullAttributes.java b/core/java/android/util/XmlPullAttributes.java index cb35eb5c12a3..32fe16fcb2b1 100644 --- a/core/java/android/util/XmlPullAttributes.java +++ b/core/java/android/util/XmlPullAttributes.java @@ -18,6 +18,7 @@ package android.util; import org.xmlpull.v1.XmlPullParser; +import android.annotation.UnsupportedAppUsage; import android.util.AttributeSet; import com.android.internal.util.XmlUtils; @@ -26,6 +27,7 @@ import com.android.internal.util.XmlUtils; * Provides an implementation of AttributeSet on top of an XmlPullParser. */ class XmlPullAttributes implements AttributeSet { + @UnsupportedAppUsage public XmlPullAttributes(XmlPullParser parser) { mParser = parser; } @@ -147,5 +149,6 @@ class XmlPullAttributes implements AttributeSet { return getAttributeResourceValue(null, "style", 0); } + @UnsupportedAppUsage /*package*/ XmlPullParser mParser; } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index cd075bf65e4a..6ae5167b57a1 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -88,10 +88,10 @@ public final class SurfaceControl implements Parcelable { private static native void nativeDestroy(long nativeObject); private static native void nativeDisconnect(long nativeObject); - private static native GraphicBuffer nativeScreenshot(IBinder displayToken, + private static native ScreenshotGraphicBuffer nativeScreenshot(IBinder displayToken, Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation, boolean captureSecureLayers); - private static native GraphicBuffer nativeCaptureLayers(IBinder layerHandleToken, + private static native ScreenshotGraphicBuffer nativeCaptureLayers(IBinder layerHandleToken, Rect sourceCrop, float frameScale); private static native long nativeCreateTransaction(); @@ -431,6 +431,46 @@ public final class SurfaceControl implements Parcelable { public static final int METADATA_TASK_ID = 3; /** + * A wrapper around GraphicBuffer that contains extra information about how to + * interpret the screenshot GraphicBuffer. + * @hide + */ + public static class ScreenshotGraphicBuffer { + private final GraphicBuffer mGraphicBuffer; + private final ColorSpace mColorSpace; + + public ScreenshotGraphicBuffer(GraphicBuffer graphicBuffer, ColorSpace colorSpace) { + mGraphicBuffer = graphicBuffer; + mColorSpace = colorSpace; + } + + /** + * Create ScreenshotGraphicBuffer from existing native GraphicBuffer object. + * @param width The width in pixels of the buffer + * @param height The height in pixels of the buffer + * @param format The format of each pixel as specified in {@link PixelFormat} + * @param usage Hint indicating how the buffer will be used + * @param unwrappedNativeObject The native object of GraphicBuffer + * @param namedColorSpace Integer value of a named color space {@link ColorSpace.Named} + */ + private static ScreenshotGraphicBuffer createFromNative(int width, int height, int format, + int usage, long unwrappedNativeObject, int namedColorSpace) { + GraphicBuffer graphicBuffer = GraphicBuffer.createFromExisting(width, height, format, + usage, unwrappedNativeObject); + ColorSpace colorSpace = ColorSpace.get(ColorSpace.Named.values()[namedColorSpace]); + return new ScreenshotGraphicBuffer(graphicBuffer, colorSpace); + } + + public ColorSpace getColorSpace() { + return mColorSpace; + } + + public GraphicBuffer getGraphicBuffer() { + return mGraphicBuffer; + } + } + + /** * Builder class for {@link SurfaceControl} objects. */ public static class Builder { @@ -1815,10 +1855,10 @@ public final class SurfaceControl implements Parcelable { throw new IllegalArgumentException("consumer must not be null"); } - final GraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width, height, - useIdentityTransform, rotation); + final ScreenshotGraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width, + height, useIdentityTransform, rotation); try { - consumer.attachAndQueueBuffer(buffer); + consumer.attachAndQueueBuffer(buffer.getGraphicBuffer()); } catch (RuntimeException e) { Log.w(TAG, "Failed to take screenshot - " + e.getMessage()); } @@ -1861,17 +1901,16 @@ public final class SurfaceControl implements Parcelable { } SurfaceControl.rotateCropForSF(sourceCrop, rotation); - final GraphicBuffer buffer = screenshotToBuffer(displayToken, sourceCrop, width, height, - useIdentityTransform, rotation); + final ScreenshotGraphicBuffer buffer = screenshotToBuffer(displayToken, sourceCrop, width, + height, useIdentityTransform, rotation); if (buffer == null) { Log.w(TAG, "Failed to take screenshot"); return null; } - // TODO(b/116112787) Now that hardware bitmap creation can take color space, we - // should continue to fix screenshot. - return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(buffer), - ColorSpace.get(ColorSpace.Named.SRGB)); + return Bitmap.wrapHardwareBuffer( + HardwareBuffer.createFromGraphicBuffer(buffer.getGraphicBuffer()), + buffer.getColorSpace()); } /** @@ -1897,8 +1936,8 @@ public final class SurfaceControl implements Parcelable { * @return Returns a GraphicBuffer that contains the captured content. * @hide */ - public static GraphicBuffer screenshotToBuffer(IBinder display, Rect sourceCrop, int width, - int height, boolean useIdentityTransform, int rotation) { + public static ScreenshotGraphicBuffer screenshotToBuffer(IBinder display, Rect sourceCrop, + int width, int height, boolean useIdentityTransform, int rotation) { if (display == null) { throw new IllegalArgumentException("displayToken must not be null"); } @@ -1917,7 +1956,7 @@ public final class SurfaceControl implements Parcelable { * * @hide */ - public static GraphicBuffer screenshotToBufferWithSecureLayersUnsafe(IBinder display, + public static ScreenshotGraphicBuffer screenshotToBufferWithSecureLayersUnsafe(IBinder display, Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation) { if (display == null) { @@ -1951,7 +1990,7 @@ public final class SurfaceControl implements Parcelable { * @return Returns a GraphicBuffer that contains the layer capture. * @hide */ - public static GraphicBuffer captureLayers(IBinder layerHandleToken, Rect sourceCrop, + public static ScreenshotGraphicBuffer captureLayers(IBinder layerHandleToken, Rect sourceCrop, float frameScale) { return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale); } diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl index c1a3ab770989..f96f0acd6082 100644 --- a/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl +++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl @@ -33,6 +33,7 @@ oneway interface IAccessibilityInteractionConnectionCallback { * @param infos The result {@link AccessibilityNodeInfo}. * @param interactionId The interaction id to match the result with the request. */ + @UnsupportedAppUsage void setFindAccessibilityNodeInfoResult(in AccessibilityNodeInfo info, int interactionId); /** @@ -41,6 +42,7 @@ oneway interface IAccessibilityInteractionConnectionCallback { * @param infos The result {@link AccessibilityNodeInfo}s. * @param interactionId The interaction id to match the result with the request. */ + @UnsupportedAppUsage void setFindAccessibilityNodeInfosResult(in List<AccessibilityNodeInfo> infos, int interactionId); @@ -50,5 +52,6 @@ oneway interface IAccessibilityInteractionConnectionCallback { * @param Whether the action was performed. * @param interactionId The interaction id to match the result with the request. */ + @UnsupportedAppUsage void setPerformAccessibilityActionResult(boolean succeeded, int interactionId); } diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 486b35d9cc0f..0d5c7c941a56 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -42,6 +42,7 @@ interface IAccessibilityManager { List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId); + @UnsupportedAppUsage List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType, int userId); int addAccessibilityInteractionConnection(IWindow windowToken, diff --git a/core/java/android/view/inspector/InspectableNodeName.java b/core/java/android/view/inspector/InspectableNodeName.java deleted file mode 100644 index 7b9a507ee45d..000000000000 --- a/core/java/android/view/inspector/InspectableNodeName.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.view.inspector; - -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.annotation.TestApi; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Marks the node name to display to a developer in the inspection tree. - * - * This annotation is optional to marking a class as inspectable. If it is omitted, the node name - * will be inferred using the semantics of {@link Class#getSimpleName()}. The fully qualified class - * name is always available in the tree, this is for display purposes only. If a class is inflated - * from XML and the tag it inflates from does not match its simple name, this annotation should be - * used to inform the inspector to display the XML tag name in the inspection tree view. - * - * This annotation does not inherit. If a class extends an annotated parent class, but does not - * annotate itself, its node name will be inferred from its Java name. - * - * @see InspectionCompanion#getNodeName() - * @hide - */ -@Target({TYPE}) -@Retention(SOURCE) -@TestApi -public @interface InspectableNodeName { - /** - * The display name for nodes of this type. - * - * @return The name for nodes of this type - */ - String value(); -} diff --git a/core/java/android/view/inspector/InspectionCompanion.java b/core/java/android/view/inspector/InspectionCompanion.java index 62d769b6d963..a633a58065a0 100644 --- a/core/java/android/view/inspector/InspectionCompanion.java +++ b/core/java/android/view/inspector/InspectionCompanion.java @@ -17,7 +17,6 @@ package android.view.inspector; import android.annotation.NonNull; -import android.annotation.Nullable; /** * An interface for companion objects used to inspect views. @@ -33,11 +32,6 @@ import android.annotation.Nullable; * parent class via the parent's inspection companion, and the child companion will only read * properties added or changed since the parent was defined. * - * Only one child traversal is considered for each class. If a descendant class defines a - * different child traversal than its parent, only the bottom traversal is used. If a class does - * not define its own child traversal, but one of its ancestors does, the bottom-most ancestor's - * traversal will be used. - * * @param <T> The type of inspectable this is the companion to */ public interface InspectionCompanion<T> { @@ -68,22 +62,6 @@ public interface InspectionCompanion<T> { void readProperties(@NonNull T inspectable, @NonNull PropertyReader propertyReader); /** - * Get an optional name to display to developers for inspection nodes of this companion's type. - * - * The default implementation returns null, which will cause the runtime to use the class's - * simple name as defined by {@link Class#getSimpleName()} as the node name. - * - * If the type of this companion is inflated from XML, this method should be overridden to - * return the string used as the tag name for this type in XML. - * - * @return A string to use as the node name, or null to use the simple class name fallback. - */ - @Nullable - default String getNodeName() { - return null; - } - - /** * Thrown by {@link #readProperties(Object, PropertyReader)} if called before * {@link #mapProperties(PropertyMapper)}. */ diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 8f5f0a376c35..cb44f79465ef 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -177,8 +177,7 @@ public final class TextClassifierImpl implements TextClassifier { final String localesString = concatenateLocales(request.getDefaultLocales()); final String detectLanguageTags = detectLanguageTagsFromText(request.getText()); final ZonedDateTime refTime = ZonedDateTime.now(); - final AnnotatorModel annotatorImpl = - getAnnotatorImpl(request.getDefaultLocales()); + final AnnotatorModel annotatorImpl = getAnnotatorImpl(request.getDefaultLocales()); final int start; final int end; if (mSettings.isModelDarkLaunchEnabled() && !request.isDarkLaunchAllowed()) { @@ -417,7 +416,8 @@ public final class TextClassifierImpl implements TextClassifier { nativeConversation, null, mContext, - getResourceLocalesString()); + getResourceLocalesString(), + getAnnotatorImpl(LocaleList.getDefault())); return createConversationActionResult(request, nativeSuggestions); } catch (Throwable t) { // Avoid throwing from this method. Log the error. @@ -583,8 +583,7 @@ public final class TextClassifierImpl implements TextClassifier { new File(bestModel.getPath()), ParcelFileDescriptor.MODE_READ_ONLY); try { if (pfd != null) { - mActionsImpl = new ActionsSuggestionsModel( - pfd.getFd(), getAnnotatorImpl(LocaleList.getDefault())); + mActionsImpl = new ActionsSuggestionsModel(pfd.getFd()); mActionModelInUse = bestModel; } } finally { diff --git a/core/java/com/android/internal/backup/IBackupTransport.aidl b/core/java/com/android/internal/backup/IBackupTransport.aidl index f8117a7e9260..c9baf004d798 100644 --- a/core/java/com/android/internal/backup/IBackupTransport.aidl +++ b/core/java/com/android/internal/backup/IBackupTransport.aidl @@ -79,14 +79,14 @@ interface IBackupTransport { Intent dataManagementIntent(); /** - * On demand, supply a short string that can be shown to the user as the label - * on an overflow menu item used to invoked the data management UI. + * On demand, supply a short {@link CharSequence} that can be shown to the user as the label on + * an overflow menu item used to invoke the data management UI. * - * @return A string to be used as the label for the transport's data management + * @return A {@link CharSequence} to be used as the label for the transport's data management * affordance. If the transport supplies a data management intent, this * method must not return {@code null}. */ - String dataManagementLabel(); + CharSequence dataManagementIntentLabel(); /** * Ask the transport where, on local device storage, to keep backup state blobs. diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index ead98e7eee3c..e85508ed7891 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -368,6 +368,11 @@ public class BatteryStatsHelper { public void refreshStats(int statsType, SparseArray<UserHandle> asUsers, long rawRealtimeUs, long rawUptimeUs) { + if (statsType != BatteryStats.STATS_SINCE_CHARGED) { + Log.w(TAG, "refreshStats called for statsType " + statsType + " but only " + + "STATS_SINCE_CHARGED is supported. Using STATS_SINCE_CHARGED instead."); + } + // Initialize mStats if necessary. getStats(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8679dcba2f80..1fc76351254b 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -145,7 +145,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - static final int VERSION = 185 + (USE_OLD_HISTORY ? 1000 : 0); + static final int VERSION = 186 + (USE_OLD_HISTORY ? 1000 : 0); // The maximum number of names wakelocks we will keep track of // per uid; once the limit is reached, we batch the remaining wakelocks @@ -991,8 +991,6 @@ public class BatteryStatsImpl extends BatteryStats { private int mPhoneSimStateRaw = -1; private int mNumConnectivityChange; - private int mLoadedNumConnectivityChange; - private int mUnpluggedNumConnectivityChange; private int mEstimatedBatteryCapacity = -1; @@ -1225,27 +1223,11 @@ public class BatteryStatsImpl extends BatteryStats { } public long computeUptime(long curTime, int which) { - switch (which) { - case STATS_SINCE_CHARGED: - return mUptime + getUptime(curTime); - case STATS_CURRENT: - return getUptime(curTime); - case STATS_SINCE_UNPLUGGED: - return getUptime(curTime) - mUnpluggedUptime; - } - return 0; + return mUptime + getUptime(curTime); } public long computeRealtime(long curTime, int which) { - switch (which) { - case STATS_SINCE_CHARGED: - return mRealtime + getRealtime(curTime); - case STATS_CURRENT: - return getRealtime(curTime); - case STATS_SINCE_UNPLUGGED: - return getRealtime(curTime) - mUnpluggedRealtime; - } - return 0; + return mRealtime + getRealtime(curTime); } public long getUptime(long curTime) { @@ -1352,16 +1334,10 @@ public class BatteryStatsImpl extends BatteryStats { @UnsupportedAppUsage final AtomicInteger mCount = new AtomicInteger(); final TimeBase mTimeBase; - int mLoadedCount; - int mUnpluggedCount; - int mPluggedCount; public Counter(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; - mPluggedCount = in.readInt(); - mCount.set(mPluggedCount); - mLoadedCount = in.readInt(); - mUnpluggedCount = in.readInt(); + mCount.set(in.readInt()); timeBase.add(this); } @@ -1372,18 +1348,14 @@ public class BatteryStatsImpl extends BatteryStats { public void writeToParcel(Parcel out) { out.writeInt(mCount.get()); - out.writeInt(mLoadedCount); - out.writeInt(mUnpluggedCount); } @Override public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { - mUnpluggedCount = mPluggedCount; } @Override public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { - mPluggedCount = mCount.get(); } /** @@ -1417,21 +1389,11 @@ public class BatteryStatsImpl extends BatteryStats { @Override public int getCountLocked(int which) { - int val = mCount.get(); - if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedCount; - } else if (which != STATS_SINCE_CHARGED) { - val -= mLoadedCount; - } - - return val; + return mCount.get(); } public void logState(Printer pw, String prefix) { - pw.println(prefix + "mCount=" + mCount.get() - + " mLoadedCount=" + mLoadedCount - + " mUnpluggedCount=" + mUnpluggedCount - + " mPluggedCount=" + mPluggedCount); + pw.println(prefix + "mCount=" + mCount.get()); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) @@ -1453,7 +1415,6 @@ public class BatteryStatsImpl extends BatteryStats { @Override public boolean reset(boolean detachIfReset) { mCount.set(0); - mLoadedCount = mPluggedCount = mUnpluggedCount = 0; if (detachIfReset) { detach(); } @@ -1467,15 +1428,12 @@ public class BatteryStatsImpl extends BatteryStats { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void writeSummaryFromParcelLocked(Parcel out) { - int count = mCount.get(); - out.writeInt(count); + out.writeInt(mCount.get()); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void readSummaryFromParcelLocked(Parcel in) { - mLoadedCount = in.readInt(); - mCount.set(mLoadedCount); - mUnpluggedCount = mPluggedCount = mLoadedCount; + mCount.set(in.readInt()); } } @@ -1483,14 +1441,10 @@ public class BatteryStatsImpl extends BatteryStats { public static class LongSamplingCounterArray extends LongCounterArray implements TimeBaseObs { final TimeBase mTimeBase; public long[] mCounts; - public long[] mLoadedCounts; - public long[] mUnpluggedCounts; private LongSamplingCounterArray(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; mCounts = in.createLongArray(); - mLoadedCounts = in.createLongArray(); - mUnpluggedCounts = in.createLongArray(); timeBase.add(this); } @@ -1501,13 +1455,10 @@ public class BatteryStatsImpl extends BatteryStats { private void writeToParcel(Parcel out) { out.writeLongArray(mCounts); - out.writeLongArray(mLoadedCounts); - out.writeLongArray(mUnpluggedCounts); } @Override public void onTimeStarted(long elapsedRealTime, long baseUptime, long baseRealtime) { - mUnpluggedCounts = copyArray(mCounts, mUnpluggedCounts); } @Override @@ -1516,20 +1467,12 @@ public class BatteryStatsImpl extends BatteryStats { @Override public long[] getCountsLocked(int which) { - long[] val = copyArray(mCounts, null); - if (which == STATS_SINCE_UNPLUGGED) { - subtract(val, mUnpluggedCounts); - } else if (which != STATS_SINCE_CHARGED) { - subtract(val, mLoadedCounts); - } - return val; + return mCounts == null ? null : Arrays.copyOf(mCounts, mCounts.length); } @Override public void logState(Printer pw, String prefix) { - pw.println(prefix + "mCounts=" + Arrays.toString(mCounts) - + " mLoadedCounts=" + Arrays.toString(mLoadedCounts) - + " mUnpluggedCounts=" + Arrays.toString(mUnpluggedCounts)); + pw.println(prefix + "mCounts=" + Arrays.toString(mCounts)); } public void addCountLocked(long[] counts) { @@ -1559,9 +1502,9 @@ public class BatteryStatsImpl extends BatteryStats { */ @Override public boolean reset(boolean detachIfReset) { - fillArray(mCounts, 0); - fillArray(mLoadedCounts, 0); - fillArray(mUnpluggedCounts, 0); + if (mCounts != null) { + Arrays.fill(mCounts, 0); + } if (detachIfReset) { detach(); } @@ -1579,8 +1522,6 @@ public class BatteryStatsImpl extends BatteryStats { private void readSummaryFromParcelLocked(Parcel in) { mCounts = in.createLongArray(); - mLoadedCounts = copyArray(mCounts, mLoadedCounts); - mUnpluggedCounts = copyArray(mCounts, mUnpluggedCounts); } public static void writeToParcel(Parcel out, LongSamplingCounterArray counterArray) { @@ -1621,49 +1562,16 @@ public class BatteryStatsImpl extends BatteryStats { return null; } } - - private static void fillArray(long[] a, long val) { - if (a != null) { - Arrays.fill(a, val); - } - } - - private static void subtract(@NonNull long[] val, long[] toSubtract) { - if (toSubtract == null) { - return; - } - for (int i = 0; i < val.length; i++) { - val[i] -= toSubtract[i]; - } - } - - private static long[] copyArray(long[] src, long[] dest) { - if (src == null) { - return null; - } else { - if (dest == null) { - dest = new long[src.length]; - } - System.arraycopy(src, 0, dest, 0, src.length); - return dest; - } - } } @VisibleForTesting public static class LongSamplingCounter extends LongCounter implements TimeBaseObs { final TimeBase mTimeBase; - public long mCount; - public long mCurrentCount; - public long mLoadedCount; - public long mUnpluggedCount; + private long mCount; public LongSamplingCounter(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; mCount = in.readLong(); - mCurrentCount = in.readLong(); - mLoadedCount = in.readLong(); - mUnpluggedCount = in.readLong(); timeBase.add(this); } @@ -1674,14 +1582,10 @@ public class BatteryStatsImpl extends BatteryStats { public void writeToParcel(Parcel out) { out.writeLong(mCount); - out.writeLong(mCurrentCount); - out.writeLong(mLoadedCount); - out.writeLong(mUnpluggedCount); } @Override public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { - mUnpluggedCount = mCount; } @Override @@ -1689,43 +1593,22 @@ public class BatteryStatsImpl extends BatteryStats { } public long getCountLocked(int which) { - long val = mCount; - if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedCount; - } else if (which != STATS_SINCE_CHARGED) { - val -= mLoadedCount; - } - return val; + return mCount; } @Override public void logState(Printer pw, String prefix) { - pw.println(prefix + "mCount=" + mCount - + " mCurrentCount=" + mCurrentCount - + " mLoadedCount=" + mLoadedCount - + " mUnpluggedCount=" + mUnpluggedCount); + pw.println(prefix + "mCount=" + mCount); } public void addCountLocked(long count) { - update(mCurrentCount + count, mTimeBase.isRunning()); + addCountLocked(count, mTimeBase.isRunning()); } public void addCountLocked(long count, boolean isRunning) { - update(mCurrentCount + count, isRunning); - } - - public void update(long count) { - update(count, mTimeBase.isRunning()); - } - - public void update(long count, boolean isRunning) { - if (count < mCurrentCount) { - mCurrentCount = 0; - } if (isRunning) { - mCount += count - mCurrentCount; + mCount += count; } - mCurrentCount = count; } /** @@ -1734,7 +1617,6 @@ public class BatteryStatsImpl extends BatteryStats { @Override public boolean reset(boolean detachIfReset) { mCount = 0; - mLoadedCount = mUnpluggedCount = 0; if (detachIfReset) { detach(); } @@ -1751,7 +1633,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void readSummaryFromParcelLocked(Parcel in) { - mCount = mUnpluggedCount= mLoadedCount = in.readLong(); + mCount = in.readLong(); } } @@ -1764,9 +1646,6 @@ public class BatteryStatsImpl extends BatteryStats { protected final TimeBase mTimeBase; protected int mCount; - protected int mLoadedCount; - protected int mLastCount; - protected int mUnpluggedCount; // Times are in microseconds for better accuracy when dividing by the // lock count, and are in "battery realtime" units. @@ -1779,25 +1658,6 @@ public class BatteryStatsImpl extends BatteryStats { protected long mTotalTime; /** - * The total time we loaded for the previous runs. Subtract this from - * mTotalTime to find the time for the current run of the system. - */ - protected long mLoadedTime; - - /** - * The run time of the last run of the system, as loaded from the - * saved data. - */ - protected long mLastTime; - - /** - * The value of mTotalTime when unplug() was last called. Subtract - * this from mTotalTime to find the time since the last unplug from - * power. - */ - protected long mUnpluggedTime; - - /** * The total time this timer has been running until the latest mark has been set. * Subtract this from mTotalTime to get the time spent running since the mark was set. */ @@ -1815,13 +1675,7 @@ public class BatteryStatsImpl extends BatteryStats { mTimeBase = timeBase; mCount = in.readInt(); - mLoadedCount = in.readInt(); - mLastCount = 0; - mUnpluggedCount = in.readInt(); mTotalTime = in.readLong(); - mLoadedTime = in.readLong(); - mLastTime = 0; - mUnpluggedTime = in.readLong(); mTimeBeforeMark = in.readLong(); timeBase.add(this); if (DEBUG) Log.i(TAG, "**** READ TIMER #" + mType + ": mTotalTime=" + mTotalTime); @@ -1834,6 +1688,16 @@ public class BatteryStatsImpl extends BatteryStats { timeBase.add(this); } + public void writeToParcel(Parcel out, long elapsedRealtimeUs) { + if (DEBUG) { + Log.i(TAG, "**** WRITING TIMER #" + mType + ": mTotalTime=" + + computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs))); + } + out.writeInt(computeCurrentCountLocked()); + out.writeLong(computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs))); + out.writeLong(mTimeBeforeMark); + } + protected abstract long computeRunTimeLocked(long curBatteryRealtime); protected abstract int computeCurrentCountLocked(); @@ -1844,8 +1708,8 @@ public class BatteryStatsImpl extends BatteryStats { */ @Override public boolean reset(boolean detachIfReset) { - mTotalTime = mLoadedTime = mLastTime = mTimeBeforeMark = 0; - mCount = mLoadedCount = mLastCount = 0; + mTotalTime = mTimeBeforeMark = 0; + mCount = 0; if (detachIfReset) { detach(); } @@ -1857,32 +1721,8 @@ public class BatteryStatsImpl extends BatteryStats { mTimeBase.remove(this); } - public void writeToParcel(Parcel out, long elapsedRealtimeUs) { - if (DEBUG) Log.i(TAG, "**** WRITING TIMER #" + mType + ": mTotalTime=" - + computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs))); - out.writeInt(computeCurrentCountLocked()); - out.writeInt(mLoadedCount); - out.writeInt(mUnpluggedCount); - out.writeLong(computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs))); - out.writeLong(mLoadedTime); - out.writeLong(mUnpluggedTime); - out.writeLong(mTimeBeforeMark); - } - @Override public void onTimeStarted(long elapsedRealtime, long timeBaseUptime, long baseRealtime) { - if (DEBUG && mType < 0) { - Log.v(TAG, "unplug #" + mType + ": realtime=" + baseRealtime - + " old mUnpluggedTime=" + mUnpluggedTime - + " old mUnpluggedCount=" + mUnpluggedCount); - } - mUnpluggedTime = computeRunTimeLocked(baseRealtime); - mUnpluggedCount = computeCurrentCountLocked(); - if (DEBUG && mType < 0) { - Log.v(TAG, "unplug #" + mType - + ": new mUnpluggedTime=" + mUnpluggedTime - + " new mUnpluggedCount=" + mUnpluggedCount); - } } @Override @@ -1894,8 +1734,7 @@ public class BatteryStatsImpl extends BatteryStats { mTotalTime = computeRunTimeLocked(baseRealtime); mCount = computeCurrentCountLocked(); if (DEBUG && mType < 0) { - Log.v(TAG, "plug #" + mType - + ": new mTotalTime=" + mTotalTime); + Log.v(TAG, "plug #" + mType + ": new mTotalTime=" + mTotalTime); } } @@ -1912,34 +1751,19 @@ public class BatteryStatsImpl extends BatteryStats { return; } out.writeInt(1); // indicates non-null - timer.writeToParcel(out, elapsedRealtimeUs); } @Override @UnsupportedAppUsage public long getTotalTimeLocked(long elapsedRealtimeUs, int which) { - long val = computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs)); - if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedTime; - } else if (which != STATS_SINCE_CHARGED) { - val -= mLoadedTime; - } - - return val; + return computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs)); } @Override @UnsupportedAppUsage public int getCountLocked(int which) { - int val = computeCurrentCountLocked(); - if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedCount; - } else if (which != STATS_SINCE_CHARGED) { - val -= mLoadedCount; - } - - return val; + return computeCurrentCountLocked(); } @Override @@ -1950,13 +1774,8 @@ public class BatteryStatsImpl extends BatteryStats { @Override public void logState(Printer pw, String prefix) { - pw.println(prefix + "mCount=" + mCount - + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount - + " mUnpluggedCount=" + mUnpluggedCount); - pw.println(prefix + "mTotalTime=" + mTotalTime - + " mLoadedTime=" + mLoadedTime); - pw.println(prefix + "mLastTime=" + mLastTime - + " mUnpluggedTime=" + mUnpluggedTime); + pw.println(prefix + "mCount=" + mCount); + pw.println(prefix + "mTotalTime=" + mTotalTime); } @@ -1968,13 +1787,8 @@ public class BatteryStatsImpl extends BatteryStats { public void readSummaryFromParcelLocked(Parcel in) { // Multiply by 1000 for backwards compatibility - mTotalTime = mLoadedTime = in.readLong(); - mLastTime = 0; - mUnpluggedTime = mTotalTime; - mCount = mLoadedCount = in.readInt(); - mLastCount = 0; - mUnpluggedCount = mCount; - + mTotalTime = in.readLong(); + mCount = in.readInt(); // When reading the summary, we set the mark to be the latest information. mTimeBeforeMark = mTotalTime; } @@ -2233,7 +2047,7 @@ public class BatteryStatsImpl extends BatteryStats { private long computeOverage(long curTime) { if (mLastAddedTime > 0) { - return mLastTime + mLastAddedDuration - curTime; + return mLastAddedDuration - curTime; } return 0; } @@ -2452,7 +2266,7 @@ public class BatteryStatsImpl extends BatteryStats { mTotalDurationMs = 0; mCurrentDurationMs = 0; if (mNesting > 0) { - mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime() * 1000) / 1000; } else { mStartTimeMs = -1; } @@ -2491,7 +2305,7 @@ public class BatteryStatsImpl extends BatteryStats { public long getCurrentDurationMsLocked(long elapsedRealtimeMs) { long durationMs = mCurrentDurationMs; if (mNesting > 0 && mTimeBase.isRunning()) { - durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000) + durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs * 1000) / 1000) - mStartTimeMs; } return durationMs; @@ -6401,13 +6215,7 @@ public class BatteryStatsImpl extends BatteryStats { } @Override public int getNumConnectivityChange(int which) { - int val = mNumConnectivityChange; - if (which == STATS_CURRENT) { - val -= mLoadedNumConnectivityChange; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedNumConnectivityChange; - } - return val; + return mNumConnectivityChange; } @Override public long getGpsSignalQualityTime(int strengthBin, @@ -9122,66 +8930,6 @@ public class BatteryStatsImpl extends BatteryStats { */ int mNumAnrs; - /** - * The amount of user time loaded from a previous save. - */ - long mLoadedUserTime; - - /** - * The amount of system time loaded from a previous save. - */ - long mLoadedSystemTime; - - /** - * The amount of foreground time loaded from a previous save. - */ - long mLoadedForegroundTime; - - /** - * The number of times the process has started from a previous save. - */ - int mLoadedStarts; - - /** - * Number of times the process has crashed from a previous save. - */ - int mLoadedNumCrashes; - - /** - * Number of times the process has had an ANR from a previous save. - */ - int mLoadedNumAnrs; - - /** - * The amount of user time when last unplugged. - */ - long mUnpluggedUserTime; - - /** - * The amount of system time when last unplugged. - */ - long mUnpluggedSystemTime; - - /** - * The amount of foreground time since unplugged. - */ - long mUnpluggedForegroundTime; - - /** - * The number of times the process has started before unplugged. - */ - int mUnpluggedStarts; - - /** - * Number of times the process has crashed before unplugged. - */ - int mUnpluggedNumCrashes; - - /** - * Number of times the process has had an ANR before unplugged. - */ - int mUnpluggedNumAnrs; - ArrayList<ExcessivePower> mExcessivePower; public Proc(BatteryStatsImpl bsi, String name) { @@ -9191,12 +8939,6 @@ public class BatteryStatsImpl extends BatteryStats { } public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { - mUnpluggedUserTime = mUserTime; - mUnpluggedSystemTime = mSystemTime; - mUnpluggedForegroundTime = mForegroundTime; - mUnpluggedStarts = mStarts; - mUnpluggedNumCrashes = mNumCrashes; - mUnpluggedNumAnrs = mNumAnrs; } public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { @@ -9283,18 +9025,6 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(mStarts); out.writeInt(mNumCrashes); out.writeInt(mNumAnrs); - out.writeLong(mLoadedUserTime); - out.writeLong(mLoadedSystemTime); - out.writeLong(mLoadedForegroundTime); - out.writeInt(mLoadedStarts); - out.writeInt(mLoadedNumCrashes); - out.writeInt(mLoadedNumAnrs); - out.writeLong(mUnpluggedUserTime); - out.writeLong(mUnpluggedSystemTime); - out.writeLong(mUnpluggedForegroundTime); - out.writeInt(mUnpluggedStarts); - out.writeInt(mUnpluggedNumCrashes); - out.writeInt(mUnpluggedNumAnrs); writeExcessivePowerToParcelLocked(out); } @@ -9305,18 +9035,6 @@ public class BatteryStatsImpl extends BatteryStats { mStarts = in.readInt(); mNumCrashes = in.readInt(); mNumAnrs = in.readInt(); - mLoadedUserTime = in.readLong(); - mLoadedSystemTime = in.readLong(); - mLoadedForegroundTime = in.readLong(); - mLoadedStarts = in.readInt(); - mLoadedNumCrashes = in.readInt(); - mLoadedNumAnrs = in.readInt(); - mUnpluggedUserTime = in.readLong(); - mUnpluggedSystemTime = in.readLong(); - mUnpluggedForegroundTime = in.readLong(); - mUnpluggedStarts = in.readInt(); - mUnpluggedNumCrashes = in.readInt(); - mUnpluggedNumAnrs = in.readInt(); readExcessivePowerFromParcelLocked(in); } @@ -9358,71 +9076,35 @@ public class BatteryStatsImpl extends BatteryStats { @Override @UnsupportedAppUsage public long getUserTime(int which) { - long val = mUserTime; - if (which == STATS_CURRENT) { - val -= mLoadedUserTime; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedUserTime; - } - return val; + return mUserTime; } @Override @UnsupportedAppUsage public long getSystemTime(int which) { - long val = mSystemTime; - if (which == STATS_CURRENT) { - val -= mLoadedSystemTime; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedSystemTime; - } - return val; + return mSystemTime; } @Override @UnsupportedAppUsage public long getForegroundTime(int which) { - long val = mForegroundTime; - if (which == STATS_CURRENT) { - val -= mLoadedForegroundTime; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedForegroundTime; - } - return val; + return mForegroundTime; } @Override @UnsupportedAppUsage public int getStarts(int which) { - int val = mStarts; - if (which == STATS_CURRENT) { - val -= mLoadedStarts; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedStarts; - } - return val; + return mStarts; } @Override public int getNumCrashes(int which) { - int val = mNumCrashes; - if (which == STATS_CURRENT) { - val -= mLoadedNumCrashes; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedNumCrashes; - } - return val; + return mNumCrashes; } @Override public int getNumAnrs(int which) { - int val = mNumAnrs; - if (which == STATS_CURRENT) { - val -= mLoadedNumAnrs; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedNumAnrs; - } - return val; + return mNumAnrs; } } @@ -9588,54 +9270,6 @@ public class BatteryStatsImpl extends BatteryStats { protected int mLaunches; /** - * The amount of time spent started loaded from a previous save - * (ms in battery uptime). - */ - protected long mLoadedStartTime; - - /** - * The number of starts loaded from a previous save. - */ - protected int mLoadedStarts; - - /** - * The number of launches loaded from a previous save. - */ - protected int mLoadedLaunches; - - /** - * The amount of time spent started as of the last run (ms - * in battery uptime). - */ - protected long mLastStartTime; - - /** - * The number of starts as of the last run. - */ - protected int mLastStarts; - - /** - * The number of launches as of the last run. - */ - protected int mLastLaunches; - - /** - * The amount of time spent started when last unplugged (ms - * in battery uptime). - */ - protected long mUnpluggedStartTime; - - /** - * The number of starts when last unplugged. - */ - protected int mUnpluggedStarts; - - /** - * The number of launches when last unplugged. - */ - protected int mUnpluggedLaunches; - - /** * Construct a Serv. Also adds it to the on-battery time base as a listener. */ public Serv(BatteryStatsImpl bsi) { @@ -9645,9 +9279,6 @@ public class BatteryStatsImpl extends BatteryStats { public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { - mUnpluggedStartTime = getStartTimeToNowLocked(baseUptime); - mUnpluggedStarts = mStarts; - mUnpluggedLaunches = mLaunches; } public void onTimeStopped(long elapsedRealtime, long baseUptime, @@ -9679,15 +9310,6 @@ public class BatteryStatsImpl extends BatteryStats { mLaunchedSince = in.readLong(); mLaunched = in.readInt() != 0; mLaunches = in.readInt(); - mLoadedStartTime = in.readLong(); - mLoadedStarts = in.readInt(); - mLoadedLaunches = in.readInt(); - mLastStartTime = 0; - mLastStarts = 0; - mLastLaunches = 0; - mUnpluggedStartTime = in.readLong(); - mUnpluggedStarts = in.readInt(); - mUnpluggedLaunches = in.readInt(); } public void writeToParcelLocked(Parcel out) { @@ -9699,12 +9321,6 @@ public class BatteryStatsImpl extends BatteryStats { out.writeLong(mLaunchedSince); out.writeInt(mLaunched ? 1 : 0); out.writeInt(mLaunches); - out.writeLong(mLoadedStartTime); - out.writeInt(mLoadedStarts); - out.writeInt(mLoadedLaunches); - out.writeLong(mUnpluggedStartTime); - out.writeInt(mUnpluggedStarts); - out.writeInt(mUnpluggedLaunches); } public long getLaunchTimeToNowLocked(long batteryUptime) { @@ -9768,36 +9384,17 @@ public class BatteryStatsImpl extends BatteryStats { @Override public int getLaunches(int which) { - int val = mLaunches; - if (which == STATS_CURRENT) { - val -= mLoadedLaunches; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedLaunches; - } - return val; + return mLaunches; } @Override public long getStartTime(long now, int which) { - long val = getStartTimeToNowLocked(now); - if (which == STATS_CURRENT) { - val -= mLoadedStartTime; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedStartTime; - } - return val; + return getStartTimeToNowLocked(now); } @Override public int getStarts(int which) { - int val = mStarts; - if (which == STATS_CURRENT) { - val -= mLoadedStarts; - } else if (which == STATS_SINCE_UNPLUGGED) { - val -= mUnpluggedStarts; - } - - return val; + return mStarts; } } @@ -10932,7 +10529,7 @@ public class BatteryStatsImpl extends BatteryStats { } mBluetoothActivity.reset(false); mModemActivity.reset(false); - mNumConnectivityChange = mLoadedNumConnectivityChange = mUnpluggedNumConnectivityChange = 0; + mNumConnectivityChange = 0; for (int i=0; i<mUidStats.size(); i++) { if (mUidStats.valueAt(i).reset(uptimeMillis * 1000, elapsedRealtimeMillis * 1000)) { @@ -12668,7 +12265,7 @@ public class BatteryStatsImpl extends BatteryStats { startRecordingHistory(elapsedRealtime, uptime, true); } } else if (level < 96 && - status != BatteryManager.BATTERY_STATUS_UNKNOWN) { + status != BatteryManager.BATTERY_STATUS_UNKNOWN) { if (!mRecordingHistory) { mRecordingHistory = true; startRecordingHistory(elapsedRealtime, uptime, true); @@ -12817,8 +12414,8 @@ public class BatteryStatsImpl extends BatteryStats { } } if (!onBattery && - (status == BatteryManager.BATTERY_STATUS_FULL || - status == BatteryManager.BATTERY_STATUS_UNKNOWN)) { + (status == BatteryManager.BATTERY_STATUS_FULL || + status == BatteryManager.BATTERY_STATUS_UNKNOWN)) { // We don't record history while we are plugged in and fully charged // (or when battery is not present). The next time we are // unplugged, history will be cleared. @@ -12855,7 +12452,9 @@ public class BatteryStatsImpl extends BatteryStats { @UnsupportedAppUsage public long getAwakeTimeBattery() { - return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); + // This previously evaluated to mOnBatteryTimeBase.getUptime(getBatteryUptimeLocked()); + // for over a decade, but surely that was a mistake. + return getBatteryUptimeLocked(); } @UnsupportedAppUsage @@ -12865,22 +12464,12 @@ public class BatteryStatsImpl extends BatteryStats { @Override public long computeUptime(long curTime, int which) { - switch (which) { - case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart); - case STATS_CURRENT: return (curTime-mUptimeStart); - case STATS_SINCE_UNPLUGGED: return (curTime-mOnBatteryTimeBase.getUptimeStart()); - } - return 0; + return mUptime + (curTime - mUptimeStart); } @Override public long computeRealtime(long curTime, int which) { - switch (which) { - case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart); - case STATS_CURRENT: return (curTime-mRealtimeStart); - case STATS_SINCE_UNPLUGGED: return (curTime-mOnBatteryTimeBase.getRealtimeStart()); - } - return 0; + return mRealtime + (curTime - mRealtimeStart); } @Override @@ -14074,7 +13663,7 @@ public class BatteryStatsImpl extends BatteryStats { mHasBluetoothReporting = in.readInt() != 0; mHasModemReporting = in.readInt() != 0; - mNumConnectivityChange = mLoadedNumConnectivityChange = in.readInt(); + mNumConnectivityChange = in.readInt(); mFlashlightOnNesting = 0; mFlashlightOnTimer.readSummaryFromParcelLocked(in); mCameraOnNesting = 0; @@ -14383,12 +13972,12 @@ public class BatteryStatsImpl extends BatteryStats { for (int ip = 0; ip < NP; ip++) { String procName = in.readString(); Uid.Proc p = u.getProcessStatsLocked(procName); - p.mUserTime = p.mLoadedUserTime = in.readLong(); - p.mSystemTime = p.mLoadedSystemTime = in.readLong(); - p.mForegroundTime = p.mLoadedForegroundTime = in.readLong(); - p.mStarts = p.mLoadedStarts = in.readInt(); - p.mNumCrashes = p.mLoadedNumCrashes = in.readInt(); - p.mNumAnrs = p.mLoadedNumAnrs = in.readInt(); + p.mUserTime = in.readLong(); + p.mSystemTime = in.readLong(); + p.mForegroundTime = in.readLong(); + p.mStarts = in.readInt(); + p.mNumCrashes = in.readInt(); + p.mNumAnrs = in.readInt(); p.readExcessivePowerFromParcelLocked(in); } @@ -14405,7 +13994,7 @@ public class BatteryStatsImpl extends BatteryStats { throw new ParcelFormatException("File corrupt: too many wakeup alarms " + NWA); } p.mWakeupAlarms.clear(); - for (int iwa=0; iwa<NWA; iwa++) { + for (int iwa = 0; iwa < NWA; iwa++) { String tag = in.readString(); Counter c = new Counter(mOnBatteryScreenOffTimeBase); c.readSummaryFromParcelLocked(in); @@ -14418,9 +14007,9 @@ public class BatteryStatsImpl extends BatteryStats { for (int is = 0; is < NS; is++) { String servName = in.readString(); Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); - s.mStartTime = s.mLoadedStartTime = in.readLong(); - s.mStarts = s.mLoadedStarts = in.readInt(); - s.mLaunches = s.mLoadedLaunches = in.readInt(); + s.mStartTime = in.readLong(); + s.mStarts = in.readInt(); + s.mLaunches = in.readInt(); } } } @@ -15054,9 +14643,8 @@ public class BatteryStatsImpl extends BatteryStats { mHasModemReporting = in.readInt() != 0; mNumConnectivityChange = in.readInt(); - mLoadedNumConnectivityChange = in.readInt(); - mUnpluggedNumConnectivityChange = in.readInt(); mAudioOnNesting = 0; + // TODO: It's likely a mistake that mAudioOnTimer/mVideoOnTimer don't write/read to parcel! mAudioOnTimer = new StopwatchTimer(mClocks, null, -7, null, mOnBatteryTimeBase); mVideoOnNesting = 0; mVideoOnTimer = new StopwatchTimer(mClocks, null, -8, null, mOnBatteryTimeBase); @@ -15256,8 +14844,6 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(mHasModemReporting ? 1 : 0); out.writeInt(mNumConnectivityChange); - out.writeInt(mLoadedNumConnectivityChange); - out.writeInt(mUnpluggedNumConnectivityChange); mFlashlightOnTimer.writeToParcel(out, uSecRealtime); mCameraOnTimer.writeToParcel(out, uSecRealtime); mBluetoothScanTimer.writeToParcel(out, uSecRealtime); diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java index cd69d6892eb4..e31c9ded5a42 100644 --- a/core/java/com/android/internal/os/PowerCalculator.java +++ b/core/java/com/android/internal/os/PowerCalculator.java @@ -27,9 +27,10 @@ public abstract class PowerCalculator { * @param u The recorded stats for the app. * @param rawRealtimeUs The raw system realtime in microseconds. * @param rawUptimeUs The raw system uptime in microseconds. - * @param statsType The type of stats. Can be {@link BatteryStats#STATS_CURRENT}, - * {@link BatteryStats#STATS_SINCE_CHARGED}, or - * {@link BatteryStats#STATS_SINCE_UNPLUGGED}. + * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this can + * only be {@link BatteryStats#STATS_SINCE_CHARGED}, since + * {@link BatteryStats#STATS_CURRENT} and + * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated. */ public abstract void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, int statsType); @@ -40,9 +41,10 @@ public abstract class PowerCalculator { * @param stats The BatteryStats object from which to retrieve data. * @param rawRealtimeUs The raw system realtime in microseconds. * @param rawUptimeUs The raw system uptime in microseconds. - * @param statsType The type of stats. Can be {@link BatteryStats#STATS_CURRENT}, - * {@link BatteryStats#STATS_SINCE_CHARGED}, or - * {@link BatteryStats#STATS_SINCE_UNPLUGGED}. + * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this can + * only be {@link BatteryStats#STATS_SINCE_CHARGED}, since + * {@link BatteryStats#STATS_CURRENT} and + * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated. */ public void calculateRemaining(BatterySipper app, BatteryStats stats, long rawRealtimeUs, long rawUptimeUs, int statsType) { diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index da27852a3a35..20bed1b34940 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -1126,6 +1126,12 @@ void AndroidRuntime::start(const char* className, const Vector<String8>& options return; } + const char* tzdataRootDir = getenv("ANDROID_TZDATA_ROOT"); + if (tzdataRootDir == NULL) { + LOG_FATAL("No tz data directory specified with ANDROID_TZDATA_ROOT environment variable."); + return; + } + //const char* kernelHack = getenv("LD_ASSUME_KERNEL"); //ALOGD("Found LD_ASSUME_KERNEL='%s'\n", kernelHack); diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp index a698d66965e4..9f4e3e516ada 100644 --- a/core/jni/android_view_InputDevice.cpp +++ b/core/jni/android_view_InputDevice.cpp @@ -68,9 +68,8 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi deviceInfo.getKeyboardType(), kcmObj.get(), deviceInfo.hasVibrator(), hasMic, deviceInfo.hasButtonUnderPad())); - const Vector<InputDeviceInfo::MotionRange>& ranges = deviceInfo.getMotionRanges(); - for (size_t i = 0; i < ranges.size(); i++) { - const InputDeviceInfo::MotionRange& range = ranges.itemAt(i); + const std::vector<InputDeviceInfo::MotionRange>& ranges = deviceInfo.getMotionRanges(); + for (const InputDeviceInfo::MotionRange& range: ranges) { env->CallVoidMethod(inputDeviceObj.get(), gInputDeviceClassInfo.addMotionRange, range.axis, range.source, range.min, range.max, range.flat, range.fuzz, range.resolution); if (env->ExceptionCheck()) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 4a6c72bda283..94f96babaf90 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -126,6 +126,41 @@ static struct { jfieldID white; } gDisplayPrimariesClassInfo; +static struct { + jclass clazz; + jmethodID builder; +} gScreenshotGraphicBufferClassInfo; + +class JNamedColorSpace { +public: + // ColorSpace.Named.SRGB.ordinal() = 0; + static constexpr jint SRGB = 0; + + // ColorSpace.Named.DISPLAY_P3.ordinal() = 6; + static constexpr jint DISPLAY_P3 = 6; +}; + +constexpr jint fromDataspaceToNamedColorSpaceValue(const ui::Dataspace dataspace) { + switch (dataspace) { + case ui::Dataspace::DISPLAY_P3: + return JNamedColorSpace::DISPLAY_P3; + default: + return JNamedColorSpace::SRGB; + } +} + +constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) { + switch (colorMode) { + case ui::ColorMode::DISPLAY_P3: + case ui::ColorMode::BT2100_PQ: + case ui::ColorMode::BT2100_HLG: + case ui::ColorMode::DISPLAY_BT2020: + return ui::Dataspace::DISPLAY_P3; + default: + return ui::Dataspace::V0_SRGB; + } +} + // ---------------------------------------------------------------------------- static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) { @@ -210,9 +245,12 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, if (displayToken == NULL) { return NULL; } + const ui::ColorMode colorMode = SurfaceComposerClient::getActiveColorMode(displayToken); + const ui::Dataspace dataspace = pickDataspaceFromColorMode(colorMode); + Rect sourceCrop = rectFromObj(env, sourceCropObj); sp<GraphicBuffer> buffer; - status_t res = ScreenshotClient::capture(displayToken, ui::Dataspace::V0_SRGB, + status_t res = ScreenshotClient::capture(displayToken, dataspace, ui::PixelFormat::RGBA_8888, sourceCrop, width, height, useIdentityTransform, rotation, captureSecureLayers, &buffer); @@ -220,13 +258,15 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, return NULL; } - return env->CallStaticObjectMethod(gGraphicBufferClassInfo.clazz, - gGraphicBufferClassInfo.builder, + const jint namedColorSpace = fromDataspaceToNamedColorSpaceValue(dataspace); + return env->CallStaticObjectMethod(gScreenshotGraphicBufferClassInfo.clazz, + gScreenshotGraphicBufferClassInfo.builder, buffer->getWidth(), buffer->getHeight(), buffer->getPixelFormat(), (jint)buffer->getUsage(), - (jlong)buffer.get()); + (jlong)buffer.get(), + namedColorSpace); } static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandleToken, @@ -243,20 +283,23 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl } sp<GraphicBuffer> buffer; - status_t res = ScreenshotClient::captureChildLayers(layerHandle, ui::Dataspace::V0_SRGB, + const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB; + status_t res = ScreenshotClient::captureChildLayers(layerHandle, dataspace, ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, &buffer); if (res != NO_ERROR) { return NULL; } - return env->CallStaticObjectMethod(gGraphicBufferClassInfo.clazz, - gGraphicBufferClassInfo.builder, + const jint namedColorSpace = fromDataspaceToNamedColorSpaceValue(dataspace); + return env->CallStaticObjectMethod(gScreenshotGraphicBufferClassInfo.clazz, + gScreenshotGraphicBufferClassInfo.builder, buffer->getWidth(), buffer->getHeight(), buffer->getPixelFormat(), (jint)buffer->getUsage(), - (jlong)buffer.get()); + (jlong)buffer.get(), + namedColorSpace); } static void nativeApplyTransaction(JNIEnv* env, jclass clazz, jlong transactionObj, jboolean sync) { @@ -1306,9 +1349,13 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetOverrideScalingMode }, {"nativeGetHandle", "(J)Landroid/os/IBinder;", (void*)nativeGetHandle }, - {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZIZ)Landroid/graphics/GraphicBuffer;", + {"nativeScreenshot", + "(Landroid/os/IBinder;Landroid/graphics/Rect;IIZIZ)" + "Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;", (void*)nativeScreenshot }, - {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;", + {"nativeCaptureLayers", + "(Landroid/os/IBinder;Landroid/graphics/Rect;F)" + "Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;", (void*)nativeCaptureLayers }, {"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V", (void*)nativeSetInputWindowInfo }, @@ -1386,6 +1433,14 @@ int register_android_view_SurfaceControl(JNIEnv* env) gGraphicBufferClassInfo.builder = GetStaticMethodIDOrDie(env, graphicsBufferClazz, "createFromExisting", "(IIIIJ)Landroid/graphics/GraphicBuffer;"); + jclass screenshotGraphicsBufferClazz = FindClassOrDie(env, + "android/view/SurfaceControl$ScreenshotGraphicBuffer"); + gScreenshotGraphicBufferClassInfo.clazz = + MakeGlobalRefOrDie(env, screenshotGraphicsBufferClazz); + gScreenshotGraphicBufferClassInfo.builder = GetStaticMethodIDOrDie(env, + screenshotGraphicsBufferClazz, + "createFromNative", "(IIIIJI)Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;"); + jclass displayedContentSampleClazz = FindClassOrDie(env, "android/hardware/display/DisplayedContentSample"); gDisplayedContentSampleClassInfo.clazz = MakeGlobalRefOrDie(env, displayedContentSampleClazz); diff --git a/core/res/res/values/dimens_car.xml b/core/res/res/values/dimens_car.xml index d2cf40a6bc1f..7b3ac2e0e4b5 100644 --- a/core/res/res/values/dimens_car.xml +++ b/core/res/res/values/dimens_car.xml @@ -21,6 +21,7 @@ <dimen name="car_fullscreen_user_pod_height">356dp</dimen> <dimen name="car_fullscreen_user_pod_image_avatar_width">96dp</dimen> <dimen name="car_fullscreen_user_pod_image_avatar_height">96dp</dimen> + <dimen name="car_large_avatar_size">96dp</dimen> <!-- Application Bar --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 74970e810181..24fd3a8718bb 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5295,6 +5295,14 @@ <!-- Summary of notification letting users know why battery saver was turned on automatically [CHAR_LIMIT=NONE]--> <string name="dynamic_mode_notification_summary">Battery Saver activated to extend battery life</string> + <!-- Battery saver strings --> + <!-- The user visible name of the notification channel for battery saver notifications [CHAR_LIMIT=80] --> + <string name="battery_saver_notification_channel_name">Battery Saver</string> + <!-- Title of notification letting users know why battery saver didn't turn back on automatically after the device was unplugged [CHAR_LIMIT=NONE] --> + <string name="battery_saver_sticky_disabled_notification_title">Battery Saver won\u2019t reactivate until battery low again</string> + <!-- Summary of notification letting users know why battery saver didn't turn back on automatically after the device was unplugged [CHAR_LIMIT=NONE] --> + <string name="battery_saver_sticky_disabled_notification_summary">Battery has been charged to a sufficient level. Battery Saver won\u2019t reactivate until the battery is low again.</string> + <!-- Description of media type: folder or directory that contains additional files. [CHAR LIMIT=32] --> <string name="mime_type_folder">Folder</string> <!-- Description of media type: application file, such as APK. [CHAR LIMIT=32] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 17ccc31179f9..764c9c46826f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3588,6 +3588,7 @@ <java-symbol type="dimen" name="car_fullscreen_user_pod_icon_text_size" /> <java-symbol type="dimen" name="car_fullscreen_user_pod_image_avatar_height" /> <java-symbol type="dimen" name="car_fullscreen_user_pod_image_avatar_width" /> + <java-symbol type="dimen" name="car_large_avatar_size" /> <java-symbol type="layout" name="car_user_switching_dialog" /> <java-symbol type="id" name="user_loading_avatar" /> <java-symbol type="id" name="user_loading" /> @@ -3643,6 +3644,9 @@ <!-- For Secondary Launcher --> <java-symbol type="string" name="config_secondaryHomeComponent" /> + <java-symbol type="string" name="battery_saver_notification_channel_name" /> + <java-symbol type="string" name="battery_saver_sticky_disabled_notification_title" /> + <java-symbol type="string" name="battery_saver_sticky_disabled_notification_summary" /> <java-symbol type="string" name="dynamic_mode_notification_channel_name" /> <java-symbol type="string" name="dynamic_mode_notification_title" /> <java-symbol type="string" name="dynamic_mode_notification_summary" /> diff --git a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java index 5c7287f000b7..67423c8402a3 100644 --- a/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/ActionsSuggestionsHelperTest.java @@ -215,6 +215,7 @@ public class ActionsSuggestionsHelperTest { ConversationAction.TYPE_OPEN_URL, 1.0f, null, + null, null ); @@ -235,6 +236,7 @@ public class ActionsSuggestionsHelperTest { ConversationAction.TYPE_OPEN_URL, 1.0f, null, + null, new RemoteActionTemplate[0] ); @@ -255,6 +257,7 @@ public class ActionsSuggestionsHelperTest { ConversationAction.TYPE_OPEN_URL, 1.0f, null, + null, new RemoteActionTemplate[]{ new RemoteActionTemplate( "title", diff --git a/core/tests/coretests/src/android/view/textclassifier/intent/LegacyIntentClassificationFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/intent/LegacyIntentClassificationFactoryTest.java index 19e5b0a250bb..72d1ab1c9d0c 100644 --- a/core/tests/coretests/src/android/view/textclassifier/intent/LegacyIntentClassificationFactoryTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/intent/LegacyIntentClassificationFactoryTest.java @@ -63,6 +63,7 @@ public class LegacyIntentClassificationFactoryTest { null, null, null, + null, null); List<LabeledIntent> intents = mLegacyIntentClassificationFactory.create( @@ -96,6 +97,7 @@ public class LegacyIntentClassificationFactoryTest { null, null, null, + null, null); List<LabeledIntent> intents = mLegacyIntentClassificationFactory.create( diff --git a/core/tests/coretests/src/android/view/textclassifier/intent/TemplateClassificationIntentFactoryTest.java b/core/tests/coretests/src/android/view/textclassifier/intent/TemplateClassificationIntentFactoryTest.java index eaef0a0c42b1..ccf8607b84d9 100644 --- a/core/tests/coretests/src/android/view/textclassifier/intent/TemplateClassificationIntentFactoryTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/intent/TemplateClassificationIntentFactoryTest.java @@ -81,6 +81,7 @@ public class TemplateClassificationIntentFactoryTest { null, null, null, + null, createRemoteActionTemplates()); List<LabeledIntent> intents = @@ -119,6 +120,7 @@ public class TemplateClassificationIntentFactoryTest { null, null, null, + null, createRemoteActionTemplates()); List<LabeledIntent> intents = @@ -153,6 +155,7 @@ public class TemplateClassificationIntentFactoryTest { null, null, null, + null, null); mTemplateClassificationIntentFactory.create( @@ -185,6 +188,7 @@ public class TemplateClassificationIntentFactoryTest { null, null, null, + null, new RemoteActionTemplate[0]); mTemplateClassificationIntentFactory.create( diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java index 37f818a70ec9..ade3a991b576 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java @@ -44,8 +44,6 @@ public class BatteryStatsCounterTest extends TestCase { counter.stepAtomic(); counter.stepAtomic(); assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(0, counter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase on (i.e. unplugged) timeBase.setRunning(true, 2, 2); @@ -54,8 +52,6 @@ public class BatteryStatsCounterTest extends TestCase { counter.stepAtomic(); counter.stepAtomic(); assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase off (i.e. plugged in) timeBase.setRunning(false, 3, 3); @@ -63,16 +59,12 @@ public class BatteryStatsCounterTest extends TestCase { counter.stepAtomic(); counter.stepAtomic(); assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase on (i.e. unplugged) timeBase.setRunning(true, 4, 4); counter.stepAtomic(); counter.stepAtomic(); assertEquals(6, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(6, counter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(2, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); } @@ -88,8 +80,6 @@ public class BatteryStatsCounterTest extends TestCase { timeBase.setRunning(true, 1, 1); origCounter.stepAtomic(); origCounter.stepAtomic(); origCounter.stepAtomic(); // three times assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // Test summary parcelling (from origCounter) final Parcel summaryParcel = Parcel.obtain(); @@ -102,22 +92,16 @@ public class BatteryStatsCounterTest extends TestCase { // timeBase still on (i.e. unplugged) summaryCounter.stepAtomic(); // once assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase off (i.e. plugged in) timeBase.setRunning(false, 3, 3); summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase on (i.e. unplugged) timeBase.setRunning(true, 4, 4); summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice assertEquals(6, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(3, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(2, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // Test full parcelling (from summaryCounter) @@ -130,21 +114,15 @@ public class BatteryStatsCounterTest extends TestCase { // timeBase still on (i.e. unplugged) fullParcelCounter.stepAtomic(); // once assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase off (i.e. plugged in) timeBase.setRunning(false, 5, 5); fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); // timeBase on (i.e. unplugged) timeBase.setRunning(true, 6, 6); fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice assertEquals(9, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - assertEquals(6, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT)); - assertEquals(2, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java index a42286f6882f..78fa3fb734d6 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java @@ -100,8 +100,70 @@ public class BatteryStatsDurationTimerTest extends TestCase { assertEquals(30802, timer.getTotalDurationMsLocked(220302)); } + /** + * Tests that reset(boolean detachIfReset) clears the correct times if detachIfReset is false. + */ @SmallTest public void testReset() throws Exception { + final MockClocks clocks = new MockClocks(); + + final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase(); + timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime()); + + final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase); + + timeBase.setRunning(true, /* uptimeUs */ 0, /* realtimeUs */ 100_000); + timer.startRunningLocked(700); + timer.stopRunningLocked(3_100); + assertFalse(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(6_300)); + assertEquals(2_400, timer.getMaxDurationMsLocked(6_301)); + assertEquals(2_400, timer.getTotalDurationMsLocked(6_302)); + + timer.reset(false); + assertEquals(0, timer.getCurrentDurationMsLocked(12_000)); + assertEquals(0, timer.getMaxDurationMsLocked(12_001)); + assertEquals(0, timer.getTotalDurationMsLocked(12_002)); + + assertEquals(true, timeBase.hasObserver(timer)); + + timer.startRunningLocked(24_100); + clocks.uptime = clocks.realtime = 24_200; + timer.reset(false); + assertEquals(34_300, timer.getCurrentDurationMsLocked(58_500)); + assertEquals(34_301, timer.getMaxDurationMsLocked(58_501)); + assertEquals(34_302, timer.getTotalDurationMsLocked(58_502)); + } + + /** + * Tests that reset(boolean detachIfReset) clears the correct times if detachIfReset is true. + */ + @SmallTest + public void testResetAndDetach() throws Exception { + final MockClocks clocks = new MockClocks(); + + final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase(); + timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime()); + + final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase); + + timeBase.setRunning(true, /* uptimeUs */ 0, /* realtimeUs */ 100_000); + timer.startRunningLocked(700); + timer.stopRunningLocked(3_100); + assertFalse(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(6_300)); + assertEquals(2_400, timer.getMaxDurationMsLocked(6_301)); + assertEquals(2_400, timer.getTotalDurationMsLocked(6_302)); + + timer.reset(true); + clocks.uptime = clocks.realtime = 7_000; + assertEquals(0, timer.getCurrentDurationMsLocked(8_000)); + assertEquals(0, timer.getMaxDurationMsLocked(8_001)); + assertEquals(0, timer.getTotalDurationMsLocked(8_002)); + + assertEquals(false, timeBase.hasObserver(timer)); } @SmallTest diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java index 077182921118..4b37dd226e69 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsImplTest.java @@ -325,7 +325,7 @@ public class BatteryStatsImplTest { // Get the total acquisition time long totalTime = u.getWifiMulticastTime(currentTimeMs*1000, - BatteryStats.STATS_SINCE_UNPLUGGED); + BatteryStats.STATS_SINCE_CHARGED); assertEquals("Miscalculations of Multicast wakelock acquisition time", (releaseTimeMs - acquireTimeMs) * 1000, totalTime); } @@ -347,7 +347,7 @@ public class BatteryStatsImplTest { // Get the total acquisition time long totalTime = u.getWifiMulticastTime(currentTimeMs*1000, - BatteryStats.STATS_SINCE_UNPLUGGED); + BatteryStats.STATS_SINCE_CHARGED); assertEquals("Miscalculations of Multicast wakelock acquisition time", (currentTimeMs - acquireTimeMs) * 1000, totalTime); } @@ -377,7 +377,7 @@ public class BatteryStatsImplTest { // Get the total acquisition time long totalTime = u.getWifiMulticastTime(currentTimeMs*1000, - BatteryStats.STATS_SINCE_UNPLUGGED); + BatteryStats.STATS_SINCE_CHARGED); assertEquals("Miscalculations of Multicast wakelock acquisition time", (releaseTimeMs_2 - acquireTimeMs_1) * 1000, totalTime); } @@ -407,7 +407,7 @@ public class BatteryStatsImplTest { // Get the total acquisition time long totalTime = u.getWifiMulticastTime(currentTimeMs*1000, - BatteryStats.STATS_SINCE_UNPLUGGED); + BatteryStats.STATS_SINCE_CHARGED); assertEquals("Miscalculations of Multicast wakelock acquisition time", ((releaseTimeMs_1 - acquireTimeMs_1) + (releaseTimeMs_2 - acquireTimeMs_2)) * 1000, totalTime); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java index 3e33273feddb..8f5dfc5589fe 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java @@ -16,7 +16,6 @@ package com.android.internal.os; -import static android.os.BatteryStats.STATS_CURRENT; import static android.os.BatteryStats.STATS_SINCE_CHARGED; import static android.os.BatteryStats.WAKE_TYPE_PARTIAL; @@ -388,7 +387,7 @@ public class BatteryStatsNoteTest extends TestCase { bi.noteWakupAlarmLocked("com.foo.bar", UID, null, "tag"); Uid.Pkg pkg = bi.getPackageStatsLocked(UID, "com.foo.bar"); - assertEquals(1, pkg.getWakeupAlarmStats().get("tag").getCountLocked(STATS_CURRENT)); + assertEquals(1, pkg.getWakeupAlarmStats().get("tag").getCountLocked(STATS_SINCE_CHARGED)); assertEquals(1, pkg.getWakeupAlarmStats().size()); } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java index b9995c443f35..df549c5b51c8 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsServTest.java @@ -44,15 +44,6 @@ public class BatteryStatsServTest extends TestCase { mLaunchedSince = 6064; mLaunched = true; mLaunches = 8085; - mLoadedStartTime = 9096; - mLoadedStarts = 10017; - mLoadedLaunches = 11118; - mLastStartTime = 12219; - mLastStarts = 13310; - mLastLaunches = 14411; - mUnpluggedStartTime = 15512; - mUnpluggedStarts = 16613; - mUnpluggedLaunches = 17714; } long getStartTime() { @@ -94,42 +85,6 @@ public class BatteryStatsServTest extends TestCase { int getLaunches() { return mLaunches; } - - long getLoadedStartTime() { - return mLoadedStartTime; - } - - int getLoadedStarts() { - return mLoadedStarts; - } - - int getLoadedLaunches() { - return mLoadedLaunches; - } - - long getLastStartTime() { - return mLastStartTime; - } - - int getLastStarts() { - return mLastStarts; - } - - int getLastLaunches() { - return mLastLaunches; - } - - long getUnpluggedStartTime() { - return mUnpluggedStartTime; - } - - int getUnpluggedStarts() { - return mUnpluggedStarts; - } - - int getUnpluggedLaunches() { - return mUnpluggedLaunches; - } } /** @@ -147,29 +102,6 @@ public class BatteryStatsServTest extends TestCase { } /** - * Test OnTimeStarted - */ - @SmallTest - public void testOnTimeStarted() throws Exception { - MockBatteryStatsImpl bsi = new MockBatteryStatsImpl(); - TestServ serv = new TestServ(bsi); - - serv.populate(); - serv.setRunning(true); - serv.onTimeStarted(111111, 20000, 222222); - Assert.assertEquals(18989, serv.getUnpluggedStartTime()); - Assert.assertEquals(4042, serv.getUnpluggedStarts()); - Assert.assertEquals(8085, serv.getUnpluggedLaunches()); - - serv.populate(); - serv.setRunning(false); - serv.onTimeStarted(111111, 20000, 222222); - Assert.assertEquals(1010, serv.getUnpluggedStartTime()); - Assert.assertEquals(4042, serv.getUnpluggedStarts()); - Assert.assertEquals(8085, serv.getUnpluggedLaunches()); - } - - /** * Test parceling and unparceling. */ @SmallTest @@ -185,7 +117,7 @@ public class BatteryStatsServTest extends TestCase { TestServ serv = new TestServ(bsi); serv.readFromParcelLocked(parcel); - + Assert.assertEquals(1010, serv.getStartTime()); Assert.assertEquals(2021, serv.getRunningSince()); Assert.assertTrue(serv.getRunning()); @@ -194,15 +126,8 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(0, serv.getLastStartTime()); - Assert.assertEquals(0, serv.getLastStarts()); - Assert.assertEquals(0, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); + + parcel.recycle(); } /** @@ -267,15 +192,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -303,15 +219,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(777777L, serv.getLaunchedSince()); // <-- changed Assert.assertTrue(serv.getLaunched()); // <-- changed Assert.assertEquals(8086, serv.getLaunches()); // <-- changed - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -341,15 +248,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertFalse(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -375,19 +273,10 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(2021, serv.getRunningSince()); Assert.assertTrue(serv.getRunning()); Assert.assertEquals(4042, serv.getStarts()); - Assert.assertEquals(777777L-6064+5053, serv.getLaunchedTime()); // <-- changed + Assert.assertEquals(777777L-6064+5053, serv.getLaunchedTime()); // <-- changed Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertFalse(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -416,16 +305,7 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(5053, serv.getLaunchedTime()); Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertFalse(serv.getLaunched()); - Assert.assertEquals(8085-1, serv.getLaunches()); // <-- changed - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); + Assert.assertEquals(8085-1, serv.getLaunches()); // <-- changed } /** @@ -455,15 +335,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -492,15 +363,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -530,15 +392,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -568,15 +421,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -600,8 +444,6 @@ public class BatteryStatsServTest extends TestCase { serv.populate(); Assert.assertEquals(8085, serv.getLaunches(BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(8085-11118, serv.getLaunches(BatteryStats.STATS_CURRENT)); - Assert.assertEquals(8085-17714, serv.getLaunches(BatteryStats.STATS_SINCE_UNPLUGGED)); // No change to fields Assert.assertEquals(1010, serv.getStartTime()); @@ -612,15 +454,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -637,10 +470,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(startTimeToNow, serv.getStartTime(20000, BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(startTimeToNow-9096, - serv.getStartTime(20000, BatteryStats.STATS_CURRENT)); - Assert.assertEquals(startTimeToNow-15512, - serv.getStartTime(20000, BatteryStats.STATS_SINCE_UNPLUGGED)); // No change to fields Assert.assertEquals(1010, serv.getStartTime()); @@ -651,15 +480,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } /** @@ -676,10 +496,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(startTimeToNow, serv.getStartTime(20000, BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(startTimeToNow-9096, - serv.getStartTime(20000, BatteryStats.STATS_CURRENT)); - Assert.assertEquals(startTimeToNow-15512, - serv.getStartTime(20000, BatteryStats.STATS_SINCE_UNPLUGGED)); // No change to fields Assert.assertEquals(1010, serv.getStartTime()); @@ -690,15 +506,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } @@ -712,8 +519,6 @@ public class BatteryStatsServTest extends TestCase { serv.populate(); Assert.assertEquals(4042, serv.getStarts(BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(4042-10017, serv.getStarts(BatteryStats.STATS_CURRENT)); - Assert.assertEquals(4042-16613, serv.getStarts(BatteryStats.STATS_SINCE_UNPLUGGED)); // No change to fields Assert.assertEquals(1010, serv.getStartTime()); @@ -724,15 +529,6 @@ public class BatteryStatsServTest extends TestCase { Assert.assertEquals(6064, serv.getLaunchedSince()); Assert.assertTrue(serv.getLaunched()); Assert.assertEquals(8085, serv.getLaunches()); - Assert.assertEquals(9096, serv.getLoadedStartTime()); - Assert.assertEquals(10017, serv.getLoadedStarts()); - Assert.assertEquals(11118, serv.getLoadedLaunches()); - Assert.assertEquals(12219, serv.getLastStartTime()); - Assert.assertEquals(13310, serv.getLastStarts()); - Assert.assertEquals(14411, serv.getLastLaunches()); - Assert.assertEquals(15512, serv.getUnpluggedStartTime()); - Assert.assertEquals(16613, serv.getUnpluggedStarts()); - Assert.assertEquals(17714, serv.getUnpluggedLaunches()); } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java index bce8b40cc31d..e5441c018875 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimeBaseTest.java @@ -282,12 +282,6 @@ public class BatteryStatsTimeBaseTest extends TestCase { Assert.assertEquals(100+300+666-400, tb.computeUptime(666, BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(300+666-400, - tb.computeUptime(666, BatteryStats.STATS_CURRENT)); - Assert.assertEquals(300+666-400-50, - tb.computeUptime(666, BatteryStats.STATS_SINCE_UNPLUGGED)); - - Assert.assertEquals(0, tb.computeUptime(666, 6000)); } /** @@ -301,12 +295,6 @@ public class BatteryStatsTimeBaseTest extends TestCase { Assert.assertEquals(200+500+6666-600, tb.computeRealtime(6666, BatteryStats.STATS_SINCE_CHARGED)); - Assert.assertEquals(500+6666-600, - tb.computeRealtime(6666, BatteryStats.STATS_CURRENT)); - Assert.assertEquals(500+6666-600-60, - tb.computeRealtime(6666, BatteryStats.STATS_SINCE_UNPLUGGED)); - - Assert.assertEquals(0, tb.computeUptime(666, 6000)); } /** diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java index 87dc2f3dd43b..40e3a5f55ca5 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTimerTest.java @@ -66,30 +66,6 @@ public class BatteryStatsTimerTest extends TestCase { mCount = val; } - public int getLoadedCount() { - return mLoadedCount; - } - - public void setLoadedCount(int val) { - mLoadedCount = val; - } - - public int getLastCount() { - return mLastCount; - } - - public void setLastCount(int val) { - mLastCount = val; - } - - public int getUnpluggedCount() { - return mUnpluggedCount; - } - - public void setUnpluggedCount(int val) { - mUnpluggedCount = val; - } - public long getTotalTime() { return mTotalTime; } @@ -98,30 +74,6 @@ public class BatteryStatsTimerTest extends TestCase { mTotalTime = val; } - public long getLoadedTime() { - return mLoadedTime; - } - - public void setLoadedTime(long val) { - mLoadedTime = val; - } - - public long getLastTime() { - return mLastTime; - } - - public void setLastTime(long val) { - mLastTime = val; - } - - public long getUnpluggedTime() { - return mUnpluggedTime; - } - - public void setUnpluggedTime(long val) { - mUnpluggedTime = val; - } - public long getTimeBeforeMark() { return mTimeBeforeMark; } @@ -143,16 +95,12 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.nextComputeCurrentCount = 3000; - // Test that starting the timer counts the unplugged time and counters + // Test that stopping the timer updates mTotalTime and mCount timer.nextComputeRunTime = 4; timer.onTimeStarted(10, 20, 50); - Assert.assertEquals(50, timer.lastComputeRunTimeRealtime); - Assert.assertEquals(4, timer.getUnpluggedTime()); - Assert.assertEquals(3000, timer.getUnpluggedCount()); - - // Test that stopping the timer updates mTotalTime and mCount timer.nextComputeRunTime = 17; timer.onTimeStopped(100, 130, 170); + Assert.assertEquals(170, timer.lastComputeRunTimeRealtime); Assert.assertEquals(17, timer.getTotalTime()); Assert.assertEquals(3000, timer.getCount()); } @@ -168,13 +116,7 @@ public class BatteryStatsTimerTest extends TestCase { // Test write then read TestTimer timer1 = new TestTimer(clocks, 0, timeBase); timer1.setCount(1); - timer1.setLoadedCount(3); - timer1.setLastCount(4); - timer1.setUnpluggedCount(5); timer1.setTotalTime(9223372036854775807L); - timer1.setLoadedTime(9223372036854775806L); - timer1.setLastTime(9223372036854775805L); - timer1.setUnpluggedTime(9223372036854775804L); timer1.setTimeBeforeMark(9223372036854775803L); timer1.nextComputeRunTime = 201; timer1.nextComputeCurrentCount = 2; @@ -187,13 +129,7 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer2 = new TestTimer(clocks, 0, timeBase, parcel); Assert.assertEquals(2, timer2.getCount()); // from computeTotalCountLocked() - Assert.assertEquals(3, timer2.getLoadedCount()); - Assert.assertEquals(0, timer2.getLastCount()); // NOT saved - Assert.assertEquals(5, timer2.getUnpluggedCount()); Assert.assertEquals(201, timer2.getTotalTime()); // from computeRunTimeLocked() - Assert.assertEquals(9223372036854775806L, timer2.getLoadedTime()); - Assert.assertEquals(0, timer2.getLastTime()); // NOT saved - Assert.assertEquals(9223372036854775804L, timer2.getUnpluggedTime()); Assert.assertEquals(9223372036854775803L, timer2.getTimeBeforeMark()); parcel.recycle(); @@ -224,25 +160,13 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(9223372036854775807L); - timer.setLoadedTime(9223372036854775806L); - timer.setLastTime(9223372036854775805L); - timer.setUnpluggedTime(9223372036854775804L); timer.setTimeBeforeMark(9223372036854775803L); timer.reset(false); Assert.assertEquals(0, timer.getCount()); - Assert.assertEquals(0, timer.getLoadedCount()); - Assert.assertEquals(0, timer.getLastCount()); - Assert.assertEquals(4, timer.getUnpluggedCount()); Assert.assertEquals(0, timer.getTotalTime()); - Assert.assertEquals(0, timer.getLoadedTime()); - Assert.assertEquals(0, timer.getLastTime()); - Assert.assertEquals(9223372036854775804L, timer.getUnpluggedTime()); Assert.assertEquals(0, timer.getTimeBeforeMark()); // reset(false) shouldn't remove it from the list @@ -259,25 +183,13 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(9223372036854775807L); - timer.setLoadedTime(9223372036854775806L); - timer.setLastTime(9223372036854775805L); - timer.setUnpluggedTime(9223372036854775804L); timer.setTimeBeforeMark(9223372036854775803L); timer.reset(true); Assert.assertEquals(0, timer.getCount()); - Assert.assertEquals(0, timer.getLoadedCount()); - Assert.assertEquals(0, timer.getLastCount()); - Assert.assertEquals(4, timer.getUnpluggedCount()); Assert.assertEquals(0, timer.getTotalTime()); - Assert.assertEquals(0, timer.getLoadedTime()); - Assert.assertEquals(0, timer.getLastTime()); - Assert.assertEquals(9223372036854775804L, timer.getUnpluggedTime()); Assert.assertEquals(0, timer.getTimeBeforeMark()); // reset(true) should remove it from the list @@ -299,13 +211,7 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer1 = new TestTimer(clocks, 0, timeBase); timer1.setCount(1); - timer1.setLoadedCount(2); - timer1.setLastCount(3); - timer1.setUnpluggedCount(4); timer1.setTotalTime(9223372036854775807L); - timer1.setLoadedTime(9223372036854775806L); - timer1.setLastTime(9223372036854775805L); - timer1.setUnpluggedTime(9223372036854775804L); timer1.setTimeBeforeMark(9223372036854775803L); Parcel parcel = Parcel.obtain(); @@ -318,13 +224,7 @@ public class BatteryStatsTimerTest extends TestCase { // Make sure that all the values get touched timer2.setCount(666); - timer2.setLoadedCount(666); - timer2.setLastCount(666); - timer2.setUnpluggedCount(666); timer2.setTotalTime(666); - timer2.setLoadedTime(666); - timer2.setLastTime(666); - timer2.setUnpluggedTime(666); timer2.setTimeBeforeMark(666); parcel.setDataPosition(0); @@ -333,13 +233,7 @@ public class BatteryStatsTimerTest extends TestCase { timer2.readSummaryFromParcelLocked(parcel); Assert.assertEquals(1, timer2.getCount()); - Assert.assertEquals(1, timer2.getLoadedCount()); - Assert.assertEquals(0, timer2.getLastCount()); - Assert.assertEquals(1, timer2.getUnpluggedCount()); Assert.assertEquals(9223372036854775800L, timer2.getTotalTime()); - Assert.assertEquals(9223372036854775800L, timer2.getLoadedTime()); - Assert.assertEquals(0, timer2.getLastTime()); - Assert.assertEquals(9223372036854775800L, timer2.getUnpluggedTime()); Assert.assertEquals(9223372036854775800L, timer2.getTimeBeforeMark()); parcel.recycle(); @@ -359,32 +253,15 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(100); - timer.setLoadedTime(200); - timer.setLastTime(300); - timer.setUnpluggedTime(400); timer.setTimeBeforeMark(500); timer.nextComputeRunTime = 10000; - // Timer.getTotalTimeLocked(STATS_SINCE_CHARGED) timer.lastComputeRunTimeRealtime = -1; Assert.assertEquals(10000, timer.getTotalTimeLocked(66, BatteryStats.STATS_SINCE_CHARGED)); Assert.assertEquals(40, timer.lastComputeRunTimeRealtime); - - // Timer.getTotalTimeLocked(STATS_CURRENT) - timer.lastComputeRunTimeRealtime = -1; - Assert.assertEquals(9800, timer.getTotalTimeLocked(66, BatteryStats.STATS_CURRENT)); - Assert.assertEquals(40, timer.lastComputeRunTimeRealtime); - - // Timer.getTotalTimeLocked(STATS_SINCE_UNPLUGGED) - timer.lastComputeRunTimeRealtime = -1; - Assert.assertEquals(9600, timer.getTotalTimeLocked(66, BatteryStats.STATS_SINCE_UNPLUGGED)); - Assert.assertEquals(40, timer.lastComputeRunTimeRealtime); } /** @@ -401,26 +278,11 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(100); - timer.setLoadedTime(200); - timer.setLastTime(300); - timer.setUnpluggedTime(400); timer.setTimeBeforeMark(500); - // Timer.getCountLocked(STATS_SINCE_CHARGED) timer.nextComputeCurrentCount = 10000; Assert.assertEquals(10000, timer.getCountLocked(BatteryStats.STATS_SINCE_CHARGED)); - - // Timer.getCountLocked(STATS_CURRENT) - timer.nextComputeCurrentCount = 10000; - Assert.assertEquals(9998, timer.getCountLocked(BatteryStats.STATS_CURRENT)); - - // Timer.getCountLocked(STATS_SINCE_UNPLUGGED) - timer.nextComputeCurrentCount = 10000; - Assert.assertEquals(9996, timer.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED)); } /** @@ -437,13 +299,7 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(100); - timer.setLoadedTime(200); - timer.setLastTime(300); - timer.setUnpluggedTime(400); timer.setTimeBeforeMark(500); timer.nextComputeRunTime = 10000; @@ -460,30 +316,16 @@ public class BatteryStatsTimerTest extends TestCase { TestTimer timer = new TestTimer(clocks, 0, timeBase); timer.setTotalTime(100); - timer.setLoadedTime(200); - timer.setLastTime(300); - timer.setUnpluggedTime(400); timer.setTimeBeforeMark(500); timer.setCount(1); - timer.setLoadedCount(2); - timer.setLastCount(3); - timer.setUnpluggedCount(4); timer.setTotalTime(9223372036854775807L); - timer.setLoadedTime(9223372036854775806L); - timer.setLastTime(9223372036854775805L); - timer.setUnpluggedTime(9223372036854775804L); timer.setTimeBeforeMark(9223372036854775803L); StringBuilder sb = new StringBuilder(); StringBuilderPrinter pw = new StringBuilderPrinter(sb); timer.logState(pw, " "); - - Assert.assertEquals( - " mCount=1 mLoadedCount=2 mLastCount=3 mUnpluggedCount=4\n" - + " mTotalTime=9223372036854775807 mLoadedTime=9223372036854775806\n" - + " mLastTime=9223372036854775805 mUnpluggedTime=9223372036854775804\n", - sb.toString()); + Assert.assertEquals(" mCount=1\n mTotalTime=9223372036854775807\n", sb.toString()); } } diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java index 0516bb7f74d7..ee5d2d62f5fd 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java @@ -16,14 +16,12 @@ package com.android.internal.os; -import static android.os.BatteryStats.STATS_CURRENT; import static android.os.BatteryStats.STATS_SINCE_CHARGED; -import static android.os.BatteryStats.STATS_SINCE_UNPLUGGED; import static com.android.internal.os.BatteryStatsImpl.LongSamplingCounterArray; import static com.android.internal.os.BatteryStatsImpl.TimeBase; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertArrayEquals; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; @@ -41,8 +39,6 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import java.util.Arrays; - /** * Test class for {@link BatteryStatsImpl.LongSamplingCounterArray}. * @@ -57,14 +53,15 @@ import java.util.Arrays; * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk * Run: adb shell am instrument -e class com.android.internal.os.LongSamplingCounterArrayTest -w \ * com.android.frameworks.coretests/androidx.test.runner.AndroidJUnitRunner + * + * or just do + * atest frameworks/base/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java */ @SmallTest @RunWith(AndroidJUnit4.class) public class LongSamplingCounterArrayTest { private static final long[] COUNTS = {1111, 2222, 3333, 4444}; - private static final long[] LOADED_COUNTS = {5555, 6666, 7777, 8888}; - private static final long[] UNPLUGGED_COUNTS = {44444, 55555, 66666, 77777}; private static final long[] ZEROES = {0, 0, 0, 0}; @Mock private TimeBase mTimeBase; @@ -80,75 +77,54 @@ public class LongSamplingCounterArrayTest { @Test public void testReadWriteParcel() { final Parcel parcel = Parcel.obtain(); - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); LongSamplingCounterArray.writeToParcel(parcel, mCounterArray); parcel.setDataPosition(0); // Now clear counterArray and verify values are read from parcel correctly. - updateCounts(null, null, null); + updateCounts(null); mCounterArray = LongSamplingCounterArray.readFromParcel(parcel, mTimeBase); - assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mCounts); parcel.recycle(); } @Test public void testReadWriteSummaryParcel() { final Parcel parcel = Parcel.obtain(); - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); LongSamplingCounterArray.writeSummaryToParcelLocked(parcel, mCounterArray); parcel.setDataPosition(0); // Now clear counterArray and verify values are read from parcel correctly. - updateCounts(null, null, null); + updateCounts(null); mCounterArray = LongSamplingCounterArray.readSummaryFromParcelLocked(parcel, mTimeBase); - assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(COUNTS, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mCounts); parcel.recycle(); } @Test public void testOnTimeStarted() { - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); mCounterArray.onTimeStarted(0, 0, 0); - assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mCounts); } @Test public void testOnTimeStopped() { - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); mCounterArray.onTimeStopped(0, 0, 0); - assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mCounts); } @Test public void testGetCountsLocked() { - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); when(mTimeBase.isRunning()).thenReturn(false); - assertArrayEquals(COUNTS, mCounterArray.getCountsLocked(STATS_SINCE_CHARGED), - "Unexpected values"); - assertArrayEquals(subtract(COUNTS, LOADED_COUNTS), - mCounterArray.getCountsLocked(STATS_CURRENT), "Unexpected values"); - assertArrayEquals(subtract(COUNTS, UNPLUGGED_COUNTS), - mCounterArray.getCountsLocked(STATS_SINCE_UNPLUGGED), "Unexpected values"); + assertArrayEquals(COUNTS, mCounterArray.getCountsLocked(STATS_SINCE_CHARGED)); when(mTimeBase.isRunning()).thenReturn(true); - assertArrayEquals(COUNTS, mCounterArray.getCountsLocked(STATS_SINCE_CHARGED), - "Unexpected values"); - assertArrayEquals(subtract(COUNTS, LOADED_COUNTS), - mCounterArray.getCountsLocked(STATS_CURRENT), "Unexpected values"); - assertArrayEquals(subtract(COUNTS, UNPLUGGED_COUNTS), - mCounterArray.getCountsLocked(STATS_SINCE_UNPLUGGED), "Unexpected values"); + assertArrayEquals(COUNTS, mCounterArray.getCountsLocked(STATS_SINCE_CHARGED)); } private long[] subtract(long[] val, long[] toSubtract) { @@ -163,64 +139,45 @@ public class LongSamplingCounterArrayTest { @Test public void testAddCountLocked() { - updateCounts(null, null, null); + updateCounts(null); final long[] deltas = {123, 234, 345, 456}; when(mTimeBase.isRunning()).thenReturn(true); mCounterArray.addCountLocked(deltas); - assertArrayEquals(deltas, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(null, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(deltas, mCounterArray.mCounts); - updateCounts(null, null, null); + updateCounts(null); mCounterArray.addCountLocked(deltas, false); - assertArrayEquals(null, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(null, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(null, mCounterArray.mCounts); mCounterArray.addCountLocked(deltas, true); - assertArrayEquals(deltas, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(null, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(deltas, mCounterArray.mCounts); - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); final long[] newCounts = new long[deltas.length]; for (int i = 0; i < deltas.length; ++i) { newCounts[i] = COUNTS[i] + deltas[i]; } mCounterArray.addCountLocked(deltas); - assertArrayEquals(newCounts, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(newCounts, mCounterArray.mCounts); - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); mCounterArray.addCountLocked(deltas, false); - assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mCounts); mCounterArray.addCountLocked(deltas, true); - assertArrayEquals(newCounts, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, - "Unexpected unpluggedCounts"); + assertArrayEquals(newCounts, mCounterArray.mCounts); } @Test public void testReset() { - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); // Test with detachIfReset=false mCounterArray.reset(false /* detachIfReset */); - assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mCounts); verifyZeroInteractions(mTimeBase); - initializeCounterArrayWithDefaultValues(); + updateCounts(COUNTS); // Test with detachIfReset=true mCounterArray.reset(true /* detachIfReset */); - assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts"); - assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); - assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mCounts); verify(mTimeBase).remove(mCounterArray); verifyNoMoreInteractions(mTimeBase); } @@ -232,18 +189,7 @@ public class LongSamplingCounterArrayTest { verifyNoMoreInteractions(mTimeBase); } - private void initializeCounterArrayWithDefaultValues() { - updateCounts(COUNTS, LOADED_COUNTS, UNPLUGGED_COUNTS); - } - - private void assertArrayEquals(long[] expected, long[] actual, String msg) { - assertTrue(msg + ", expected: " + Arrays.toString(expected) - + ", actual: " + Arrays.toString(actual), Arrays.equals(expected, actual)); - } - - private void updateCounts(long[] counts, long[] loadedCounts, long[] unpluggedCounts) { + private void updateCounts(long[] counts) { mCounterArray.mCounts = counts == null ? null : counts.clone(); - mCounterArray.mLoadedCounts = loadedCounts == null ? null : loadedCounts.clone(); - mCounterArray.mUnpluggedCounts = unpluggedCounts == null ? null : unpluggedCounts.clone(); } } diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java index d2f5735ce3c1..dccc3d3d76fa 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterTest.java @@ -51,7 +51,6 @@ import org.mockito.MockitoAnnotations; public class LongSamplingCounterTest { private static final long COUNT = 1111; - private static final long CURRENT_COUNT = 5555; @Mock private TimeBase mTimeBase; @@ -67,116 +66,87 @@ public class LongSamplingCounterTest { @Test public void testReadWriteParcel() { final Parcel parcel = Parcel.obtain(); - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); mCounter.writeToParcel(parcel); parcel.setDataPosition(0); - // Now clear counterArray and verify values are read from parcel correctly. - updateCounts(0, 0); + // Now change count but verify values are read from parcel correctly. + mCounter.addCountLocked(7 * COUNT, true); + assertEquals(8 * COUNT, getCount()); mCounter = new LongSamplingCounter(mTimeBase, parcel); - assertEquals(COUNT, mCounter.mCount); - assertEquals(CURRENT_COUNT, mCounter.mCurrentCount); + assertEquals(COUNT, getCount()); parcel.recycle(); } @Test public void testReadWriteSummaryParcel() { final Parcel parcel = Parcel.obtain(); - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); mCounter.writeSummaryFromParcelLocked(parcel); parcel.setDataPosition(0); - // Now clear counterArray and verify values are read from parcel correctly. - updateCounts(0, 0); + // Now change count but verify values are read from parcel correctly. + mCounter.addCountLocked(7 * COUNT, true); + assertEquals(8 * COUNT, getCount()); mCounter.readSummaryFromParcelLocked(parcel); - assertEquals(COUNT, mCounter.mCount); + assertEquals(COUNT, getCount()); parcel.recycle(); } @Test public void testOnTimeStarted() { - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); mCounter.onTimeStarted(0, 0, 0); - assertEquals(COUNT, mCounter.mCount); - assertEquals(COUNT, mCounter.mUnpluggedCount); + assertEquals(COUNT, getCount()); } @Test public void testOnTimeStopped() { - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); mCounter.onTimeStopped(0, 0, 0); - assertEquals(COUNT, mCounter.mCount); + assertEquals(COUNT, getCount()); } @Test public void testAddCountLocked() { - updateCounts(0, 0); - assertEquals(0, mCounter.getCountLocked(0)); + assertEquals(0, getCount()); when(mTimeBase.isRunning()).thenReturn(true); mCounter.addCountLocked(111); assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(111, mCounter.mCurrentCount); mCounter.addCountLocked(222); assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(333, mCounter.mCurrentCount); when(mTimeBase.isRunning()).thenReturn(false); mCounter.addCountLocked(456); assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(789, mCounter.mCurrentCount); mCounter.addCountLocked(444, true); assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(1233, mCounter.mCurrentCount); mCounter.addCountLocked(567, false); assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(1800, mCounter.mCurrentCount); } - @Test - public void testUpdate() { - updateCounts(0, 0); - assertEquals(0, mCounter.getCountLocked(0)); - when(mTimeBase.isRunning()).thenReturn(true); - mCounter.update(111); - assertEquals(111, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(111, mCounter.mCurrentCount); - mCounter.update(333); - assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(333, mCounter.mCurrentCount); - - when(mTimeBase.isRunning()).thenReturn(false); - mCounter.update(789); - assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(789, mCounter.mCurrentCount); - mCounter.update(100); - assertEquals(333, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(100, mCounter.mCurrentCount); - - mCounter.update(544, true); - assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(544, mCounter.mCurrentCount); - mCounter.update(1544, false); - assertEquals(777, mCounter.getCountLocked(STATS_SINCE_CHARGED)); - assertEquals(1544, mCounter.mCurrentCount); - } @Test public void testReset() { - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); // Test with detachIfReset=false mCounter.reset(false /* detachIfReset */); - assertEquals(0, mCounter.mCount); - assertEquals(CURRENT_COUNT, mCounter.mCurrentCount); + assertEquals(0, getCount()); verifyZeroInteractions(mTimeBase); - updateCounts(COUNT, CURRENT_COUNT); + mCounter.addCountLocked(COUNT, true); + assertEquals(COUNT, getCount()); // Test with detachIfReset=true mCounter.reset(true /* detachIfReset */); - assertEquals(0, mCounter.mCount); - assertEquals(CURRENT_COUNT, mCounter.mCurrentCount); + assertEquals(0, getCount()); verify(mTimeBase).remove(mCounter); verifyNoMoreInteractions(mTimeBase); } @@ -188,8 +158,7 @@ public class LongSamplingCounterTest { verifyNoMoreInteractions(mTimeBase); } - private void updateCounts(long total, long current) { - mCounter.mCount = total; - mCounter.mCurrentCount = current; + private long getCount() { + return mCounter.getCountLocked(STATS_SINCE_CHARGED); } } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index fcd5d566f250..94f69b8905d6 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -307,6 +307,7 @@ applications that come with the platform <permission name="android.permission.WRITE_SECURE_SETTINGS"/> <permission name="android.permission.STATUS_BAR_SERVICE"/> <permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/> + <permission name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS"/> </privapp-permissions> <privapp-permissions package="com.android.statementservice"> diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index a4582b7ece92..93dc6fa9bf93 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -29,6 +29,7 @@ import android.location.IGnssNavigationMessageListener; import android.location.ILocationListener; import android.location.Location; import android.location.LocationRequest; +import android.location.LocationTime; import android.os.Bundle; import com.android.internal.location.ProviderProperties; @@ -104,6 +105,7 @@ interface ILocationManager void setTestProviderLocation(String provider, in Location loc, String opPackageName); void setTestProviderEnabled(String provider, boolean enabled, String opPackageName); List<LocationRequest> getTestProviderCurrentRequests(String provider, String opPackageName); + LocationTime getGnssTimeMillis(); // --- deprecated --- void setTestProviderStatus(String provider, int status, in Bundle extras, long updateTime, diff --git a/location/java/android/location/LocationTime.aidl b/location/java/android/location/LocationTime.aidl new file mode 100644 index 000000000000..f6263637bb33 --- /dev/null +++ b/location/java/android/location/LocationTime.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2019, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.location; + +parcelable LocationTime; diff --git a/location/java/android/location/LocationTime.java b/location/java/android/location/LocationTime.java new file mode 100644 index 000000000000..e5535d192776 --- /dev/null +++ b/location/java/android/location/LocationTime.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.location; + +import android.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Data class for passing location derived time. + * @hide + */ +public final class LocationTime implements Parcelable { + + private final long mTime; + private final long mElapsedRealtimeNanos; + + public LocationTime(long time, long elapsedRealtimeNanos) { + mTime = time; + mElapsedRealtimeNanos = elapsedRealtimeNanos; + } + + /** + * The current time, according to the Gnss location provider. */ + public long getTime() { + return mTime; + } + + /** + * The elapsed nanos since boot {@link #getTime} was computed at. + */ + public long getElapsedRealtimeNanos() { + return mElapsedRealtimeNanos; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeLong(mTime); + out.writeLong(mElapsedRealtimeNanos); + } + + @Override + public int describeContents() { + return 0; + } + + public static final @NonNull Parcelable.Creator<LocationTime> CREATOR = + new Parcelable.Creator<LocationTime>() { + public LocationTime createFromParcel(Parcel in) { + long time = in.readLong(); + long elapsedRealtimeNanos = in.readLong(); + return new LocationTime(time, elapsedRealtimeNanos); + } + + public LocationTime[] newArray(int size) { + return new LocationTime[size]; + } + }; +} diff --git a/media/apex/java/android/media/CallbackDataSourceDesc.java b/media/apex/java/android/media/CallbackDataSourceDesc.java index 9209ca94897f..d9db62e99126 100644 --- a/media/apex/java/android/media/CallbackDataSourceDesc.java +++ b/media/apex/java/android/media/CallbackDataSourceDesc.java @@ -17,7 +17,7 @@ package android.media; import android.annotation.NonNull; -import android.annotation.Nullable; +import android.annotation.TestApi; /** * Structure of data source descriptor for sources using callback. @@ -26,12 +26,16 @@ import android.annotation.Nullable; * {@link MediaPlayer2#setNextDataSources} to set data source for playback. * * <p>Users should use {@link Builder} to create {@link CallbackDataSourceDesc}. - * + * @hide */ +@TestApi public class CallbackDataSourceDesc extends DataSourceDesc { private DataSourceCallback mDataSourceCallback; - private CallbackDataSourceDesc() { + CallbackDataSourceDesc(String mediaId, long startPositionMs, long endPositionMs, + DataSourceCallback dataSourceCallback) { + super(mediaId, startPositionMs, endPositionMs); + mDataSourceCallback = dataSourceCallback; } /** @@ -41,75 +45,4 @@ public class CallbackDataSourceDesc extends DataSourceDesc { public @NonNull DataSourceCallback getDataSourceCallback() { return mDataSourceCallback; } - - /** - * Builder class for {@link CallbackDataSourceDesc} objects. - * <p> Here is an example where <code>Builder</code> is used to define the - * {@link CallbackDataSourceDesc} to be used by a {@link MediaPlayer2} instance: - * - * <pre class="prettyprint"> - * CallbackDataSourceDesc newDSD = new CallbackDataSourceDesc.Builder() - * .setDataSource(media2DataSource) - * .setStartPosition(1000) - * .setEndPosition(15000) - * .build(); - * mediaplayer2.setDataSourceDesc(newDSD); - * </pre> - */ - public static class Builder extends BuilderBase<Builder> { - private DataSourceCallback mDataSourceCallback; - - /** - * Constructs a new Builder with the defaults. - */ - public Builder() { - super(); - } - - /** - * Constructs a new Builder from a given {@link CallbackDataSourceDesc} instance - * @param dsd the {@link CallbackDataSourceDesc} object whose data will be reused - * in the new Builder. - */ - public Builder(@Nullable CallbackDataSourceDesc dsd) { - super(dsd); - if (dsd == null) { - return; // use default - } - mDataSourceCallback = dsd.mDataSourceCallback; - } - - /** - * Combines all of the fields that have been set and return a new - * {@link CallbackDataSourceDesc} object. <code>IllegalStateException</code> will be - * thrown if there is conflict between fields. - * - * @return a new {@link CallbackDataSourceDesc} object - */ - public @NonNull CallbackDataSourceDesc build() { - if (mDataSourceCallback == null) { - throw new IllegalStateException( - "DataSourceCallback should not be null"); - } - - CallbackDataSourceDesc dsd = new CallbackDataSourceDesc(); - super.build(dsd); - dsd.mDataSourceCallback = mDataSourceCallback; - - return dsd; - } - - /** - * Sets the data source (DataSourceCallback) to use. - * - * @param dscb the DataSourceCallback for the media to play - * @return the same Builder instance. - * @throws NullPointerException if dscb is null. - */ - public @NonNull Builder setDataSource(@NonNull DataSourceCallback dscb) { - Media2Utils.checkArgument(dscb != null, "data source cannot be null."); - mDataSourceCallback = dscb; - return this; - } - } } diff --git a/media/apex/java/android/media/DataSourceDesc.java b/media/apex/java/android/media/DataSourceDesc.java index e6fd120b6d5b..be80c2255844 100644 --- a/media/apex/java/android/media/DataSourceDesc.java +++ b/media/apex/java/android/media/DataSourceDesc.java @@ -18,15 +18,22 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; +import android.net.Uri; +import android.os.ParcelFileDescriptor; + +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.HttpCookie; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** - * Base class of data source descriptor. + * Data source descriptor. * * Used by {@link MediaPlayer2#setDataSource}, {@link MediaPlayer2#setNextDataSource} and * {@link MediaPlayer2#setNextDataSources} to set data source for playback. - * - * <p>Users should use subclasses' builder to change {@link DataSourceDesc}. - * */ public class DataSourceDesc { // intentionally less than long.MAX_VALUE @@ -45,7 +52,10 @@ public class DataSourceDesc { private long mStartPositionMs = 0; private long mEndPositionMs = POSITION_UNKNOWN; - DataSourceDesc() { + DataSourceDesc(String mediaId, long startPositionMs, long endPositionMs) { + mMediaId = mediaId; + mStartPositionMs = startPositionMs; + mEndPositionMs = endPositionMs; } /** @@ -97,17 +107,48 @@ public class DataSourceDesc { } /** - * Base class for Builders in the subclasses of {@link DataSourceDesc}. + * Builder for {@link DataSourceDesc}. + * <p> + * Here is an example where <code>Builder</code> is used to define the + * {@link DataSourceDesc} to be used by a {@link MediaPlayer2} instance: + * + * <pre class="prettyprint"> + * DataSourceDesc newDSD = new DataSourceDesc.Builder() + * .setDataSource(context, uri, headers, cookies) + * .setStartPosition(1000) + * .setEndPosition(15000) + * .build(); + * mediaplayer2.setDataSourceDesc(newDSD); + * </pre> */ - protected static class BuilderBase<T extends BuilderBase> { + public static final class Builder { + private static final int SOURCE_TYPE_UNKNOWN = 0; + private static final int SOURCE_TYPE_URI = 1; + private static final int SOURCE_TYPE_FILE = 2; + private static final int SOURCE_TYPE_CALLBACK = 3; + + private int mSourceType = SOURCE_TYPE_UNKNOWN; private String mMediaId; private long mStartPositionMs = 0; private long mEndPositionMs = POSITION_UNKNOWN; + // For UriDataSourceDesc + private Uri mUri; + private Map<String, String> mHeader; + private List<HttpCookie> mCookies; + + // For FileDataSourceDesc + private ParcelFileDescriptor mPFD; + private long mOffset = 0; + private long mLength = FileDataSourceDesc.FD_LENGTH_UNKNOWN; + + // For CallbackDataSourceDesc + private DataSourceCallback mDataSourceCallback; + /** * Constructs a new BuilderBase with the defaults. */ - BuilderBase() { + public Builder() { } /** @@ -115,33 +156,61 @@ public class DataSourceDesc { * @param dsd the {@link DataSourceDesc} object whose data will be reused * in the new BuilderBase. */ - BuilderBase(DataSourceDesc dsd) { + public Builder(@Nullable DataSourceDesc dsd) { if (dsd == null) { return; } mMediaId = dsd.mMediaId; mStartPositionMs = dsd.mStartPositionMs; mEndPositionMs = dsd.mEndPositionMs; + if (dsd instanceof FileDataSourceDesc) { + mSourceType = SOURCE_TYPE_FILE; + mPFD = ((FileDataSourceDesc) dsd).getParcelFileDescriptor(); + mOffset = ((FileDataSourceDesc) dsd).getOffset(); + mLength = ((FileDataSourceDesc) dsd).getLength(); + } else if (dsd instanceof UriDataSourceDesc) { + mSourceType = SOURCE_TYPE_URI; + mUri = ((UriDataSourceDesc) dsd).getUri(); + mHeader = ((UriDataSourceDesc) dsd).getHeaders(); + mCookies = ((UriDataSourceDesc) dsd).getCookies(); + } else if (dsd instanceof CallbackDataSourceDesc) { + mSourceType = SOURCE_TYPE_CALLBACK; + mDataSourceCallback = ((CallbackDataSourceDesc) dsd).getDataSourceCallback(); + } else { + throw new IllegalStateException("Unknown source type:" + mSourceType); + } } /** * Sets all fields that have been set in the {@link DataSourceDesc} object. * <code>IllegalStateException</code> will be thrown if there is conflict between fields. * - * @param dsd an instance of subclass of {@link DataSourceDesc} whose data will be set - * @return the same instance of subclass of {@link DataSourceDesc} + * @return {@link DataSourceDesc} */ - void build(@NonNull DataSourceDesc dsd) { - Media2Utils.checkArgument(dsd != null, "dsd cannot be null."); - + @NonNull + public DataSourceDesc build() { + if (mSourceType == SOURCE_TYPE_UNKNOWN) { + throw new IllegalStateException("Source is not set."); + } if (mStartPositionMs > mEndPositionMs) { throw new IllegalStateException("Illegal start/end position: " + mStartPositionMs + " : " + mEndPositionMs); } - dsd.mMediaId = mMediaId; - dsd.mStartPositionMs = mStartPositionMs; - dsd.mEndPositionMs = mEndPositionMs; + DataSourceDesc desc; + if (mSourceType == SOURCE_TYPE_FILE) { + desc = new FileDataSourceDesc( + mMediaId, mStartPositionMs, mEndPositionMs, mPFD, mOffset, mLength); + } else if (mSourceType == SOURCE_TYPE_URI) { + desc = new UriDataSourceDesc( + mMediaId, mStartPositionMs, mEndPositionMs, mUri, mHeader, mCookies); + } else if (mSourceType == SOURCE_TYPE_CALLBACK) { + desc = new CallbackDataSourceDesc( + mMediaId, mStartPositionMs, mEndPositionMs, mDataSourceCallback); + } else { + throw new IllegalStateException("Unknown source type:" + mSourceType); + } + return desc; } /** @@ -150,9 +219,10 @@ public class DataSourceDesc { * @param mediaId the media Id of this data source * @return the same Builder instance. */ - public @NonNull T setMediaId(@Nullable String mediaId) { + @NonNull + public Builder setMediaId(@Nullable String mediaId) { mMediaId = mediaId; - return (T) this; + return this; } /** @@ -163,12 +233,13 @@ public class DataSourceDesc { * @return the same Builder instance. * */ - public @NonNull T setStartPosition(long position) { + @NonNull + public Builder setStartPosition(long position) { if (position < 0) { position = 0; } mStartPositionMs = position; - return (T) this; + return this; } /** @@ -179,12 +250,155 @@ public class DataSourceDesc { * @param position the end position in milliseconds at which the playback will end * @return the same Builder instance. */ - public @NonNull T setEndPosition(long position) { + @NonNull + public Builder setEndPosition(long position) { if (position < 0) { position = LONG_MAX_TIME_MS; } mEndPositionMs = position; - return (T) this; + return this; + } + + /** + * Sets the data source as a content Uri. + * + * @param uri the Content URI of the data you want to play + * @return the same Builder instance. + * @throws NullPointerException if context or uri is null. + */ + @NonNull + public Builder setDataSource(@NonNull Uri uri) { + setSourceType(SOURCE_TYPE_URI); + Media2Utils.checkArgument(uri != null, "uri cannot be null"); + mUri = uri; + return this; + } + + /** + * Sets the data source as a content Uri. + * + * To provide cookies for the subsequent HTTP requests, you can install your own default + * cookie handler and use other variants of setDataSource APIs instead. Alternatively, you + * can use this API to pass the cookies as a list of HttpCookie. If the app has not + * installed a CookieHandler already, {@link MediaPlayer2} will create a CookieManager + * and populates its CookieStore with the provided cookies when this data source is passed + * to {@link MediaPlayer2}. If the app has installed its own handler already, the handler + * is required to be of CookieManager type such that {@link MediaPlayer2} can update the + * manager’s CookieStore. + * + * <p><strong>Note</strong> that the cross domain redirection is allowed by default, + * but that can be changed with key/value pairs through the headers parameter with + * "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value to + * disallow or allow cross domain redirection. + * + * @param uri the Content URI of the data you want to play + * @param headers the headers to be sent together with the request for the data + * The headers must not include cookies. Instead, use the cookies param. + * @param cookies the cookies to be sent together with the request + * @return the same Builder instance. + * @throws NullPointerException if context or uri is null. + * @throws IllegalArgumentException if the cookie handler is not of CookieManager type + * when cookies are provided. + */ + @NonNull + public Builder setDataSource(@NonNull Uri uri, @Nullable Map<String, String> headers, + @Nullable List<HttpCookie> cookies) { + setSourceType(SOURCE_TYPE_URI); + Media2Utils.checkArgument(uri != null, "uri cannot be null"); + if (cookies != null) { + CookieHandler cookieHandler = CookieHandler.getDefault(); + if (cookieHandler != null && !(cookieHandler instanceof CookieManager)) { + throw new IllegalArgumentException( + "The cookie handler has to be of CookieManager type " + + "when cookies are provided."); + } + } + + mUri = uri; + if (headers != null) { + mHeader = new HashMap<String, String>(headers); + } + if (cookies != null) { + mCookies = new ArrayList<HttpCookie>(cookies); + } + return this; + } + + /** + * Sets the data source (ParcelFileDescriptor) to use. The ParcelFileDescriptor must be + * seekable (N.B. a LocalSocket is not seekable). When the {@link FileDataSourceDesc} + * created by this builder is passed to {@link MediaPlayer2} via + * {@link MediaPlayer2#setDataSource}, + * {@link MediaPlayer2#setNextDataSource} or + * {@link MediaPlayer2#setNextDataSources}, MediaPlayer2 will + * close the ParcelFileDescriptor. + * + * @param pfd the ParcelFileDescriptor for the file to play + * @return the same Builder instance. + * @throws NullPointerException if pfd is null. + */ + @NonNull + public Builder setDataSource(@NonNull ParcelFileDescriptor pfd) { + setSourceType(SOURCE_TYPE_FILE); + Media2Utils.checkArgument(pfd != null, "pfd cannot be null."); + mPFD = pfd; + return this; + } + + /** + * Sets the data source (ParcelFileDescriptor) to use. The ParcelFileDescriptor must be + * seekable (N.B. a LocalSocket is not seekable). When the {@link FileDataSourceDesc} + * created by this builder is passed to {@link MediaPlayer2} via + * {@link MediaPlayer2#setDataSource}, + * {@link MediaPlayer2#setNextDataSource} or + * {@link MediaPlayer2#setNextDataSources}, MediaPlayer2 will + * close the ParcelFileDescriptor. + * + * Any negative number for offset is treated as 0. + * Any negative number for length is treated as maximum length of the data source. + * + * @param pfd the ParcelFileDescriptor for the file to play + * @param offset the offset into the file where the data to be played starts, in bytes + * @param length the length in bytes of the data to be played + * @return the same Builder instance. + * @throws NullPointerException if pfd is null. + */ + @NonNull + public Builder setDataSource( + @NonNull ParcelFileDescriptor pfd, long offset, long length) { + setSourceType(SOURCE_TYPE_FILE); + Media2Utils.checkArgument(pfd != null, "pfd cannot be null."); + if (offset < 0) { + offset = 0; + } + if (length < 0) { + length = FileDataSourceDesc.FD_LENGTH_UNKNOWN; + } + mPFD = pfd; + mOffset = offset; + mLength = length; + return this; + } + + /** + * Sets the data source (DataSourceCallback) to use. + * + * @param dscb the DataSourceCallback for the media to play + * @return the same Builder instance. + * @throws NullPointerException if dscb is null. + */ + public @NonNull Builder setDataSource(@NonNull DataSourceCallback dscb) { + setSourceType(SOURCE_TYPE_CALLBACK); + Media2Utils.checkArgument(dscb != null, "data source cannot be null."); + mDataSourceCallback = dscb; + return this; + } + + private void setSourceType(int type) { + if (mSourceType != SOURCE_TYPE_UNKNOWN) { + throw new IllegalStateException("Source is already set. type=" + mSourceType); + } + mSourceType = type; } } } diff --git a/media/apex/java/android/media/FileDataSourceDesc.java b/media/apex/java/android/media/FileDataSourceDesc.java index 4b703670abf1..feb67e136d9b 100644 --- a/media/apex/java/android/media/FileDataSourceDesc.java +++ b/media/apex/java/android/media/FileDataSourceDesc.java @@ -17,7 +17,7 @@ package android.media; import android.annotation.NonNull; -import android.annotation.Nullable; +import android.annotation.TestApi; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -30,8 +30,9 @@ import java.io.IOException; * {@link MediaPlayer2#setNextDataSources} to set data source for playback. * * <p>Users should use {@link Builder} to create {@link FileDataSourceDesc}. - * + * @hide */ +@TestApi public class FileDataSourceDesc extends DataSourceDesc { private static final String TAG = "FileDataSourceDesc"; @@ -48,8 +49,12 @@ public class FileDataSourceDesc extends DataSourceDesc { private int mCount = 0; private boolean mClosed = false; - private FileDataSourceDesc() { - super(); + FileDataSourceDesc(String mediaId, long startPositionMs, long endPositionMs, + ParcelFileDescriptor pfd, long offset, long length) { + super(mediaId, startPositionMs, endPositionMs); + mPFD = pfd; + mOffset = offset; + mLength = length; } /** @@ -128,133 +133,4 @@ public class FileDataSourceDesc extends DataSourceDesc { public long getLength() { return mLength; } - - /** - * Builder class for {@link FileDataSourceDesc} objects. - * <p> Here is an example where <code>Builder</code> is used to define the - * {@link FileDataSourceDesc} to be used by a {@link MediaPlayer2} instance: - * - * <pre class="prettyprint"> - * FileDataSourceDesc newDSD = new FileDataSourceDesc.Builder() - * .setDataSource(pfd, 0, srcLength) - * .setStartPosition(1000) - * .setEndPosition(15000) - * .build(); - * mediaplayer2.setDataSourceDesc(newDSD); - * </pre> - */ - public static class Builder extends BuilderBase<Builder> { - private ParcelFileDescriptor mPFD; - private long mOffset = 0; - private long mLength = FD_LENGTH_UNKNOWN; - - /** - * Constructs a new Builder with the defaults. - */ - public Builder() { - super(); - } - - /** - * Constructs a new Builder from a given {@link FileDataSourceDesc} instance - * @param dsd the {@link FileDataSourceDesc} object whose data will be reused - * in the new Builder. - */ - public Builder(@Nullable FileDataSourceDesc dsd) { - super(dsd); - if (dsd == null) { - return; // use default - } - mPFD = dsd.mPFD; - mOffset = dsd.mOffset; - mLength = dsd.mLength; - } - - /** - * Combines all of the fields that have been set and return a new - * {@link FileDataSourceDesc} object. <code>IllegalStateException</code> will be - * thrown if there is conflict between fields. - * - * @return a new {@link FileDataSourceDesc} object - */ - public @NonNull FileDataSourceDesc build() { - if (mPFD == null) { - throw new IllegalStateException( - "underline ParcelFileDescriptor should not be null"); - } - try { - mPFD.getFd(); - } catch (IllegalStateException e) { - throw new IllegalStateException("ParcelFileDescriptor has been closed"); - } - - FileDataSourceDesc dsd = new FileDataSourceDesc(); - super.build(dsd); - dsd.mPFD = mPFD; - dsd.mOffset = mOffset; - dsd.mLength = mLength; - - return dsd; - } - - /** - * Sets the data source (ParcelFileDescriptor) to use. The ParcelFileDescriptor must be - * seekable (N.B. a LocalSocket is not seekable). When the {@link FileDataSourceDesc} - * created by this builder is passed to {@link MediaPlayer2} via - * {@link MediaPlayer2#setDataSource}, - * {@link MediaPlayer2#setNextDataSource} or - * {@link MediaPlayer2#setNextDataSources}, MediaPlayer2 will - * close the ParcelFileDescriptor. - * - * @param pfd the ParcelFileDescriptor for the file to play - * @return the same Builder instance. - * @throws NullPointerException if pfd is null. - */ - public @NonNull Builder setDataSource(@NonNull ParcelFileDescriptor pfd) { - Media2Utils.checkArgument(pfd != null, "pfd cannot be null."); - resetDataSource(); - mPFD = pfd; - return this; - } - - /** - * Sets the data source (ParcelFileDescriptor) to use. The ParcelFileDescriptor must be - * seekable (N.B. a LocalSocket is not seekable). When the {@link FileDataSourceDesc} - * created by this builder is passed to {@link MediaPlayer2} via - * {@link MediaPlayer2#setDataSource}, - * {@link MediaPlayer2#setNextDataSource} or - * {@link MediaPlayer2#setNextDataSources}, MediaPlayer2 will - * close the ParcelFileDescriptor. - * - * Any negative number for offset is treated as 0. - * Any negative number for length is treated as maximum length of the data source. - * - * @param pfd the ParcelFileDescriptor for the file to play - * @param offset the offset into the file where the data to be played starts, in bytes - * @param length the length in bytes of the data to be played - * @return the same Builder instance. - * @throws NullPointerException if pfd is null. - */ - public @NonNull Builder setDataSource( - @NonNull ParcelFileDescriptor pfd, long offset, long length) { - Media2Utils.checkArgument(pfd != null, "pfd cannot be null."); - if (offset < 0) { - offset = 0; - } - if (length < 0) { - length = FD_LENGTH_UNKNOWN; - } - resetDataSource(); - mPFD = pfd; - mOffset = offset; - mLength = length; - return this; - } - - private void resetDataSource() { - mPFD = null; - mOffset = 0; - mLength = FD_LENGTH_UNKNOWN; - } - } } diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java index 13ff108b6e4f..68a46ed5b8b8 100644 --- a/media/apex/java/android/media/MediaPlayer2.java +++ b/media/apex/java/android/media/MediaPlayer2.java @@ -898,7 +898,7 @@ public class MediaPlayer2 implements AutoCloseable, AudioRouting { UriDataSourceDesc uriDSD = (UriDataSourceDesc) dsd; handleDataSource(isCurrent, srcId, - uriDSD.getContext(), + mContext, uriDSD.getUri(), uriDSD.getHeaders(), uriDSD.getCookies(), diff --git a/media/apex/java/android/media/UriDataSourceDesc.java b/media/apex/java/android/media/UriDataSourceDesc.java index c0b3c825323c..eaedf1e377e2 100644 --- a/media/apex/java/android/media/UriDataSourceDesc.java +++ b/media/apex/java/android/media/UriDataSourceDesc.java @@ -18,11 +18,9 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.Context; +import android.annotation.TestApi; import android.net.Uri; -import java.net.CookieHandler; -import java.net.CookieManager; import java.net.HttpCookie; import java.util.ArrayList; import java.util.HashMap; @@ -36,15 +34,20 @@ import java.util.Map; * {@link MediaPlayer2#setNextDataSources} to set data source for playback. * * <p>Users should use {@link Builder} to change {@link UriDataSourceDesc}. - * + * @hide */ +@TestApi public class UriDataSourceDesc extends DataSourceDesc { private Uri mUri; private Map<String, String> mHeader; private List<HttpCookie> mCookies; - private Context mContext; - private UriDataSourceDesc() { + UriDataSourceDesc(String mediaId, long startPositionMs, long endPositionMs, + Uri uri, Map<String, String> header, List<HttpCookie> cookies) { + super(mediaId, startPositionMs, endPositionMs); + mUri = uri; + mHeader = header; + mCookies = cookies; } /** @@ -76,155 +79,4 @@ public class UriDataSourceDesc extends DataSourceDesc { } return new ArrayList<HttpCookie>(mCookies); } - - /** - * Return the Context used for resolving the Uri of this data source. - * @return the Context used for resolving the Uri of this data source - */ - public @NonNull Context getContext() { - return mContext; - } - - /** - * Builder class for {@link UriDataSourceDesc} objects. - * <p> Here is an example where <code>Builder</code> is used to define the - * {@link UriDataSourceDesc} to be used by a {@link MediaPlayer2} instance: - * - * <pre class="prettyprint"> - * UriDataSourceDesc newDSD = new UriDataSourceDesc.Builder() - * .setDataSource(context, uri, headers, cookies) - * .setStartPosition(1000) - * .setEndPosition(15000) - * .build(); - * mediaplayer2.setDataSourceDesc(newDSD); - * </pre> - */ - public static class Builder extends BuilderBase<Builder> { - private Uri mUri; - private Map<String, String> mHeader; - private List<HttpCookie> mCookies; - private Context mContext; - - /** - * Constructs a new Builder with the defaults. - */ - public Builder() { - super(); - } - - /** - * Constructs a new Builder from a given {@link UriDataSourceDesc} instance - * @param dsd the {@link UriDataSourceDesc} object whose data will be reused - * in the new Builder. - */ - public Builder(@Nullable UriDataSourceDesc dsd) { - super(dsd); - if (dsd == null) { - return; // use default - } - mUri = dsd.mUri; - mHeader = dsd.mHeader; - mCookies = dsd.mCookies; - mContext = dsd.mContext; - } - - /** - * Combines all of the fields that have been set and return a new - * {@link UriDataSourceDesc} object. <code>IllegalStateException</code> will be - * thrown if there is conflict between fields. - * - * @return a new {@link UriDataSourceDesc} object - */ - public @NonNull UriDataSourceDesc build() { - if (mUri == null || mContext == null) { - throw new IllegalStateException( - "Uri and Context should not be null"); - } - - UriDataSourceDesc dsd = new UriDataSourceDesc(); - super.build(dsd); - dsd.mUri = mUri; - dsd.mHeader = mHeader; - dsd.mCookies = mCookies; - dsd.mContext = mContext; - - return dsd; - } - - /** - * Sets the data source as a content Uri. - * - * @param context the Context to use when resolving the Uri - * @param uri the Content URI of the data you want to play - * @return the same Builder instance. - * @throws NullPointerException if context or uri is null. - */ - public @NonNull Builder setDataSource(@NonNull Context context, @NonNull Uri uri) { - Media2Utils.checkArgument(context != null, "context cannot be null"); - Media2Utils.checkArgument(uri != null, "uri cannot be null"); - resetDataSource(); - mUri = uri; - mContext = context; - return this; - } - - /** - * Sets the data source as a content Uri. - * - * To provide cookies for the subsequent HTTP requests, you can install your own default - * cookie handler and use other variants of setDataSource APIs instead. Alternatively, you - * can use this API to pass the cookies as a list of HttpCookie. If the app has not - * installed a CookieHandler already, {@link MediaPlayer2} will create a CookieManager - * and populates its CookieStore with the provided cookies when this data source is passed - * to {@link MediaPlayer2}. If the app has installed its own handler already, the handler - * is required to be of CookieManager type such that {@link MediaPlayer2} can update the - * manager’s CookieStore. - * - * <p><strong>Note</strong> that the cross domain redirection is allowed by default, - * but that can be changed with key/value pairs through the headers parameter with - * "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value to - * disallow or allow cross domain redirection. - * - * @param context the Context to use when resolving the Uri - * @param uri the Content URI of the data you want to play - * @param headers the headers to be sent together with the request for the data - * The headers must not include cookies. Instead, use the cookies param. - * @param cookies the cookies to be sent together with the request - * @return the same Builder instance. - * @throws NullPointerException if context or uri is null. - * @throws IllegalArgumentException if the cookie handler is not of CookieManager type - * when cookies are provided. - */ - public @NonNull Builder setDataSource(@NonNull Context context, @NonNull Uri uri, - @Nullable Map<String, String> headers, @Nullable List<HttpCookie> cookies) { - Media2Utils.checkArgument(context != null, "context cannot be null"); - Media2Utils.checkArgument(uri != null, "uri cannot be null"); - if (cookies != null) { - CookieHandler cookieHandler = CookieHandler.getDefault(); - if (cookieHandler != null && !(cookieHandler instanceof CookieManager)) { - throw new IllegalArgumentException( - "The cookie handler has to be of CookieManager type " - + "when cookies are provided."); - } - } - - resetDataSource(); - mUri = uri; - if (headers != null) { - mHeader = new HashMap<String, String>(headers); - } - if (cookies != null) { - mCookies = new ArrayList<HttpCookie>(cookies); - } - mContext = context; - return this; - } - - private void resetDataSource() { - mUri = null; - mHeader = null; - mCookies = null; - mContext = null; - } - } } diff --git a/media/java/android/media/AudioPlaybackCaptureConfiguration.java b/media/java/android/media/AudioPlaybackCaptureConfiguration.java index c97db78a5caa..4aa0b903bcdf 100644 --- a/media/java/android/media/AudioPlaybackCaptureConfiguration.java +++ b/media/java/android/media/AudioPlaybackCaptureConfiguration.java @@ -66,6 +66,15 @@ public final class AudioPlaybackCaptureConfiguration { } /** + * @return the {@code MediaProjection} used to build this object. + * @see {@code Builder.Builder} + */ + public @NonNull MediaProjection getMediaProjection() { + return mProjection; + } + + + /** * Returns a mix that routes audio back into the app while still playing it from the speakers. * * @param audioFormat The format in which to capture the audio. @@ -76,9 +85,6 @@ public final class AudioPlaybackCaptureConfiguration { .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK | AudioMix.ROUTE_FLAG_RENDER) .build(); } - MediaProjection getMediaProjection() { - return mProjection; - } /** Builder for creating {@link AudioPlaybackCaptureConfiguration} instances. */ public static final class Builder { diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 27499c6160d3..8686c5905af7 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -413,7 +413,18 @@ public final class MediaFormat { */ public static final String KEY_INTRA_REFRESH_PERIOD = "intra-refresh-period"; - /** + /** + * An optional key describing whether encoders prepend headers to sync frames (e.g. + * SPS and PPS to IDR frames for H.264). This is an optional parameter that applies only + * to video encoders. A video encoder may not support this feature; check the output + * format to verify that this feature was enabled. + * + * The value is an integer, with 1 indicating to prepend headers to every sync frames, + * or 0 otherwise. The default value is 0. + */ + public static final String KEY_PREPEND_HEADER_TO_SYNC_FRAMES = "prepend-sps-pps-to-idr-frames"; + + /** * A key describing the temporal layering schema. This is an optional parameter * that applies only to video encoders. Use {@link MediaCodec#getOutputFormat} * after {@link MediaCodec#configure configure} to query if the encoder supports diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java index 6c48cdb7b643..d41f416f3d51 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -409,6 +409,10 @@ public class AudioMixingRule { final int match_rule = rule & ~RULE_EXCLUSION_MASK; while (crIterator.hasNext()) { final AudioMixMatchCriterion criterion = crIterator.next(); + + if ((criterion.mRule & ~RULE_EXCLUSION_MASK) != match_rule) { + continue; // The two rules are not of the same type + } switch (match_rule) { case RULE_MATCH_ATTRIBUTE_USAGE: // "usage"-based rule diff --git a/media/mca/effect/java/android/media/effect/SingleFilterEffect.java b/media/mca/effect/java/android/media/effect/SingleFilterEffect.java index 47900dfcfd5a..dfbf5d20e074 100644 --- a/media/mca/effect/java/android/media/effect/SingleFilterEffect.java +++ b/media/mca/effect/java/android/media/effect/SingleFilterEffect.java @@ -17,6 +17,7 @@ package android.media.effect; +import android.annotation.UnsupportedAppUsage; import android.filterfw.core.Filter; import android.filterfw.core.FilterFactory; import android.filterfw.core.FilterFunction; @@ -44,6 +45,7 @@ public class SingleFilterEffect extends FilterEffect { * @param outputName The name of the output image port. * @param finalParameters Key-value pairs of final input port assignments. */ + @UnsupportedAppUsage public SingleFilterEffect(EffectContext context, String name, Class filterClass, diff --git a/media/mca/filterfw/java/android/filterfw/GraphEnvironment.java b/media/mca/filterfw/java/android/filterfw/GraphEnvironment.java index 7c90b2731ff8..52615bf09faa 100644 --- a/media/mca/filterfw/java/android/filterfw/GraphEnvironment.java +++ b/media/mca/filterfw/java/android/filterfw/GraphEnvironment.java @@ -119,6 +119,7 @@ public class GraphEnvironment extends MffEnvironment { * * @param references An alternating argument list of keys (Strings) and values. */ + @UnsupportedAppUsage public void addReferences(Object... references) { getGraphReader().addReferencesByKeysAndValues(references); } diff --git a/packages/CarSystemUI/Android.bp b/packages/CarSystemUI/Android.bp index 4c9629def113..589623b0d6cd 100644 --- a/packages/CarSystemUI/Android.bp +++ b/packages/CarSystemUI/Android.bp @@ -32,7 +32,6 @@ android_app { "SystemUISharedLib", "SettingsLib", "android.car.userlib", - "androidx.car_car", "androidx.legacy_legacy-support-v4", "androidx.recyclerview_recyclerview", "androidx.preference_preference", @@ -46,7 +45,6 @@ android_app { "androidx.slice_slice-builders", "androidx.arch.core_core-runtime", "androidx.lifecycle_lifecycle-extensions", - "car-theme-lib-bp", "SystemUI-tags", "SystemUI-proto", ], diff --git a/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml b/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml index b428931670f5..8b2779d10481 100644 --- a/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml +++ b/packages/CarSystemUI/res-keyguard/drawable/keyguard_button_background.xml @@ -18,13 +18,13 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> - <corners android:radius="@dimen/car_button_radius"/> + <corners android:radius="@*android:dimen/car_button_radius"/> <solid android:color="#131315"/> </shape> </item> <item> <shape android:shape="rectangle"> - <corners android:radius="@dimen/car_button_radius"/> + <corners android:radius="@*android:dimen/car_button_radius"/> <solid android:color="@color/button_background"/> </shape> </item> diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml index b115a1f3c131..a465254afebb 100644 --- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml @@ -28,7 +28,7 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingHorizontal="@dimen/car_margin"> + android:paddingHorizontal="@*android:dimen/car_margin"> <FrameLayout android:layout_height="match_parent" @@ -53,10 +53,10 @@ <TextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/car_padding_2" + android:layout_margin="@*android:dimen/car_padding_2" android:gravity="center" android:textColor="@android:color/white" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:text="@string/keyguard_enter_your_pattern" /> <include layout="@layout/keyguard_message_area" /> diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml index ed88c6235d58..5746102f5f27 100644 --- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml @@ -29,7 +29,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" - android:paddingHorizontal="@dimen/car_margin"> + android:paddingHorizontal="@*android:dimen/car_margin"> <FrameLayout android:layout_width="0dp" @@ -72,10 +72,10 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="@dimen/car_padding_2" + android:layout_margin="@*android:dimen/car_padding_2" android:gravity="center" android:textColor="@android:color/white" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:text="@string/keyguard_enter_your_pin" /> <include layout="@layout/keyguard_message_area" /> diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml index c2304147982a..09cf4722dae0 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_message_area.xml @@ -27,5 +27,5 @@ android:singleLine="true" android:ellipsize="marquee" android:focusable="true" - android:layout_marginBottom="@dimen/car_padding_4" - android:textSize="@dimen/car_body2_size" /> + android:layout_marginBottom="@*android:dimen/car_padding_4" + android:textSize="@*android:dimen/car_body2_size" /> diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml index e701fdb956f5..7004fb64ba06 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_password_view.xml @@ -51,7 +51,7 @@ android:singleLine="true" android:textStyle="normal" android:inputType="textPassword" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:textColor="?attr/wallpaperTextColor" android:textAppearance="?android:attr/textAppearanceMedium" android:imeOptions="flagForceAscii|actionDone" @@ -61,10 +61,10 @@ <TextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/car_padding_2" + android:layout_margin="@*android:dimen/car_padding_2" android:gravity="center" android:textColor="@android:color/white" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:text="@string/keyguard_enter_your_password" /> <Button diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml index 00333a8a826e..bb69d44a3ac7 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_pattern_view.xml @@ -46,10 +46,10 @@ <TextView android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/car_padding_2" + android:layout_margin="@*android:dimen/car_padding_2" android:gravity="center" android:textColor="@android:color/white" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:text="@string/keyguard_enter_your_pattern" /> <include layout="@layout/keyguard_message_area" /> diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml index 16622518c36f..815e67d1e278 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml @@ -59,10 +59,10 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="@dimen/car_padding_2" + android:layout_margin="@*android:dimen/car_padding_2" android:gravity="center" android:textColor="@android:color/white" - android:textSize="@dimen/car_body1_size" + android:textSize="@*android:dimen/car_body1_size" android:text="@string/keyguard_enter_your_pin" /> <include layout="@layout/keyguard_message_area" /> diff --git a/packages/CarSystemUI/res-keyguard/values-land/dimens.xml b/packages/CarSystemUI/res-keyguard/values-land/dimens.xml index 805a13497f6f..c39e0e4731e8 100644 --- a/packages/CarSystemUI/res-keyguard/values-land/dimens.xml +++ b/packages/CarSystemUI/res-keyguard/values-land/dimens.xml @@ -15,6 +15,6 @@ limitations under the License. --> <resources> - <dimen name="num_pad_key_margin_horizontal">@dimen/car_padding_5</dimen> - <dimen name="num_pad_key_margin_bottom">@dimen/car_padding_4</dimen> + <dimen name="num_pad_key_margin_horizontal">@*android:dimen/car_padding_5</dimen> + <dimen name="num_pad_key_margin_bottom">@*android:dimen/car_padding_4</dimen> </resources> diff --git a/packages/CarSystemUI/res-keyguard/values/colors.xml b/packages/CarSystemUI/res-keyguard/values/colors.xml index e6edbea3f80e..ba9f060fab88 100644 --- a/packages/CarSystemUI/res-keyguard/values/colors.xml +++ b/packages/CarSystemUI/res-keyguard/values/colors.xml @@ -16,6 +16,6 @@ --> <resources> - <color name="button_background">@color/car_dark_blue_grey_600</color> - <color name="button_text">@color/car_action1_light</color> + <color name="button_background">@*android:color/car_dark_blue_grey_600</color> + <color name="button_text">@android:color/white</color> </resources>
\ No newline at end of file diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml index 9424dc3870ba..8dfe1716ef54 100644 --- a/packages/CarSystemUI/res-keyguard/values/dimens.xml +++ b/packages/CarSystemUI/res-keyguard/values/dimens.xml @@ -19,8 +19,8 @@ <dimen name="num_pad_margin_right">144dp</dimen> <dimen name="num_pad_key_width">80dp</dimen> <dimen name="num_pad_key_height">80dp</dimen> - <dimen name="num_pad_key_margin_horizontal">@dimen/car_padding_6</dimen> - <dimen name="num_pad_key_margin_bottom">@dimen/car_padding_5</dimen> + <dimen name="num_pad_key_margin_horizontal">@*android:dimen/car_padding_5</dimen> + <dimen name="num_pad_key_margin_bottom">@*android:dimen/car_padding_5</dimen> <dimen name="pin_entry_height">@dimen/num_pad_key_height</dimen> <dimen name="divider_height">1dp</dimen> <dimen name="key_enter_margin_top">128dp</dimen> diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml index b39e6e64316e..ecea30a13ced 100644 --- a/packages/CarSystemUI/res-keyguard/values/styles.xml +++ b/packages/CarSystemUI/res-keyguard/values/styles.xml @@ -40,7 +40,7 @@ <item name="android:layout_marginEnd">@dimen/num_pad_key_margin_horizontal</item> </style> - <style name="KeyguardButton" parent="Widget.Car.Button"> + <style name="KeyguardButton" parent="@android:style/Widget.DeviceDefault.Button"> <item name="android:background">@drawable/keyguard_button_background</item> <item name="android:textColor">@color/button_text</item> <item name="android:textAllCaps">false</item> @@ -48,6 +48,6 @@ <style name="Widget.TextView.NumPadKey" parent="@android:style/Widget.TextView"> <!-- Only replaces the text size. --> - <item name="android:textSize">@dimen/car_body1_size</item> + <item name="android:textSize">@*android:dimen/car_body1_size</item> </style> </resources> diff --git a/packages/CarSystemUI/res/drawable/car_ic_add_white.xml b/packages/CarSystemUI/res/drawable/car_ic_add_white.xml index d6818607ec08..9d5ca264cdfa 100644 --- a/packages/CarSystemUI/res/drawable/car_ic_add_white.xml +++ b/packages/CarSystemUI/res/drawable/car_ic_add_white.xml @@ -13,8 +13,8 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="@dimen/car_touch_target_size" - android:height="@dimen/car_touch_target_size" + android:width="@*android:dimen/car_touch_target_size" + android:height="@*android:dimen/car_touch_target_size" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml b/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml index eb501e5c26eb..07227fbeb0d8 100644 --- a/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml +++ b/packages/CarSystemUI/res/drawable/car_rounded_bg_bottom.xml @@ -19,9 +19,9 @@ android:shape="rectangle"> <solid android:color="?android:attr/colorBackgroundFloating" /> <corners - android:bottomLeftRadius="@dimen/car_radius_3" + android:bottomLeftRadius="@*android:dimen/car_radius_3" android:topLeftRadius="0dp" - android:bottomRightRadius="@dimen/car_radius_3" + android:bottomRightRadius="@*android:dimen/car_radius_3" android:topRightRadius="0dp" /> </shape> diff --git a/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml b/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml index 1a9b8a521d78..2649a005a971 100644 --- a/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml +++ b/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml @@ -19,19 +19,19 @@ <item> <shape android:shape="oval"> <padding - android:bottom="@dimen/car_padding_1" - android:left="@dimen/car_padding_1" - android:right="@dimen/car_padding_1" - android:top="@dimen/car_padding_1"/> + android:bottom="@*android:dimen/car_padding_1" + android:left="@*android:dimen/car_padding_1" + android:right="@*android:dimen/car_padding_1" + android:top="@*android:dimen/car_padding_1"/> <solid android:color="@android:color/black"/> </shape> </item> <item> <shape android:shape="oval"> - <solid android:color="@color/car_accent"/> + <solid android:color="@*android:color/car_accent"/> <size - android:width="@dimen/car_seekbar_thumb_size" - android:height="@dimen/car_seekbar_thumb_size"/> + android:width="@*android:dimen/car_seekbar_thumb_size" + android:height="@*android:dimen/car_seekbar_thumb_size"/> </shape> </item> </layer-list> diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml index e8c5134cd180..395eac1d2ccb 100644 --- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml +++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml @@ -14,12 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:fitsSystemWindows="true" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:visibility="gone"> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true" + android:visibility="gone"> <LinearLayout android:id="@+id/container" @@ -27,20 +27,21 @@ android:layout_height="match_parent" android:orientation="vertical"> - <include layout="@layout/car_status_bar_header" - android:theme="@android:style/Theme" - android:layout_alignParentTop="true"/> + <include + layout="@layout/car_status_bar_header" + android:layout_alignParentTop="true" + android:theme="@android:style/Theme"/> - <com.android.systemui.statusbar.car.UserGridRecyclerView - android:id="@+id/user_grid" + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginTop="@dimen/car_user_switcher_margin_top" - android:theme="@style/PagedListTheme" - app:verticallyCenterListContent="true" - app:showPagedListViewDivider="false" - app:gutter="both" - app:itemSpacing="@dimen/car_user_switcher_vertical_spacing_between_users"/> + android:layout_height="match_parent"> + <com.android.systemui.statusbar.car.UserGridRecyclerView + android:id="@+id/user_grid" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginTop="@dimen/car_user_switcher_margin_top"/> + </FrameLayout> </LinearLayout> </FrameLayout> diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_navigation_bar.xml index 93d2b67dcda2..34fd70332cd0 100644 --- a/packages/CarSystemUI/res/layout/car_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_navigation_bar.xml @@ -137,8 +137,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:paddingStart="@dimen/car_keyline_1" - android:paddingEnd="@dimen/car_keyline_1" + android:paddingStart="@*android:dimen/car_keyline_1" + android:paddingEnd="@*android:dimen/car_keyline_1" android:gravity="center" android:visibility="gone"> </LinearLayout> diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml index 4fa877ff37dc..28eba6ceade1 100644 --- a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml +++ b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml @@ -28,12 +28,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:paddingStart="@dimen/car_padding_5" - android:paddingEnd="@dimen/car_padding_5"> + android:paddingStart="@*android:dimen/car_padding_5" + android:paddingEnd="@*android:dimen/car_padding_5"> <com.android.systemui.statusbar.car.CarNavigationButton android:id="@+id/home" - android:layout_width="@dimen/car_touch_target_size" + android:layout_width="@*android:dimen/car_touch_target_size" android:layout_height="match_parent" android:background="?android:attr/selectableItemBackground" android:src="@drawable/car_ic_overview" diff --git a/packages/CarSystemUI/res/layout/car_qs_panel.xml b/packages/CarSystemUI/res/layout/car_qs_panel.xml index d923e0fbb20b..9c598d71bd22 100644 --- a/packages/CarSystemUI/res/layout/car_qs_panel.xml +++ b/packages/CarSystemUI/res/layout/car_qs_panel.xml @@ -28,7 +28,6 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/user_switcher_container" android:clipChildren="false" android:layout_width="match_parent" @@ -37,11 +36,7 @@ <com.android.systemui.statusbar.car.UserGridRecyclerView android:id="@+id/user_grid" android:layout_width="match_parent" - android:layout_height="match_parent" - android:theme="@style/PagedListTheme" - app:showPagedListViewDivider="false" - app:gutter="both" - app:itemSpacing="@dimen/car_user_switcher_vertical_spacing_between_users"/> + android:layout_height="match_parent"/> </RelativeLayout> diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml index 2fe740d51e8f..925ccb4a162a 100644 --- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml @@ -49,11 +49,11 @@ android:id="@+id/lefttext" android:layout_width="wrap_content" android:layout_height="match_parent" - android:paddingStart="@dimen/car_padding_4" + android:paddingStart="@*android:dimen/car_padding_4" android:paddingEnd="16dp" android:gravity="center_vertical|start" android:minEms="4" - android:textAppearance="@style/TextAppearance.Car.Status" + android:textAppearance="@style/TextAppearance.CarStatus" systemui:hvacAreaId="49" systemui:hvacMaxText="@string/hvac_max_text" systemui:hvacMaxValue="@dimen/hvac_max_value" @@ -96,7 +96,7 @@ android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_toEndOf="@+id/clock_container" - android:paddingStart="@dimen/car_padding_1" + android:paddingStart="@*android:dimen/car_padding_1" android:gravity="center_vertical" android:orientation="horizontal" > @@ -132,10 +132,10 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:paddingStart="16dp" - android:paddingEnd="@dimen/car_padding_4" + android:paddingEnd="@*android:dimen/car_padding_4" android:gravity="center_vertical|end" android:minEms="4" - android:textAppearance="@style/TextAppearance.Car.Status" + android:textAppearance="@style/TextAppearance.CarStatus" systemui:hvacAreaId="68" systemui:hvacMaxText="@string/hvac_max_text" systemui:hvacMaxValue="@dimen/hvac_max_value" diff --git a/packages/CarSystemUI/res/layout/car_volume_dialog.xml b/packages/CarSystemUI/res/layout/car_volume_dialog.xml index 709797d41060..35551eabfaed 100644 --- a/packages/CarSystemUI/res/layout/car_volume_dialog.xml +++ b/packages/CarSystemUI/res/layout/car_volume_dialog.xml @@ -14,15 +14,9 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<androidx.car.widget.PagedListView +<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/volume_list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minWidth="@dimen/volume_dialog_panel_width" - android:theme="@style/PagedListViewTheme" - app:gutter="none" - app:scrollBarEnabled="false" - app:listDividerColor="@color/list_divider_color" - app:showPagedListViewDivider="true"/> + android:minWidth="@dimen/volume_dialog_panel_width"/> diff --git a/packages/CarSystemUI/res/layout/car_volume_item.xml b/packages/CarSystemUI/res/layout/car_volume_item.xml new file mode 100644 index 000000000000..2275ca6329e2 --- /dev/null +++ b/packages/CarSystemUI/res/layout/car_volume_item.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/car_volume_item_height"> + + <!-- Primary Action. --> + <ImageView + android:id="@+id/primary_icon" + android:layout_width="@dimen/car_primary_icon_size" + android:layout_centerVertical="true" + android:layout_marginStart="@dimen/car_volume_item_margin_horizontal" + android:layout_alignParentStart="true" + android:layout_height="@dimen/car_primary_icon_size"/> + + <!-- Note: the horizontal padding and offset are set to 0 so that the track and thumb + aligns with the proper keylines. --> + <SeekBar + android:id="@+id/seek_bar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/car_volume_item_seekbar_margin_vertical" + android:layout_marginTop="@dimen/car_volume_item_seekbar_margin_vertical" + android:min="0" + android:paddingBottom="@dimen/car_volume_item_seekbar_padding_vertical" + android:layout_centerVertical="true" + android:paddingEnd="0dp" + android:paddingStart="0dp" + android:paddingTop="@dimen/car_volume_item_seekbar_padding_vertical" + android:splitTrack="false" + android:layout_toStartOf="@id/supplemental_icon_divider" + android:layout_marginStart="@dimen/car_volume_item_seekbar_margin_start" + android:layout_marginEnd="@dimen/car_volume_item_seekbar_margin_end" + android:thumbOffset="0dp"/> + + <!-- Supplemental action. --> + <View + android:id="@+id/supplemental_icon_divider" + android:layout_width="@dimen/car_volume_item_divider_width" + android:layout_height="@dimen/car_volume_item_divider_height" + android:layout_marginEnd="@dimen/car_volume_item_divider_margin_end" + android:layout_centerVertical="true" + android:layout_toStartOf="@id/supplemental_icon" + android:background="@color/car_volume_item_divider_color"/> + <ImageView + android:id="@+id/supplemental_icon" + android:layout_width="@dimen/car_primary_icon_size" + android:layout_height="@dimen/car_primary_icon_size" + android:background="?android:attr/selectableItemBackground" + android:layout_centerVertical="true" + android:layout_alignParentEnd="true" + android:layout_marginEnd="@dimen/car_volume_item_margin_horizontal" + android:scaleType="fitCenter"/> +</RelativeLayout> diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml index 7c833035d57c..383aba4e400a 100644 --- a/packages/CarSystemUI/res/layout/notification_center_activity.xml +++ b/packages/CarSystemUI/res/layout/notification_center_activity.xml @@ -32,19 +32,14 @@ android:translationZ="2dp" /> - <androidx.car.widget.PagedListView + <androidx.recyclerview.widget.RecyclerView android:id="@+id/notifications" android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" - android:theme="@style/PagedListTheme" - app:gutter="none" - app:itemSpacing="@dimen/item_spacing" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:scrollBarEnabled="false" - app:showPagedListViewDivider="false"/> + app:layout_constraintEnd_toEndOf="parent"/> </com.android.car.notification.CarNotificationView> diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml index 7b4e32b407ae..83ec3514c01a 100644 --- a/packages/CarSystemUI/res/values/colors.xml +++ b/packages/CarSystemUI/res/values/colors.xml @@ -45,4 +45,6 @@ <color name="keyguard_button_text_color">@android:color/black</color> <color name="list_divider_color">@*android:color/car_list_divider_light</color> + <color name="car_volume_item_divider_color">@*android:color/car_list_divider</color> + <color name="car_volume_item_background_color">@*android:color/car_card_dark</color> </resources> diff --git a/packages/CarSystemUI/res/values/colors_car.xml b/packages/CarSystemUI/res/values/colors_car.xml index 08e16cdbe3b3..69ab3f3cf957 100644 --- a/packages/CarSystemUI/res/values/colors_car.xml +++ b/packages/CarSystemUI/res/values/colors_car.xml @@ -18,12 +18,12 @@ --> <resources> <color name="car_qs_background_primary">#263238</color> <!-- Blue Gray 900 --> - <color name="car_qs_footer_user_name_color">@color/car_grey_50</color> + <color name="car_qs_footer_user_name_color">@*android:color/car_grey_50</color> <!-- colors for user switcher --> - <color name="car_user_switcher_background_color">@color/car_card_dark</color> - <color name="car_user_switcher_name_text_color">@color/car_body1_light</color> - <color name="car_user_switcher_add_user_background_color">@color/car_dark_blue_grey_600</color> - <color name="car_user_switcher_add_user_add_sign_color">@color/car_body1_light</color> + <color name="car_user_switcher_background_color">@*android:color/car_card_dark</color> + <color name="car_user_switcher_name_text_color">@*android:color/car_body1_light</color> + <color name="car_user_switcher_add_user_background_color">@*android:color/car_dark_blue_grey_600</color> + <color name="car_user_switcher_add_user_add_sign_color">@*android:color/car_body1_light</color> </resources> diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml index 07ecca201c12..8789c8a924b3 100644 --- a/packages/CarSystemUI/res/values/dimens.xml +++ b/packages/CarSystemUI/res/values/dimens.xml @@ -26,7 +26,7 @@ <!-- The amount by which to scale up the status bar icons. --> <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.75</item> - <dimen name="car_primary_icon_size">36dp</dimen> + <dimen name="car_primary_icon_size">@*android:dimen/car_primary_icon_size</dimen> <!-- dimensions for the car user switcher --> <dimen name="car_user_switcher_name_text_size">@dimen/car_body1_size</dimen> @@ -49,7 +49,7 @@ <dimen name="volume_dialog_elevation">6dp</dimen> - <dimen name="volume_dialog_row_margin_end">@dimen/car_keyline_3</dimen> + <dimen name="volume_dialog_row_margin_end">@*android:dimen/car_keyline_3</dimen> <dimen name="volume_dialog_row_padding_end">0dp</dimen> @@ -59,4 +59,33 @@ <dimen name="car_keyline_1">24dp</dimen> <dimen name="car_keyline_2">96dp</dimen> <dimen name="car_keyline_3">128dp</dimen> + + <dimen name="privacy_chip_icon_max_height">100dp</dimen> + + <!-- Height of icons in Ongoing App Ops dialog. Both App Op icon and application icon --> + <dimen name="ongoing_appops_dialog_icon_height">48dp</dimen> + <!-- Margin between text lines in Ongoing App Ops dialog --> + <dimen name="ongoing_appops_dialog_text_margin">15dp</dimen> + <!-- Padding around Ongoing App Ops dialog content --> + <dimen name="ongoing_appops_dialog_content_padding">24dp</dimen> + <!-- Margins around the Ongoing App Ops chip. In landscape, the side margins are 0 --> + <dimen name="ongoing_appops_chip_margin">12dp</dimen> + <!-- Start and End padding for Ongoing App Ops chip --> + <dimen name="ongoing_appops_chip_side_padding">6dp</dimen> + <!-- Padding between background of Ongoing App Ops chip and content --> + <dimen name="ongoing_appops_chip_bg_padding">4dp</dimen> + <!-- Radius of Ongoing App Ops chip corners --> + <dimen name="ongoing_appops_chip_bg_corner_radius">12dp</dimen> + + <!-- Car volume dimens. --> + <dimen name="car_volume_item_height">@*android:dimen/car_single_line_list_item_height</dimen> + <dimen name="car_volume_item_margin_horizontal">@*android:dimen/car_keyline_1</dimen> + <dimen name="car_volume_item_seekbar_margin_vertical">@*android:dimen/car_padding_1</dimen> + <dimen name="car_volume_item_seekbar_margin_start">@*android:dimen/car_keyline_3</dimen> + <dimen name="car_volume_item_seekbar_margin_end">@*android:dimen/car_padding_4</dimen> + <dimen name="car_volume_item_seekbar_padding_vertical">@*android:dimen/car_seekbar_padding</dimen> + <dimen name="car_volume_item_divider_height">60dp</dimen> + <dimen name="car_volume_item_divider_width">1dp</dimen> + <dimen name="car_volume_item_divider_margin_end">@*android:dimen/car_padding_4</dimen> + <dimen name="car_volume_item_corner_radius">@*android:dimen/car_radius_3</dimen> </resources> diff --git a/packages/CarSystemUI/res/values/dimens_car.xml b/packages/CarSystemUI/res/values/dimens_car.xml index c027f81eb8bd..42a764959545 100644 --- a/packages/CarSystemUI/res/values/dimens_car.xml +++ b/packages/CarSystemUI/res/values/dimens_car.xml @@ -17,11 +17,11 @@ --> <resources> <!-- dimensions for the car user switcher --> - <dimen name="car_user_switcher_name_text_size">@dimen/car_body1_size</dimen> - <dimen name="car_user_switcher_image_avatar_size">@dimen/car_large_avatar_size</dimen> - <dimen name="car_user_switcher_vertical_spacing_between_users">@dimen/car_padding_5</dimen> - <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@dimen/car_padding_4</dimen> - <dimen name="car_user_switcher_margin_top">@dimen/car_padding_4</dimen> + <dimen name="car_user_switcher_name_text_size">@*android:dimen/car_body1_size</dimen> + <dimen name="car_user_switcher_image_avatar_size">@*android:dimen/car_large_avatar_size</dimen> + <dimen name="car_user_switcher_vertical_spacing_between_users">@*android:dimen/car_padding_5</dimen> + <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@*android:dimen/car_padding_4</dimen> + <dimen name="car_user_switcher_margin_top">@*android:dimen/car_padding_4</dimen> <dimen name="car_navigation_button_width">64dp</dimen> <dimen name="car_navigation_bar_width">760dp</dimen> @@ -37,7 +37,7 @@ <dimen name="car_qs_footer_icon_height">56dp</dimen> <dimen name="car_qs_footer_user_switch_icon_margin">5dp</dimen> <dimen name="car_qs_footer_user_switch_icon_width">36dp</dimen> - <dimen name="car_qs_footer_user_name_text_size">@dimen/car_body2_size</dimen> + <dimen name="car_qs_footer_user_name_text_size">@*android:dimen/car_body2_size</dimen> <dimen name="car_user_switcher_container_height">420dp</dimen> <!-- This must be the negative of car_user_switcher_container_height for the animation. --> diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml index 0d95d308f48b..371bebdebc86 100644 --- a/packages/CarSystemUI/res/values/styles.xml +++ b/packages/CarSystemUI/res/values/styles.xml @@ -29,12 +29,12 @@ parent="@*android:style/TextAppearance.StatusBar.Icon"> <item name="android:textSize">42sp</item> <item name="android:fontFamily">sans-serif-regular</item> - <item name="android:textColor">@color/car_grey_50</item> + <item name="android:textColor">@*android:color/car_grey_50</item> </style> - <style name="TextAppearance.Car.Status"> - <item name="android:textSize">@dimen/car_body2_size</item> - <item name="android:textColor">@color/car_grey_50</item> + <style name="TextAppearance.CarStatus" parent="@android:style/TextAppearance.DeviceDefault"> + <item name="android:textSize">@*android:dimen/car_body2_size</item> + <item name="android:textColor">@*android:color/car_grey_50</item> </style> <style name="CarNavigationBarButtonTheme"> @@ -46,11 +46,4 @@ <item name="android:layout_width">96dp</item> <item name="android:background">@drawable/nav_button_background</item> </style> - - <style name="PagedListViewTheme" parent="@style/Theme.CarSupportWrapper.NoActionBar"> - <item name="android:background">@*android:color/car_background</item> - <item name="listItemBackgroundColor">@*android:color/car_background</item> - <item name="dividerEndMargin">@dimen/car_keyline_1</item> - <item name="dividerStartMargin">@dimen/car_keyline_1</item> - </style> </resources>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/values/themes.xml b/packages/CarSystemUI/res/values/themes.xml index 8d1a4d7c08c4..f82be3c0e529 100644 --- a/packages/CarSystemUI/res/values/themes.xml +++ b/packages/CarSystemUI/res/values/themes.xml @@ -18,10 +18,6 @@ --> <resources> - <!--This Theme contains attributes required for components from the car support lib --> - <style name="PagedListTheme" parent="Theme.CarSupportWrapper.NoActionBar"> - </style> - <style name="Theme.Notification" parent="Theme.DeviceDefault.NoActionBar.Notification"> </style> </resources> diff --git a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java index 4a2d2fbc30cf..48cb55b3d90e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java +++ b/packages/CarSystemUI/src/com/android/systemui/notifications/NotificationsUI.java @@ -16,11 +16,11 @@ package com.android.systemui.notifications; -import android.app.ActivityManager; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.annotation.SuppressLint; +import android.app.ActivityManager; import android.car.Car; import android.car.CarNotConnectedException; import android.car.drivingstate.CarUxRestrictionsManager; @@ -113,7 +113,7 @@ public class NotificationsUI extends SystemUI ServiceManager.getService(Context.STATUS_BAR_SERVICE)), launchResult -> { if (launchResult == ActivityManager.START_TASK_TO_FRONT - || launchResult == ActivityManager.START_SUCCESS){ + || launchResult == ActivityManager.START_SUCCESS) { closeCarNotifications(DEFAULT_FLING_VELOCITY); } }); @@ -179,8 +179,7 @@ public class NotificationsUI extends SystemUI } }); - RecyclerView notificationList = mCarNotificationWindow - .findViewById(com.android.car.notification.R.id.recycler_view); + RecyclerView notificationList = mCarNotificationWindow.findViewById(R.id.notifications); // register a scroll listener so we can figure out if we are at the bottom of the // list of notifications notificationList.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -202,7 +201,7 @@ public class NotificationsUI extends SystemUI // There's a view installed at a higher z-order such that we can intercept the ACTION_DOWN // to set the initial click state. mCarNotificationWindow.findViewById(R.id.glass_pane).setOnTouchListener((v, event) -> { - if (event.getActionMasked() == MotionEvent.ACTION_UP ) { + if (event.getActionMasked() == MotionEvent.ACTION_UP) { mNotificationListAtBottomAtTimeOfTouch = false; } if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { @@ -259,7 +258,7 @@ public class NotificationsUI extends SystemUI public boolean onTouch(View v, MotionEvent event) { // reset mNotificationListAtBottomAtTimeOfTouch here since the "glass pane" will not // get the up event - if (event.getActionMasked() == MotionEvent.ACTION_UP ) { + if (event.getActionMasked() == MotionEvent.ACTION_UP) { mNotificationListAtBottomAtTimeOfTouch = false; } boolean wasScrolledUp = mScrollUpDetector.onTouchEvent(event); @@ -351,7 +350,7 @@ public class NotificationsUI extends SystemUI public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { if (Math.abs(event1.getX() - event2.getX()) > SWIPE_MAX_OFF_PATH - || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY){ + || Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) { // swipe was not vertical or was not fast enough return false; } @@ -435,8 +434,7 @@ public class NotificationsUI extends SystemUI mNotificationViewController.disable(); mIsShowing = false; mIsTracking = false; - RecyclerView notificationListView = mCarNotificationWindow.findViewById( - com.android.car.notification.R.id.recycler_view); + RecyclerView notificationListView = mCarNotificationWindow.findViewById(R.id.notifications); notificationListView.scrollToPosition(0); } diff --git a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java index 41c37d3bbc19..769fc52a574c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java +++ b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java @@ -79,7 +79,7 @@ public class CarQSFragment extends Fragment implements QS { mUserGridView = mUserSwitcherContainer.findViewById(R.id.user_grid); GridLayoutManager layoutManager = new GridLayoutManager(context, context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col)); - mUserGridView.getRecyclerView().setLayoutManager(layoutManager); + mUserGridView.setLayoutManager(layoutManager); mUserGridView.buildAdapter(); mUserSwitchCallback = new UserSwitchCallback(); diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java index 23fe5944573e..f896cf1bf10c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java @@ -45,7 +45,7 @@ public class FullscreenUserSwitcher { mUserGridView = container.findViewById(R.id.user_grid); GridLayoutManager layoutManager = new GridLayoutManager(context, context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col)); - mUserGridView.getRecyclerView().setLayoutManager(layoutManager); + mUserGridView.setLayoutManager(layoutManager); mUserGridView.buildAdapter(); mUserGridView.setUserSelectionListener(this::onUserSelected); diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java index fb2b57b6d490..827a59eddf56 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java @@ -28,6 +28,7 @@ import android.content.DialogInterface; import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Rect; import android.os.AsyncTask; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -36,9 +37,9 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import androidx.car.widget.PagedListView; import androidx.core.graphics.drawable.RoundedBitmapDrawable; import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.android.internal.util.UserIcons; @@ -52,7 +53,7 @@ import java.util.List; * Displays a GridLayout with icons for the users in the system to allow switching between users. * One of the uses of this is for the lock screen in auto. */ -public class UserGridRecyclerView extends PagedListView implements +public class UserGridRecyclerView extends RecyclerView implements CarUserManagerHelper.OnUsersUpdateListener { private UserSelectionListener mUserSelectionListener; private UserAdapter mAdapter; @@ -63,6 +64,9 @@ public class UserGridRecyclerView extends PagedListView implements super(context, attrs); mContext = context; mCarUserManagerHelper = new CarUserManagerHelper(mContext); + + addItemDecoration(new ItemSpacingDecoration(context.getResources().getDimensionPixelSize( + R.dimen.car_user_switcher_vertical_spacing_between_users))); } /** @@ -253,7 +257,8 @@ public class UserGridRecyclerView extends PagedListView implements } private void showMaxUserLimitReachedDialog() { - AlertDialog maxUsersDialog = new Builder(mContext, R.style.Theme_Car_Dark_Dialog_Alert) + AlertDialog maxUsersDialog = new Builder(mContext, + com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert) .setTitle(R.string.user_limit_reached_title) .setMessage(getResources().getQuantityString( R.plurals.user_limit_reached_message, @@ -272,7 +277,8 @@ public class UserGridRecyclerView extends PagedListView implements .concat(System.getProperty("line.separator")) .concat(mRes.getString(R.string.user_add_user_message_update)); - AlertDialog addUserDialog = new Builder(mContext, R.style.Theme_Car_Dark_Dialog_Alert) + AlertDialog addUserDialog = new Builder(mContext, + com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert) .setTitle(R.string.user_add_user_title) .setMessage(message) .setNegativeButton(android.R.string.cancel, this) @@ -391,4 +397,31 @@ public class UserGridRecyclerView extends PagedListView implements void onUserSelected(UserRecord record); } + + /** + * A {@link RecyclerView.ItemDecoration} that will add spacing between each item in the + * RecyclerView that it is added to. + */ + private static class ItemSpacingDecoration extends RecyclerView.ItemDecoration { + private int mItemSpacing; + + private ItemSpacingDecoration(int itemSpacing) { + mItemSpacing = itemSpacing; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, + RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + int position = parent.getChildAdapterPosition(view); + + // Skip offset for last item except for GridLayoutManager. + if (position == state.getItemCount() - 1 + && !(parent.getLayoutManager() instanceof GridLayoutManager)) { + return; + } + + outRect.bottom = mItemSpacing; + } + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java index 10a0ae5a924c..512210be0a46 100644 --- a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java +++ b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java @@ -32,9 +32,7 @@ import android.content.DialogInterface; import android.content.ServiceConnection; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; -import android.graphics.Color; import android.graphics.PixelFormat; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.os.Debug; @@ -46,7 +44,6 @@ import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.util.Xml; -import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -56,12 +53,8 @@ import android.view.WindowManager; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; -import androidx.car.widget.ListItem; -import androidx.car.widget.ListItemAdapter; -import androidx.car.widget.ListItemAdapter.BackgroundStyle; -import androidx.car.widget.ListItemProvider.ListProvider; -import androidx.car.widget.PagedListView; -import androidx.car.widget.SeekbarListItem; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.android.systemui.R; import com.android.systemui.plugins.VolumeDialog; @@ -96,13 +89,13 @@ public class CarVolumeDialogImpl implements VolumeDialog { private final SparseArray<VolumeItem> mVolumeItems = new SparseArray<>(); // Available volume items in car audio manager. private final List<VolumeItem> mAvailableVolumeItems = new ArrayList<>(); - // Volume items in the PagedListView. - private final List<ListItem> mVolumeLineItems = new ArrayList<>(); + // Volume items in the RecyclerView. + private final List<CarVolumeItem> mCarVolumeLineItems = new ArrayList<>(); private final KeyguardManager mKeyguard; private Window mWindow; private CustomDialog mDialog; - private PagedListView mListView; - private ListItemAdapter mPagedListAdapter; + private RecyclerView mListView; + private CarVolumeItemAdapter mVolumeItemsAdapter; private Car mCar; private CarAudioManager mCarAudioManager; private final CarAudioManager.CarVolumeCallback mVolumeChangeCallback = @@ -126,7 +119,7 @@ public class CarVolumeDialogImpl implements VolumeDialog { // callback. Updating the seekbar at the same time could block the continuous // seeking. if (value != volumeItem.progress) { - volumeItem.listItem.setProgress(value); + volumeItem.carVolumeItem.setProgress(value); volumeItem.progress = value; } if ((flags & AudioManager.FLAG_SHOW_UI) != 0) { @@ -160,13 +153,13 @@ public class CarVolumeDialogImpl implements VolumeDialog { // The first one is the default item. if (groupId == 0) { mDefaultVolumeItem = volumeItem; - setupDefaultListItem(); + setupDefaultCarVolumeItem(); } } // If list is already initiated, update its content. - if (mPagedListAdapter != null) { - mPagedListAdapter.notifyDataSetChanged(); + if (mVolumeItemsAdapter != null) { + mVolumeItemsAdapter.notifyDataSetChanged(); } mCarAudioManager.registerCarVolumeCallback(mVolumeChangeCallback); } catch (CarNotConnectedException e) { @@ -184,15 +177,15 @@ public class CarVolumeDialogImpl implements VolumeDialog { } }; - private void setupDefaultListItem() { + private void setupDefaultCarVolumeItem() { mDefaultVolumeItem.defaultItem = true; - addSeekbarListItem(mDefaultVolumeItem, /* volumeGroupId = */0, + addCarVolumeListItem(mDefaultVolumeItem, /* volumeGroupId = */0, R.drawable.car_ic_keyboard_arrow_down, new ExpandIconListener() ); } public CarVolumeDialogImpl(Context context) { - mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme); + mContext = context; mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); mCar = Car.createCar(mContext, mServiceConnection); } @@ -238,7 +231,7 @@ public class CarVolumeDialogImpl implements VolumeDialog { private void initDialog() { loadAudioUsageItems(); - mVolumeLineItems.clear(); + mCarVolumeLineItems.clear(); mDialog = new CustomDialog(mContext); mHovering = false; @@ -246,7 +239,6 @@ public class CarVolumeDialogImpl implements VolumeDialog { mExpanded = false; mWindow = mDialog.getWindow(); mWindow.requestFeature(Window.FEATURE_NO_TITLE); - mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE @@ -263,10 +255,11 @@ public class CarVolumeDialogImpl implements VolumeDialog { lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; lp.windowAnimations = -1; mWindow.setAttributes(lp); - mWindow.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - mDialog.setCanceledOnTouchOutside(true); mDialog.setContentView(R.layout.car_volume_dialog); + mWindow.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + + mDialog.setCanceledOnTouchOutside(true); mDialog.setOnShowListener(dialog -> { mListView.setTranslationY(-mListView.getHeight()); mListView.setAlpha(0); @@ -277,7 +270,7 @@ public class CarVolumeDialogImpl implements VolumeDialog { .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator()) .start(); }); - mListView = (PagedListView) mWindow.findViewById(R.id.volume_list); + mListView = mWindow.findViewById(R.id.volume_list); mListView.setOnHoverListener((v, event) -> { int action = event.getActionMasked(); mHovering = (action == MotionEvent.ACTION_HOVER_ENTER) @@ -286,10 +279,9 @@ public class CarVolumeDialogImpl implements VolumeDialog { return true; }); - mPagedListAdapter = new ListItemAdapter(mContext, new ListProvider(mVolumeLineItems), - BackgroundStyle.PANEL); - mListView.setAdapter(mPagedListAdapter); - mListView.setMaxPages(PagedListView.UNLIMITED_PAGES); + mVolumeItemsAdapter = new CarVolumeItemAdapter(mContext, mCarVolumeLineItems); + mListView.setAdapter(mVolumeItemsAdapter); + mListView.setLayoutManager(new LinearLayoutManager(mContext)); } @@ -302,13 +294,13 @@ public class CarVolumeDialogImpl implements VolumeDialog { mHandler.removeMessages(H.DISMISS); rescheduleTimeoutH(); // Refresh the data set before showing. - mPagedListAdapter.notifyDataSetChanged(); + mVolumeItemsAdapter.notifyDataSetChanged(); if (mShowing) { return; } mShowing = true; - if (mVolumeLineItems.isEmpty()) { - setupDefaultListItem(); + if (mCarVolumeLineItems.isEmpty()) { + setupDefaultCarVolumeItem(); } mDialog.show(); Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); @@ -421,40 +413,41 @@ public class CarVolumeDialogImpl implements VolumeDialog { return result; } - private SeekbarListItem addSeekbarListItem(VolumeItem volumeItem, - int volumeGroupId, + private CarVolumeItem addCarVolumeListItem(VolumeItem volumeItem, int volumeGroupId, int supplementalIconId, @Nullable View.OnClickListener supplementalIconOnClickListener) { - SeekbarListItem listItem = new SeekbarListItem(mContext); - listItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId)); + CarVolumeItem carVolumeItem = new CarVolumeItem(); + carVolumeItem.setMax(getMaxSeekbarValue(mCarAudioManager, volumeGroupId)); int color = mContext.getResources().getColor(R.color.car_volume_dialog_tint); int progress = getSeekbarValue(mCarAudioManager, volumeGroupId); - listItem.setProgress(progress); - listItem.setOnSeekBarChangeListener(new CarVolumeDialogImpl - .VolumeSeekBarChangeListener(volumeGroupId, mCarAudioManager)); + carVolumeItem.setProgress(progress); + carVolumeItem.setOnSeekBarChangeListener( + new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId, + mCarAudioManager)); Drawable primaryIcon = mContext.getResources().getDrawable(volumeItem.icon); primaryIcon.mutate().setTint(color); - listItem.setPrimaryActionIcon(primaryIcon); + carVolumeItem.setPrimaryIcon(primaryIcon); if (supplementalIconId != 0) { Drawable supplementalIcon = mContext.getResources().getDrawable(supplementalIconId); supplementalIcon.mutate().setTint(color); - listItem.setSupplementalIcon(supplementalIcon, true); - listItem.setSupplementalIconListener(supplementalIconOnClickListener); + carVolumeItem.setSupplementalIcon(supplementalIcon, + /* showSupplementalIconDivider= */ true); + carVolumeItem.setSupplementalIconListener(supplementalIconOnClickListener); } else { - listItem.setSupplementalEmptyIcon(true); - listItem.setSupplementalIconListener(null); + carVolumeItem.setSupplementalIcon(/* drawable= */ null, + /* showSupplementalIconDivider= */ false); } - mVolumeLineItems.add(listItem); - volumeItem.listItem = listItem; + mCarVolumeLineItems.add(carVolumeItem); + volumeItem.carVolumeItem = carVolumeItem; volumeItem.progress = progress; - return listItem; + return carVolumeItem; } - private VolumeItem findVolumeItem(SeekbarListItem targetItem) { + private VolumeItem findVolumeItem(CarVolumeItem targetItem) { for (int i = 0; i < mVolumeItems.size(); ++i) { VolumeItem volumeItem = mVolumeItems.valueAt(i); - if (volumeItem.listItem == targetItem) { + if (volumeItem.carVolumeItem == targetItem) { return volumeItem; } } @@ -463,7 +456,7 @@ public class CarVolumeDialogImpl implements VolumeDialog { private void cleanupAudioManager() { mCarAudioManager.unregisterCarVolumeCallback(mVolumeChangeCallback); - mVolumeLineItems.clear(); + mCarVolumeLineItems.clear(); mCarAudioManager = null; } @@ -474,8 +467,9 @@ public class CarVolumeDialogImpl implements VolumeDialog { private int rank; private boolean defaultItem = false; - private @DrawableRes int icon; - private SeekbarListItem listItem; + @DrawableRes + private int icon; + private CarVolumeItem carVolumeItem; private int progress; } @@ -554,9 +548,9 @@ public class CarVolumeDialogImpl implements VolumeDialog { // Adding the items which are not coming from the default item. VolumeItem volumeItem = mAvailableVolumeItems.get(groupId); if (volumeItem.defaultItem) { - updateDefaultVolumeItem(volumeItem.listItem); + updateDefaultVolumeItem(volumeItem.carVolumeItem); } else { - addSeekbarListItem(volumeItem, groupId, 0, null); + addCarVolumeListItem(volumeItem, groupId, 0, null); } } inAnimator = AnimatorInflater.loadAnimator( @@ -564,14 +558,14 @@ public class CarVolumeDialogImpl implements VolumeDialog { } else { // Only keeping the default stream if it is not expended. - Iterator itr = mVolumeLineItems.iterator(); + Iterator itr = mCarVolumeLineItems.iterator(); while (itr.hasNext()) { - SeekbarListItem seekbarListItem = (SeekbarListItem) itr.next(); - VolumeItem volumeItem = findVolumeItem(seekbarListItem); + CarVolumeItem carVolumeItem = (CarVolumeItem) itr.next(); + VolumeItem volumeItem = findVolumeItem(carVolumeItem); if (!volumeItem.defaultItem) { itr.remove(); } else { - updateDefaultVolumeItem(seekbarListItem); + updateDefaultVolumeItem(carVolumeItem); } } inAnimator = AnimatorInflater.loadAnimator( @@ -590,22 +584,22 @@ public class CarVolumeDialogImpl implements VolumeDialog { } animators.setTarget(mExpandIcon); animators.start(); - mPagedListAdapter.notifyDataSetChanged(); + mVolumeItemsAdapter.notifyDataSetChanged(); } - private void updateDefaultVolumeItem(SeekbarListItem seekbarListItem){ - VolumeItem volumeItem = findVolumeItem(seekbarListItem); + private void updateDefaultVolumeItem(CarVolumeItem carVolumeItem) { + VolumeItem volumeItem = findVolumeItem(carVolumeItem); // When volume dialog is expanded or collapsed the default list item is never // reset. Whereas all other list items are removed when the dialog is collapsed and then - // added when the dialog is expanded using {@link CarVolumeDialogImpl#addSeekbarListItem}. + // added when the dialog is expanded using {@link CarVolumeDialogImpl#addCarVolumeListItem}. // This sets the progressbar and the tint color of icons for all items other than default // if they were changed. For default list item it should be done manually here. int color = mContext.getResources().getColor(R.color.car_volume_dialog_tint); Drawable primaryIcon = mContext.getResources().getDrawable(volumeItem.icon); primaryIcon.mutate().setTint(color); - volumeItem.listItem.setPrimaryActionIcon(primaryIcon); - volumeItem.listItem.setProgress(volumeItem.progress); + volumeItem.carVolumeItem.setPrimaryIcon(primaryIcon); + volumeItem.carVolumeItem.setProgress(volumeItem.progress); } private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener { @@ -646,4 +640,4 @@ public class CarVolumeDialogImpl implements VolumeDialog { public void onStopTrackingTouch(SeekBar seekBar) { } } -}
\ No newline at end of file +} diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java new file mode 100644 index 000000000000..9613de1bfaaa --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItem.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.ImageView; +import android.widget.SeekBar; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.systemui.R; + +/** Holds all related data to represent a volume group. */ +public class CarVolumeItem { + + private boolean mIsDirty; + + private Drawable mPrimaryIcon; + private Drawable mSupplementalIcon; + private View.OnClickListener mSupplementalIconOnClickListener; + private boolean mShowSupplementalIconDivider; + + private int mMax; + private int mProgress; + private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener; + + public CarVolumeItem() { + mIsDirty = true; + } + + /** + * Called when {@link CarVolumeItem} is bound to its ViewHolder. + */ + void bind(CarVolumeItemViewHolder viewHolder) { + if (mIsDirty) { + viewHolder.bind(/* carVolumeItem= */ this); + mIsDirty = false; + } + } + + /** Sets progress of seekbar. */ + public void setProgress(int progress) { + mProgress = progress; + mIsDirty = true; + } + + /** Sets max value of seekbar. */ + public void setMax(int max) { + mMax = max; + mIsDirty = true; + } + + /** Sets {@link SeekBar.OnSeekBarChangeListener}. */ + public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener listener) { + mOnSeekBarChangeListener = listener; + mIsDirty = true; + } + + /** Sets the primary icon. */ + public void setPrimaryIcon(Drawable drawable) { + mPrimaryIcon = drawable; + mIsDirty = true; + } + + /** Sets the supplemental icon and the visibility of the supplemental icon divider. */ + public void setSupplementalIcon(Drawable drawable, boolean showSupplementalIconDivider) { + mSupplementalIcon = drawable; + mShowSupplementalIconDivider = showSupplementalIconDivider; + mIsDirty = true; + } + + /** Sets {@code OnClickListener} for the supplemental icon. */ + public void setSupplementalIconListener(View.OnClickListener listener) { + mSupplementalIconOnClickListener = listener; + mIsDirty = true; + } + + /** Defines the view holder which shows the information held by {@link CarVolumeItem}. */ + public static class CarVolumeItemViewHolder extends RecyclerView.ViewHolder { + + private SeekBar mSeekBar; + private ImageView mPrimaryIcon; + private View mSupplementalIconDivider; + private ImageView mSupplementalIcon; + + public CarVolumeItemViewHolder(@NonNull View itemView) { + super(itemView); + + mSeekBar = itemView.findViewById(R.id.seek_bar); + mPrimaryIcon = itemView.findViewById(R.id.primary_icon); + mSupplementalIcon = itemView.findViewById(R.id.supplemental_icon); + mSupplementalIconDivider = itemView.findViewById(R.id.supplemental_icon_divider); + } + + /** + * Binds {@link CarVolumeItem} to the {@link CarVolumeItemViewHolder}. + */ + void bind(CarVolumeItem carVolumeItem) { + // Progress bar + mSeekBar.setMax(carVolumeItem.mMax); + mSeekBar.setProgress(carVolumeItem.mProgress); + mSeekBar.setOnSeekBarChangeListener(carVolumeItem.mOnSeekBarChangeListener); + + // Primary icon + mPrimaryIcon.setVisibility(View.VISIBLE); + mPrimaryIcon.setImageDrawable(carVolumeItem.mPrimaryIcon); + + // Supplemental icon + mSupplementalIcon.setVisibility(View.VISIBLE); + mSupplementalIconDivider.setVisibility( + carVolumeItem.mShowSupplementalIconDivider ? View.VISIBLE : View.INVISIBLE); + mSupplementalIcon.setImageDrawable(carVolumeItem.mSupplementalIcon); + mSupplementalIcon.setOnClickListener( + carVolumeItem.mSupplementalIconOnClickListener); + mSupplementalIcon.setClickable( + carVolumeItem.mSupplementalIconOnClickListener != null); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java new file mode 100644 index 000000000000..5c1f8170afc4 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/volume/CarVolumeItemAdapter.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +import com.android.systemui.R; + +import java.util.List; + +/** The {@link RecyclerView.Adapter} to show the volume items in the sysUI volume dialog. */ +public class CarVolumeItemAdapter extends + RecyclerView.Adapter<CarVolumeItem.CarVolumeItemViewHolder> { + + private final Context mContext; + private final List<CarVolumeItem> mItems; + + public CarVolumeItemAdapter(Context context, List<CarVolumeItem> items) { + mContext = context; + mItems = items; + } + + @Override + public CarVolumeItem.CarVolumeItemViewHolder onCreateViewHolder(ViewGroup parent, + int viewType) { + LayoutInflater inflater = LayoutInflater.from(mContext); + View view = inflater.inflate(R.layout.car_volume_item, parent, false); + return new CarVolumeItem.CarVolumeItemViewHolder(view); + } + + @Override + public void onBindViewHolder(CarVolumeItem.CarVolumeItemViewHolder holder, int position) { + mItems.get(position).bind(holder); + } + + @Override + public int getItemCount() { + return mItems.size(); + } +} diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java index 3cd2aa40dfb2..230b693a809a 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java @@ -329,7 +329,7 @@ public class DhcpServingParams { if (mLinkMtu != MTU_UNSET && (mLinkMtu < IPV4_MIN_MTU || mLinkMtu > IPV4_MAX_MTU)) { throw new InvalidParameterException("Invalid link MTU: " + mLinkMtu); } - if (!mServerAddr.isIPv4()) { + if (!mServerAddr.isIpv4()) { throw new InvalidParameterException("serverAddr must be IPv4"); } if (mServerAddr.getPrefixLength() < MIN_PREFIX_LENGTH diff --git a/packages/NetworkStack/src/android/net/ip/IpClient.java b/packages/NetworkStack/src/android/net/ip/IpClient.java index b68fe235647a..61dc966076a8 100644 --- a/packages/NetworkStack/src/android/net/ip/IpClient.java +++ b/packages/NetworkStack/src/android/net/ip/IpClient.java @@ -834,7 +834,7 @@ public class IpClient extends StateMachine { static boolean isProvisioned(LinkProperties lp, InitialConfiguration config) { // For historical reasons, we should connect even if all we have is // an IPv4 address and nothing else. - if (lp.hasIPv4Address() || lp.isProvisioned()) { + if (lp.hasIpv4Address() || lp.isProvisioned()) { return true; } if (config == null) { @@ -878,9 +878,9 @@ public class IpClient extends StateMachine { delta = PROV_CHANGE_LOST_PROVISIONING; } - final boolean lostIPv6 = oldLp.isIPv6Provisioned() && !newLp.isIPv6Provisioned(); - final boolean lostIPv4Address = oldLp.hasIPv4Address() && !newLp.hasIPv4Address(); - final boolean lostIPv6Router = oldLp.hasIPv6DefaultRoute() && !newLp.hasIPv6DefaultRoute(); + final boolean lostIPv6 = oldLp.isIpv6Provisioned() && !newLp.isIpv6Provisioned(); + final boolean lostIPv4Address = oldLp.hasIpv4Address() && !newLp.hasIpv4Address(); + final boolean lostIPv6Router = oldLp.hasIpv6DefaultRoute() && !newLp.hasIpv6DefaultRoute(); // If bad wifi avoidance is disabled, then ignore IPv6 loss of // provisioning. Otherwise, when a hotspot that loses Internet @@ -920,7 +920,7 @@ public class IpClient extends StateMachine { // If the previous link properties had a global IPv6 address and an // IPv6 default route then also consider the loss of that default route // to be a loss of provisioning. See b/27962810. - if (oldLp.hasGlobalIPv6Address() && (lostIPv6Router && !ignoreIPv6ProvisioningLoss)) { + if (oldLp.hasGlobalIpv6Address() && (lostIPv6Router && !ignoreIPv6ProvisioningLoss)) { delta = PROV_CHANGE_LOST_PROVISIONING; } @@ -1156,7 +1156,7 @@ public class IpClient extends StateMachine { private boolean applyInitialConfig(InitialConfiguration config) { // TODO: also support specifying a static IPv4 configuration in InitialConfiguration. - for (LinkAddress addr : findAll(config.ipAddresses, LinkAddress::isIPv6)) { + for (LinkAddress addr : findAll(config.ipAddresses, LinkAddress::isIpv6)) { if (!mInterfaceCtrl.addAddress(addr)) return false; } @@ -1374,7 +1374,7 @@ public class IpClient extends StateMachine { } private boolean readyToProceed() { - return (!mLinkProperties.hasIPv4Address() && !mLinkProperties.hasGlobalIPv6Address()); + return (!mLinkProperties.hasIpv4Address() && !mLinkProperties.hasGlobalIpv6Address()); } } diff --git a/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java b/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java index 76a03387a12d..e73cba626f15 100644 --- a/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java +++ b/packages/NetworkStack/src/android/net/ip/IpReachabilityMonitor.java @@ -316,8 +316,8 @@ public class IpReachabilityMonitor { } final boolean lostProvisioning = - (mLinkProperties.isIPv4Provisioned() && !whatIfLp.isIPv4Provisioned()) - || (mLinkProperties.isIPv6Provisioned() && !whatIfLp.isIPv6Provisioned()); + (mLinkProperties.isIpv4Provisioned() && !whatIfLp.isIpv4Provisioned()) + || (mLinkProperties.isIpv6Provisioned() && !whatIfLp.isIpv6Provisioned()); if (lostProvisioning) { final String logMsg = "FAILURE: LOST_PROVISIONING, " + event; diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java index df4656a6deeb..e588b3d594ca 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/DeviceConfigServiceTest.java @@ -147,7 +147,7 @@ public class DeviceConfigServiceTest { // make sValue the default value executeShellCommand( "device_config put " + sNamespace + " " + sKey + " " + sValue + " default"); - // make newValue the current value (as set by a trusted package) + // make newValue the current value (as set by a untrusted package) executeShellCommand( "device_config put " + sNamespace + " " + sKey + " " + newValue); String result = getFromContentProvider(mContentResolver, sNamespace, sKey); @@ -156,13 +156,7 @@ public class DeviceConfigServiceTest { // reset values that were set by untrusted packages executeShellCommand("device_config reset untrusted_defaults " + sNamespace); result = getFromContentProvider(mContentResolver, sNamespace, sKey); - // the current value was set by a trusted package, so it's not reset - assertEquals(newValue, result); - - // reset values that were set by untrusted or trusted packages - executeShellCommand("device_config reset trusted_defaults " + sNamespace); - result = getFromContentProvider(mContentResolver, sNamespace, sKey); - // the default value has been restored + // the current value was set by a untrusted package, so it's reset assertEquals(sValue, result); } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index f0399c569cbf..441f88c193d6 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -179,6 +179,9 @@ <!-- Permission needed to run network tests in CTS --> <uses-permission android:name="android.permission.MANAGE_TEST_NETWORKS" /> + <!-- Permission needed to run keyguard manager tests in CTS --> + <uses-permission android:name="android.permission.CONTROL_KEYGUARD_SECURE_NOTIFICATIONS" /> + <application android:label="@string/app_label" android:defaultToDeviceProtectedStorage="true" android:directBootAware="true"> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java index 2b10ccb4ac1a..3d2f570bde87 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java @@ -60,7 +60,8 @@ public interface VolumeDialogController { boolean areCaptionsEnabled(); void setCaptionsEnabled(boolean isEnabled); - void getCaptionsComponentState(); + + void getCaptionsComponentState(boolean fromTooltip); @ProvidesInterface(version = StreamState.VERSION) public static final class StreamState { @@ -190,6 +191,6 @@ public interface VolumeDialogController { void onScreenOff(); void onShowSafetyWarning(int flags); void onAccessibilityModeChanged(Boolean showA11yStream); - void onCaptionComponentStateChanged(Boolean isComponentEnabled); + void onCaptionComponentStateChanged(Boolean isComponentEnabled, Boolean fromTooltip); } } diff --git a/packages/SystemUI/res/drawable/ic_remove_no_shadow.xml b/packages/SystemUI/res/drawable/ic_remove_no_shadow.xml new file mode 100644 index 000000000000..bed06b58e823 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_remove_no_shadow.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + android:tint="?android:attr/textColorPrimary" > + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.41,12l5.29-5.29c0.39-0.39,0.39-1.02,0-1.41c-0.39-0.39-1.02-0.39-1.41,0L12,10.59L6.71, + 5.29c-0.39-0.39-1.02-0.39-1.41,0c-0.39,0.39-0.39,1.02,0,1.41L10.59,12l-5.29,5.29c-0.39,0.39-0.39,1.02, + 0,1.41c0.39,0.39,1.02,0.39,1.41,0L12,13.41l5.29,5.29c0.39,0.39,1.02,0.39,1.41,0c0.39-0.39,0.39-1.02,0-1.41L13.41,12z"/> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml b/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml index 9b907290d0e9..675aee9cd1dd 100644 --- a/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml +++ b/packages/SystemUI/res/drawable/ic_volume_odi_captions.xml @@ -19,6 +19,23 @@ android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="#FF000000" - android:pathData="M20,4C21.1,4 22,4.9 22,6L22,18C22,19.1 21.1,20 20,20L4,20C2.9,20 2,19.1 2,18L2,6C2,4.9 2.9,4 4,4L20,4ZM20,18L20,6L4,6L4,18L20,18ZM6,10L8,10L8,12L6,12L6,10ZM6,14L14,14L14,16L6,16L6,14ZM16,14L18,14L18,16L16,16L16,14ZM10,10L18,10L18,12L10,12L10,10Z"/> + android:pathData="M16,12h2v2h-2z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M6,12h8v2h-8z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M20,2C21.1046,2 22,2.8954 22,4L22,16C22,17.1046 21.1046,18 20,18L6,18L2,22L2,4C2,2.8954 2.8954,2 4,2L20,2ZM20,16L20,4L4,4L4,16L20,16Z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M6,8h2v2h-2z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M10,8h8v2h-8z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> </vector> diff --git a/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml index f3d8d3b9c2e2..e818455950de 100644 --- a/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml +++ b/packages/SystemUI/res/drawable/ic_volume_odi_captions_disabled.xml @@ -19,6 +19,19 @@ android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="#FF000000" - android:pathData="M16.9675,14L18,14L18,15.0275L16.9675,14ZM20,17.0176L20,6L8.9281,6L6.9182,4L20,4C21.1,4 22,4.9 22,6L22,18C22,18.2949 21.9353,18.5755 21.8194,18.8281L20,17.0176ZM12.9478,10L18,10L18,12L14.9576,12L12.9478,10ZM1.2823,0.8824L22.8489,22.4489L21.6337,23.6641L17.9696,20L4,20C2.9,20 2,19.1 2,18L2,6C2,5.4577 2.2188,4.964 2.5724,4.6028L0.0672,2.0975L1.2823,0.8824ZM13.9696,16L6,16L6,14L11.9696,14L8,10.0304L8,12L6,12L6,10L7.9696,10L4,6.0304L4,18L15.9696,18L13.9696,16Z"/> + android:pathData="M2.07,0.64L22,20.59L20.6,22L16.6,18L6,18L2,22L2,4C2.0006,3.8236 2.0276,3.6484 2.08,3.48L0.66,2.05L2.07,0.64ZM5.17,16L14.6,16L12.6,14L6,14L6,12L10.6,12L8,9.4L8,10L6,10L6,8L6.6,8L4,5.4L4,16L5.17,16Z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M18,12l-1.74,0l1.74,1.74z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M18,8l-5.74,0l2,2l3.74,0z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> + <path + android:pathData="M20,4L20,15.74L21.53,17.27C21.8296,16.9142 21.9958,16.4651 22,16L22,4C22,2.8954 21.1046,2 20,2L6.26,2L8.26,4L20,4Z" + android:fillColor="#1A73E8" + android:fillType="nonZero"/> </vector> diff --git a/packages/SystemUI/res/drawable/volume_tool_tip_rounded_bg.xml b/packages/SystemUI/res/drawable/volume_tool_tip_rounded_bg.xml new file mode 100644 index 000000000000..22e8c48b6e6e --- /dev/null +++ b/packages/SystemUI/res/drawable/volume_tool_tip_rounded_bg.xml @@ -0,0 +1,19 @@ +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> + <solid android:color="?android:attr/colorAccent" /> + <corners android:radius="8dp" /> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout-land/volume_dialog.xml b/packages/SystemUI/res/layout-land/volume_dialog.xml new file mode 100644 index 000000000000..c1e74ef02623 --- /dev/null +++ b/packages/SystemUI/res/layout-land/volume_dialog.xml @@ -0,0 +1,143 @@ +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/volume_dialog_container" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="right" + android:layout_gravity="right" + android:background="@android:color/transparent" + android:theme="@style/volume_dialog_theme"> + + <FrameLayout + android:id="@+id/volume_dialog" + android:minWidth="@dimen/volume_dialog_panel_width" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="right" + android:layout_gravity="right" + android:background="@android:color/transparent" + android:paddingRight="@dimen/volume_dialog_panel_transparent_padding_right" + android:paddingTop="@dimen/volume_dialog_panel_transparent_padding" + android:paddingBottom="@dimen/volume_dialog_panel_transparent_padding" + android:paddingLeft="@dimen/volume_dialog_panel_transparent_padding" + android:clipToPadding="false"> + + <FrameLayout + android:id="@+id/ringer" + android:layout_width="@dimen/volume_dialog_ringer_size" + android:layout_height="@dimen/volume_dialog_ringer_size" + android:layout_marginBottom="@dimen/volume_dialog_spacer" + android:gravity="right" + android:layout_gravity="right" + android:translationZ="@dimen/volume_dialog_elevation" + android:clipToPadding="false" + android:background="@drawable/rounded_bg_full"> + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/ringer_icon" + style="@style/VolumeButtons" + android:background="@drawable/rounded_ripple" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:tint="@color/accent_tint_color_selector" + android:layout_gravity="center" + android:soundEffectsEnabled="false" /> + + <include layout="@layout/volume_dnd_icon" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginRight="@dimen/volume_dialog_stream_padding" + android:layout_marginTop="6dp"/> + </FrameLayout> + + <LinearLayout + android:id="@+id/main" + android:layout_width="wrap_content" + android:minWidth="@dimen/volume_dialog_panel_width" + android:layout_height="wrap_content" + android:layout_marginTop="68dp" + android:gravity="right" + android:layout_gravity="right" + android:orientation="vertical" + android:translationZ="@dimen/volume_dialog_elevation" + android:clipChildren="false" + android:clipToPadding="false" + android:background="@drawable/rounded_bg_full" > + <LinearLayout + android:id="@+id/volume_dialog_rows" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="@dimen/volume_dialog_panel_width" + android:gravity="center" + android:orientation="horizontal" + android:paddingRight="@dimen/volume_dialog_stream_padding" + android:paddingLeft="@dimen/volume_dialog_stream_padding"> + <!-- volume rows added and removed here! :-) --> + </LinearLayout> + <FrameLayout + android:id="@+id/settings_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/rounded_bg_bottom_background"> + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/settings" + android:src="@drawable/ic_tune_black_16dp" + android:layout_width="@dimen/volume_dialog_tap_target_size" + android:layout_height="@dimen/volume_dialog_tap_target_size" + android:layout_gravity="center" + android:contentDescription="@string/accessibility_volume_settings" + android:background="@drawable/ripple_drawable_20dp" + android:tint="?android:attr/textColorSecondary" + android:soundEffectsEnabled="false" /> + </FrameLayout> + </LinearLayout> + + <FrameLayout + android:id="@+id/odi_captions" + android:layout_width="@dimen/volume_dialog_caption_size" + android:layout_height="@dimen/volume_dialog_caption_size" + android:layout_marginRight="68dp" + android:gravity="right" + android:layout_gravity="right" + android:clipToPadding="false" + android:translationZ="@dimen/volume_dialog_elevation" + android:background="@drawable/rounded_bg_full"> + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/odi_captions_icon" + android:src="@drawable/ic_volume_odi_captions_disabled" + style="@style/VolumeButtons" + android:background="@drawable/rounded_ripple" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:tint="@color/accent_tint_color_selector" + android:layout_gravity="center" + android:soundEffectsEnabled="false" /> + </FrameLayout> + + <ViewStub + android:id="@+id/odi_captions_tooltip_stub" + android:inflatedId="@+id/odi_captions_tooltip_view" + android:layout="@layout/volume_tool_tip_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="@dimen/volume_tool_tip_right_margin" + android:layout_marginTop="@dimen/volume_tool_tip_top_margin" + android:layout_gravity="right"/> + + </FrameLayout> + +</FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_carrier.xml b/packages/SystemUI/res/layout/qs_carrier.xml index 6edccbabb823..b94a3163804f 100644 --- a/packages/SystemUI/res/layout/qs_carrier.xml +++ b/packages/SystemUI/res/layout/qs_carrier.xml @@ -24,7 +24,8 @@ android:background="@android:color/transparent" android:clickable="false" android:clipChildren="false" - android:clipToPadding="false" > + android:clipToPadding="false" + android:focusable="true" > <include layout="@layout/mobile_signal_group" diff --git a/packages/SystemUI/res/layout/qs_carrier_group.xml b/packages/SystemUI/res/layout/qs_carrier_group.xml index 20190b7fff0d..36f382b19f4a 100644 --- a/packages/SystemUI/res/layout/qs_carrier_group.xml +++ b/packages/SystemUI/res/layout/qs_carrier_group.xml @@ -34,7 +34,8 @@ android:id="@+id/qs_carrier_divider1" android:layout_width="@dimen/qs_header_carrier_separator_width" android:layout_height="match_parent" - android:visibility="gone" /> + android:visibility="gone" + android:importantForAccessibility="no"/> <include layout="@layout/qs_carrier" @@ -47,7 +48,8 @@ android:layout_width="@dimen/qs_header_carrier_separator_width" android:layout_height="match_parent" android:layout_weight="1" - android:visibility="gone" /> + android:visibility="gone" + android:importantForAccessibility="no"/> <include layout="@layout/qs_carrier" diff --git a/packages/SystemUI/res/layout/quick_qs_status_icons.xml b/packages/SystemUI/res/layout/quick_qs_status_icons.xml index 74002ac38c02..fa74536532b8 100644 --- a/packages/SystemUI/res/layout/quick_qs_status_icons.xml +++ b/packages/SystemUI/res/layout/quick_qs_status_icons.xml @@ -26,7 +26,9 @@ android:layout_below="@id/quick_status_bar_system_icons" android:clipChildren="false" android:clipToPadding="false" - android:minHeight="20dp" > + android:minHeight="20dp" + android:clickable="false" + android:focusable="true"> <com.android.systemui.statusbar.policy.DateView android:id="@+id/date" diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 130be89914a8..1d0a24274b12 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -15,32 +15,38 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/volume_dialog_container" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="right" + android:layout_gravity="right" android:background="@android:color/transparent" - android:theme="@style/qs_theme"> + android:theme="@style/volume_dialog_theme"> + <!-- right-aligned to be physically near volume button --> <LinearLayout android:id="@+id/volume_dialog" android:minWidth="@dimen/volume_dialog_panel_width" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical|right" + android:gravity="right" + android:layout_gravity="right" android:background="@android:color/transparent" android:paddingRight="@dimen/volume_dialog_panel_transparent_padding_right" android:paddingTop="@dimen/volume_dialog_panel_transparent_padding" android:paddingBottom="@dimen/volume_dialog_panel_transparent_padding" android:paddingLeft="@dimen/volume_dialog_panel_transparent_padding" android:orientation="vertical" - android:clipToPadding="false" > + android:clipToPadding="false"> <FrameLayout android:id="@+id/ringer" android:layout_width="@dimen/volume_dialog_ringer_size" android:layout_height="@dimen/volume_dialog_ringer_size" android:layout_marginBottom="@dimen/volume_dialog_spacer" - android:translationZ="@dimen/volume_dialog_elevation" + android:gravity="right" android:layout_gravity="right" + android:translationZ="@dimen/volume_dialog_elevation" android:clipToPadding="false" android:background="@drawable/rounded_bg_full"> <com.android.keyguard.AlphaOptimizedImageButton @@ -62,11 +68,14 @@ <LinearLayout android:id="@+id/main" - android:layout_width="wrap_content" android:minWidth="@dimen/volume_dialog_panel_width" + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="right" + android:layout_gravity="right" android:orientation="vertical" android:translationZ="@dimen/volume_dialog_elevation" + android:clipChildren="false" android:clipToPadding="false" android:background="@drawable/rounded_bg_full" > <LinearLayout @@ -103,10 +112,10 @@ android:layout_width="@dimen/volume_dialog_caption_size" android:layout_height="@dimen/volume_dialog_caption_size" android:layout_marginTop="@dimen/volume_dialog_spacer" - android:translationZ="@dimen/volume_dialog_elevation" + android:gravity="right" android:layout_gravity="right" android:clipToPadding="false" - android:visibility="gone" + android:translationZ="@dimen/volume_dialog_elevation" android:background="@drawable/rounded_bg_full"> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/odi_captions_icon" @@ -121,4 +130,15 @@ </FrameLayout> </LinearLayout> + + <ViewStub + android:id="@+id/odi_captions_tooltip_stub" + android:inflatedId="@+id/odi_captions_tooltip_view" + android:layout="@layout/volume_tool_tip_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom | right" + android:layout_marginRight="@dimen/volume_tool_tip_right_margin" + android:layout_marginBottom="@dimen/volume_tool_tip_bottom_margin"/> + </FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index 6128da8627a9..b9efc5be70c1 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -20,7 +20,7 @@ android:layout_width="@dimen/volume_dialog_panel_width" android:clipChildren="false" android:clipToPadding="false" - android:theme="@style/qs_theme"> + android:theme="@style/volume_dialog_theme"> <LinearLayout android:layout_height="wrap_content" diff --git a/packages/SystemUI/res/layout/volume_tool_tip_view.xml b/packages/SystemUI/res/layout/volume_tool_tip_view.xml new file mode 100644 index 000000000000..9fe885ebefc7 --- /dev/null +++ b/packages/SystemUI/res/layout/volume_tool_tip_view.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<com.android.systemui.volume.VolumeToolTipView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/tooltip_view" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:orientation="horizontal"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingStart="16dp" + android:paddingEnd="4dp" + android:background="@drawable/volume_tool_tip_rounded_bg" + android:orientation="horizontal"> + + <TextView + android:id="@+id/text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:textColor="@android:color/white" + android:text="@string/volume_odi_captions_tip" + android:textSize="14sp"/> + <ImageView + android:id="@+id/dismiss" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_gravity="center_vertical" + android:padding="12dp" + android:layout_marginStart="2dp" + android:layout_marginEnd="2dp" + android:alpha="0.7" + android:src="@drawable/ic_remove_no_shadow" + android:tint="@android:color/white" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/accessibility_volume_close_odi_captions_tip"/> + </LinearLayout> + + <View + android:id="@+id/arrow" + android:layout_width="8dp" + android:layout_height="10dp" + android:layout_marginLeft="-2dp" + android:layout_gravity="center_vertical"/> + +</com.android.systemui.volume.VolumeToolTipView>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml index bb0c6f6acb06..77e79c96b6a7 100644 --- a/packages/SystemUI/res/values-land/dimens.xml +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -34,4 +34,7 @@ <bool name="quick_settings_wide">true</bool> <dimen name="qs_detail_margin_top">0dp</dimen> <dimen name="qs_paged_tile_layout_padding_bottom">0dp</dimen> + + <dimen name="volume_tool_tip_right_margin">136dp</dimen> + <dimen name="volume_tool_tip_top_margin">12dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 30cbaaad33df..27cebcc112ac 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -351,6 +351,12 @@ <dimen name="volume_dialog_elevation">9dp</dimen> + <dimen name="volume_tool_tip_right_margin">76dp</dimen> + + <dimen name="volume_tool_tip_bottom_margin">32dp</dimen> + + <dimen name="volume_tool_tip_arrow_corner_radius">2dp</dimen> + <!-- Gravity for the notification panel --> <integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top --> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index c6c2763f7801..f8bec4a309b8 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -447,6 +447,9 @@ <!-- Content description of the cell data being disabled. [CHAR LIMIT=NONE] --> <string name="cell_data_off_content_description">Mobile data off</string> + <!-- Content description of the cell data for not default subscription. [CHAR LIMIT=NONE] --> + <string name="not_default_data_content_description">Not set to use data</string> + <!-- Content description of the cell data being disabled but shortened. [CHAR LIMIT=20] --> <string name="cell_data_off">Off</string> @@ -1069,10 +1072,10 @@ <string name="battery_saver_notification_action_text">Turn off Battery Saver</string> <!-- Media projection permission dialog warning text. [CHAR LIMIT=NONE] --> - <string name="media_projection_dialog_text"><xliff:g id="app_seeking_permission" example="Hangouts">%s</xliff:g> will start capturing the played audio and everything on your screen including notifications, passwords, photos, messages and payment information.</string> + <string name="media_projection_dialog_text">While recording or casting, <xliff:g id="app_seeking_permission" example="Hangouts">%s</xliff:g> can capture any sensitive information, such as audio that you play and your passwords, payment info, photos, and messages.</string> <!-- Media projection permission dialog warning title. [CHAR LIMIT=NONE] --> - <string name="media_projection_dialog_title">Allow <xliff:g id="app_seeking_permission" example="Hangouts">%s</xliff:g> to record or cast your screen and played audio?</string> + <string name="media_projection_dialog_title">Exposing sensitive info during casting/recording </string> <!-- Media projection permission dialog permanent grant check box. [CHAR LIMIT=NONE] --> <string name="media_projection_remember_text">Don\'t show again</string> @@ -1307,6 +1310,12 @@ <!-- Content description for accessibility (not shown on the screen): volume dialog collapse button. [CHAR LIMIT=NONE] --> <string name="accessibility_volume_collapse">Collapse</string> + <!-- Label for the odi caption initial tool tip. [CHAR LIMIT=28] --> + <string name="volume_odi_captions_tip">Automatically caption media</string> + + <!-- Content description for accessibility: Clear the odi caption tool tip. [CHAR LIMIT=NONE] --> + <string name="accessibility_volume_close_odi_captions_tip">Close captions tip</string> + <!-- content description for audio output chooser [CHAR LIMIT=NONE]--> <string name="accessibility_output_chooser">Switch output device</string> @@ -2370,12 +2379,29 @@ <string name="bubbles_deep_link_button_description">Open <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string> <!-- Text used for content description of settings button in the header of expanded bubble view. [CHAR_LIMIT=NONE] --> - <string name="bubbles_settings_button_description">Open notification settings for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string> + <string name="bubbles_settings_button_description">Settings for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g> bubbles</string> <!-- Text for asking the user whether bubbles (floating app content) should be enabled for an app. [CHAR LIMIT=NONE] --> - <string name="bubbles_prompt">Allow bubbles from this app?</string> + <string name="bubbles_prompt">Allow bubbles from <xliff:g id="app_name" example="YouTube">%1$s</xliff:g>?</string> <!-- Text used for button allowing user to opt out of bubbles [CHAR LIMIT=20] --> - <string name="no_bubbles">Block</string> + <string name="no_bubbles">Deny</string> <!-- Text used for button allowing user to approve / enable bubbles [CHAR LIMIT=20] --> <string name="yes_bubbles">Allow</string> + <!-- Text used for the button allowing users to postpone their decision to allow or deny bubbles [CHAR LIMIT=40] --> + <string name="ask_me_later_bubbles">Ask me later</string> + <!-- Content description when a bubble is focused. [CHAR LIMIT=NONE] --> + <string name="bubble_content_description_single"><xliff:g id="notification_title" example="some title">%1$s</xliff:g> from <xliff:g id="app_name" example="YouTube">%2$s</xliff:g></string> + <!-- Content description when the stack of bubbles is focused. [CHAR LIMIT=NONE] --> + <string name="bubble_content_description_stack"><xliff:g id="notification_title" example="some title">%1$s</xliff:g> from <xliff:g id="app_name" example="YouTube">%2$s</xliff:g> and <xliff:g id="bubble_count" example="4">%3$d</xliff:g> more</string> + <!-- Action in accessibility menu to move the stack of bubbles [CHAR LIMIT=20] --> + <string name="bubble_accessibility_action_move">Move</string> + <!-- Action in accessibility menu to move the stack of bubbles to the top left of the screen. [CHAR LIMIT=30] --> + <string name="bubble_accessibility_action_move_top_left">Move top left</string> + <!-- Action in accessibility menu to move the stack of bubbles to the top right of the screen. [CHAR LIMIT=30] --> + <string name="bubble_accessibility_action_move_top_right">Move top right</string> + <!-- Action in accessibility menu to move the stack of bubbles to the bottom left of the screen. [CHAR LIMIT=30]--> + <string name="bubble_accessibility_action_move_bottom_left">Move bottom left</string> + <!-- Action in accessibility menu to move the stack of bubbles to the bottom right of the screen. [CHAR LIMIT=30]--> + <string name="bubble_accessibility_action_move_bottom_right">Move bottom right</string> + </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 0f5df45a0eff..1c13750a1340 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -319,6 +319,10 @@ <item name="android:windowIsFloating">true</item> </style> + <style name="volume_dialog_theme" parent="qs_theme"> + <item name="android:windowIsFloating">false</item> + </style> + <style name="systemui_theme_remote_input" parent="@android:style/Theme.DeviceDefault.Light"> <item name="android:colorAccent">@color/remote_input_accent</item> </style> diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 0113d0560764..ed2a6b59d153 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -19,9 +19,7 @@ package com.android.systemui; import android.content.Context; import android.graphics.Rect; import android.opengl.GLSurfaceView; -import android.os.Build; import android.service.wallpaper.WallpaperService; -import android.util.Log; import android.view.SurfaceHolder; import com.android.systemui.glwallpaper.ImageWallpaperRenderer; @@ -34,15 +32,7 @@ public class ImageWallpaper extends WallpaperService { private static final String TAG = ImageWallpaper.class.getSimpleName(); @Override - public void onCreate() { - super.onCreate(); - } - - @Override public Engine onCreateEngine() { - if (Build.IS_DEBUGGABLE) { - Log.v(TAG, "We are using GLEngine"); - } return new GLEngine(this); } @@ -72,8 +62,15 @@ public class ImageWallpaper extends WallpaperService { } } + @Override + public void onDestroy() { + if (mWallpaperSurfaceView != null) { + mWallpaperSurfaceView.onPause(); + } + } + private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView { - private WallpaperStatusListener mWallpaperChangedListener; + private WallpaperStatusListener mWallpaperStatusListener; GLWallpaperSurfaceView(Context context) { super(context); @@ -88,18 +85,18 @@ public class ImageWallpaper extends WallpaperService { @Override public void setRenderer(Renderer renderer) { super.setRenderer(renderer); - mWallpaperChangedListener = (WallpaperStatusListener) renderer; + mWallpaperStatusListener = (WallpaperStatusListener) renderer; } private void notifyAmbientModeChanged(boolean inAmbient, long duration) { - if (mWallpaperChangedListener != null) { - mWallpaperChangedListener.onAmbientModeChanged(inAmbient, duration); + if (mWallpaperStatusListener != null) { + mWallpaperStatusListener.onAmbientModeChanged(inAmbient, duration); } } private void notifyOffsetsChanged(float xOffset, float yOffset) { - if (mWallpaperChangedListener != null) { - mWallpaperChangedListener.onOffsetsChanged( + if (mWallpaperStatusListener != null) { + mWallpaperStatusListener.onOffsetsChanged( xOffset, yOffset, getHolder().getSurfaceFrame()); } } diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index d437555c62a4..27975707bd8d 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -57,7 +57,8 @@ public final class Prefs { Key.SEEN_RINGER_GUIDANCE_COUNT, Key.QS_HAS_TURNED_OFF_MOBILE_DATA, Key.TOUCHED_RINGER_TOGGLE, - Key.QUICK_STEP_INTERACTION_FLAGS + Key.QUICK_STEP_INTERACTION_FLAGS, + Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP }) public @interface Key { @Deprecated @@ -103,6 +104,7 @@ public final class Prefs { String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData"; String TOUCHED_RINGER_TOGGLE = "TouchedRingerToggle"; String QUICK_STEP_INTERACTION_FLAGS = "QuickStepInteractionFlags"; + String HAS_SEEN_ODI_CAPTIONS_TOOLTIP = "HasSeenODICaptionsTooltip"; } public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 49beae6872fd..14e910f41cab 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -410,6 +410,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList mPermissionView.setVisibility(VISIBLE); ((ImageView) mPermissionView.findViewById(R.id.pkgicon)).setImageDrawable(mAppIcon); ((TextView) mPermissionView.findViewById(R.id.pkgname)).setText(mAppName); + ((TextView) mPermissionView.findViewById(R.id.prompt)).setText( + getResources().getString(R.string.bubbles_prompt, mAppName)); logBubbleClickEvent(mEntry.notification, StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_DIALOG_SHOWN); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java index b409a3181e2b..7a68be494cf9 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java @@ -193,11 +193,19 @@ public class BubbleView extends FrameLayout { if (mEntry == null) { return; } + Notification.BubbleMetadata metadata = mEntry.getBubbleMetadata(); Notification n = mEntry.notification.getNotification(); - boolean isLarge = n.getLargeIcon() != null; - Icon ic = isLarge ? n.getLargeIcon() : n.getSmallIcon(); + Icon ic; + boolean needsTint; + if (metadata != null) { + ic = metadata.getIcon(); + needsTint = ic.getType() != Icon.TYPE_ADAPTIVE_BITMAP; + } else { + needsTint = n.getLargeIcon() == null; + ic = needsTint ? n.getSmallIcon() : n.getLargeIcon(); + } Drawable iconDrawable = ic.loadDrawable(mContext); - if (!isLarge) { + if (needsTint) { // Center icon on coloured background iconDrawable.setTint(Color.WHITE); // TODO: dark mode Drawable bg = new ColorDrawable(n.color); diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java index a313336e3d71..21406e57ad7b 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java @@ -110,9 +110,10 @@ class ImageGLWallpaper { mTextureBuffer.position(0); } - void setup() { + void setup(Bitmap bitmap) { setupAttributes(); setupUniforms(); + setupTexture(bitmap); } private void setupAttributes() { @@ -159,7 +160,7 @@ class ImageGLWallpaper { glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2); } - void setupTexture(Bitmap bitmap) { + private void setupTexture(Bitmap bitmap) { final int[] tids = new int[1]; if (bitmap == null) { @@ -174,7 +175,7 @@ class ImageGLWallpaper { return; } - // Bind a named texture to a texturing target. + // Bind a named texture to a target. glBindTexture(GL_TEXTURE_2D, tids[0]); // Load the bitmap data and copy it over into the texture object that is currently bound. GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0); @@ -195,15 +196,8 @@ class ImageGLWallpaper { glUniform1i(mUniTexture, 0); } - void adjustTextureCoordinates(Bitmap bitmap, int surfaceWidth, int surfaceHeight, - float xOffset, float yOffset) { - if (bitmap == null) { - Log.d(TAG, "adjustTextureCoordinates: invalid bitmap"); - return; - } - - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); + void adjustTextureCoordinates(int bitmapWidth, int bitmapHeight, + int surfaceWidth, int surfaceHeight, float xOffset, float yOffset) { float ratioW = 1f; float ratioH = 1f; float rX = 0f; diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java index 9df6ba5b1193..464cbe33c5f0 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -58,6 +58,10 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, private int mWidth = 0; private int mHeight = 0; + private Bitmap mBitmap; + private int mBitmapWidth = 0; + private int mBitmapHeight = 0; + public ImageWallpaperRenderer(Context context, ImageGLView glView) { mWallpaperManager = context.getSystemService(WallpaperManager.class); if (mWallpaperManager == null) { @@ -71,8 +75,12 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, mGLView = glView; if (mWallpaperManager != null) { + mBitmap = mWallpaperManager.getBitmap(); + mBitmapWidth = mBitmap.getWidth(); + mBitmapHeight = mBitmap.getHeight(); // Compute per85 as transition threshold, this is an async work. - mImageProcessHelper.startComputingPercentile85(mWallpaperManager.getBitmap()); + mImageProcessHelper.startComputingPercentile85(mBitmap); + mWallpaperManager.forgetLoadedWallpaper(); } } @@ -81,8 +89,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, glClearColor(0f, 0f, 0f, 1.0f); mProgram.useGLProgram( R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader); - mWallpaper.setup(); - mWallpaper.setupTexture(mWallpaperManager.getBitmap()); + mWallpaper.setup(mBitmap); + mBitmap = null; } @Override @@ -94,8 +102,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, } mWidth = width; mHeight = height; - mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(), - width, height, mXOffset, mYOffset); + mWallpaper.adjustTextureCoordinates( + mBitmapWidth, mBitmapHeight, width, height, mXOffset, mYOffset); } @Override @@ -132,13 +140,7 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, @Override public void onOffsetsChanged(float xOffset, float yOffset, Rect frame) { - if (frame == null || mWallpaperManager == null - || (xOffset == mXOffset && yOffset == mYOffset)) { - return; - } - - Bitmap bitmap = mWallpaperManager.getBitmap(); - if (bitmap == null) { + if (frame == null || (xOffset == mXOffset && yOffset == mYOffset)) { return; } @@ -151,7 +153,8 @@ public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, Log.d(TAG, "onOffsetsChanged: width=" + width + ", height=" + height + ", xOffset=" + mXOffset + ", yOffset=" + mYOffset); } - mWallpaper.adjustTextureCoordinates(bitmap, width, height, mXOffset, mYOffset); + mWallpaper.adjustTextureCoordinates( + mBitmapWidth, mBitmapHeight, width, height, mXOffset, mYOffset); requestRender(); } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt deleted file mode 100644 index cf170187cdaa..000000000000 --- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package com.android.systemui.privacy - -import android.app.AlertDialog -import android.app.Dialog -import android.content.Context -import android.content.DialogInterface -import android.content.Intent -import android.content.pm.PackageManager -import android.content.res.ColorStateList -import android.os.UserHandle -import android.provider.Settings -import android.util.IconDrawableFactory -import android.util.StatsLog -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import com.android.systemui.Dependency -import com.android.systemui.R -import com.android.systemui.plugins.ActivityStarter -import java.util.concurrent.TimeUnit - -class OngoingPrivacyDialog constructor( - private val context: Context, - private val dialogBuilder: PrivacyDialogBuilder -) { - - private val iconSize = context.resources.getDimensionPixelSize( - R.dimen.ongoing_appops_dialog_icon_size) - private val iconColor = context.resources.getColor( - com.android.internal.R.color.text_color_primary, context.theme) - private val iconMargin = context.resources.getDimensionPixelSize( - R.dimen.ongoing_appops_dialog_icon_margin) - private val iconFactory = IconDrawableFactory.newInstance(context, true) - private var dismissDialog: (() -> Unit)? = null - private val appsAndTypes = dialogBuilder.appsAndTypes - .sortedWith(compareBy({ -it.second.size }, // Sort by number of AppOps - { it.second.min() }, - { it.first })) - - fun createDialog(): Dialog { - val builder = AlertDialog.Builder(context).apply { - setPositiveButton(R.string.ongoing_privacy_dialog_ok, - object : DialogInterface.OnClickListener { - override fun onClick(dialog: DialogInterface?, which: Int) { - StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, - StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_DISMISS) - } - }) - setNeutralButton(R.string.ongoing_privacy_dialog_open_settings, - object : DialogInterface.OnClickListener { - val intent = Intent(Settings.ACTION_PRIVACY_SETTINGS).putExtra( - Intent.EXTRA_DURATION_MILLIS, TimeUnit.MINUTES.toMillis(1)) - - @Suppress("DEPRECATION") - override fun onClick(dialog: DialogInterface?, which: Int) { - StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog - .PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_PRIVACY_SETTINGS) - Dependency.get(ActivityStarter::class.java) - .postStartActivityDismissingKeyguard(intent, 0) - } - }) - } - builder.setView(getContentView()) - val dialog = builder.create() - dismissDialog = dialog::dismiss - return dialog - } - - fun getContentView(): View { - val layoutInflater = LayoutInflater.from(context) - val contentView = layoutInflater.inflate(R.layout.ongoing_privacy_dialog_content, null) - - val title = contentView.findViewById(R.id.title) as TextView - val appsList = contentView.findViewById(R.id.items_container) as LinearLayout - - title.setText(dialogBuilder.getDialogTitle()) - - val numItems = appsAndTypes.size - for (i in 0..(numItems - 1)) { - val item = appsAndTypes[i] - addAppItem(appsList, item.first, item.second, dialogBuilder.types.size > 1) - } - return contentView - } - - @Suppress("DEPRECATION") - private fun addAppItem( - itemList: LinearLayout, - app: PrivacyApplication, - types: List<PrivacyType>, - showIcons: Boolean = true - ) { - val layoutInflater = LayoutInflater.from(context) - val item = layoutInflater.inflate(R.layout.ongoing_privacy_dialog_item, itemList, false) - val appIcon = item.findViewById(R.id.app_icon) as ImageView - val appName = item.findViewById(R.id.app_name) as TextView - val icons = item.findViewById(R.id.icons) as LinearLayout - - val lp = LinearLayout.LayoutParams(iconSize, iconSize).apply { - gravity = Gravity.CENTER_VERTICAL - marginStart = iconMargin - } - - app.icon.let { - appIcon.setImageDrawable(iconFactory.getShadowedIcon(it)) - } - - appName.text = app.applicationName - if (showIcons) { - dialogBuilder.generateIconsForApp(types).forEachIndexed { index, it -> - it.setBounds(0, 0, iconSize, iconSize) - val image = ImageView(context).apply { - imageTintList = ColorStateList.valueOf(iconColor) - setImageDrawable(it) - } - image.contentDescription = types[index].getName(context) - icons.addView(image, lp) - } - icons.visibility = View.VISIBLE - } else { - icons.visibility = View.GONE - } - try { - // Check if package exists - context.packageManager.getPackageInfo(app.packageName, 0) - item.setOnClickListener(object : View.OnClickListener { - val intent = Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS) - .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName) - .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid)) - override fun onClick(v: View?) { - StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, - StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__DIALOG_LINE_ITEM, - app.packageName) - Dependency.get(ActivityStarter::class.java) - .postStartActivityDismissingKeyguard(intent, 0) - dismissDialog?.invoke() - } - }) - } catch (e: PackageManager.NameNotFoundException) {} - - itemList.addView(item) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java index 3ff30c527f39..f19445c1f33b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java @@ -89,16 +89,22 @@ public class QSCarrier extends LinearLayout { .append(", "); } // TODO: show mobile data off/no internet text for 5 seconds before carrier text - if (TextUtils.equals(state.typeContentDescription, - mContext.getString(R.string.data_connection_no_internet)) - || TextUtils.equals(state.typeContentDescription, - mContext.getString(R.string.cell_data_off_content_description))) { + if (hasValidTypeContentDescription(state.typeContentDescription)) { contentDescription.append(state.typeContentDescription); } mMobileSignal.setContentDescription(contentDescription); } } + private boolean hasValidTypeContentDescription(String typeContentDescription) { + return TextUtils.equals(typeContentDescription, + mContext.getString(R.string.data_connection_no_internet)) + || TextUtils.equals(typeContentDescription, + mContext.getString(R.string.cell_data_off_content_description)) + || TextUtils.equals(typeContentDescription, + mContext.getString(R.string.not_default_data_content_description)); + } + public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 4862b9eddc85..c897b9c3b467 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -23,7 +23,6 @@ import android.animation.AnimatorListenerAdapter; import android.annotation.ColorInt; import android.app.ActivityManager; import android.app.AlarmManager; -import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -62,7 +61,6 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.privacy.OngoingPrivacyChip; -import com.android.systemui.privacy.OngoingPrivacyDialog; import com.android.systemui.privacy.PrivacyDialogBuilder; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; @@ -71,7 +69,6 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.phone.StatusIconContainer; -import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.DateView; import com.android.systemui.statusbar.policy.NextAlarmController; @@ -561,11 +558,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_CLICKED); mUiHandler.post(() -> { - Dialog mDialog = new OngoingPrivacyDialog(mContext, builder).createDialog(); - SystemUIDialog.setShowForAllUsers(mDialog, false); - SystemUIDialog.registerDismissListener(mDialog); - SystemUIDialog.setWindowOnTop(mDialog); - mActivityStarter.postQSRunnableDismissingKeyguard(() -> mDialog.show()); + mActivityStarter.postStartActivityDismissingKeyguard( + new Intent(Intent.ACTION_REVIEW_ONGOING_PERMISSION_USAGE), 0); mHost.collapsePanels(); }); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java index ef4e19559f1f..de8e6ea4a0cb 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java +++ b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java @@ -50,6 +50,24 @@ public class TriangleShape extends PathShape { return new TriangleShape(triangularPath, width, height); } + /** Create an arrow TriangleShape that points to the left or the right */ + public static TriangleShape createHorizontal( + float width, float height, boolean isPointingLeft) { + Path triangularPath = new Path(); + if (isPointingLeft) { + triangularPath.moveTo(0, height / 2); + triangularPath.lineTo(width, height); + triangularPath.lineTo(width, 0); + triangularPath.close(); + } else { + triangularPath.moveTo(0, height); + triangularPath.lineTo(width, height / 2); + triangularPath.lineTo(0, 0); + triangularPath.close(); + } + return new TriangleShape(triangularPath, width, height); + } + @Override public void getOutline(@NonNull Outline outline) { outline.setConvexPath(mTriangularPath); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index b4dd1144e761..09f513dc1579 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -679,16 +679,25 @@ public class NotificationContentInflater { if (runningInflations.isEmpty()) { if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) { if (result.inflatedContentView != null) { + // New view case privateLayout.setContractedChild(result.inflatedContentView); + cachedContentViews.put(FLAG_CONTENT_VIEW_CONTRACTED, result.newContentView); + } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_CONTRACTED) != null) { + // Reinflation case. Only update if it's still cached (i.e. view has not been + // freed while inflating). + cachedContentViews.put(FLAG_CONTENT_VIEW_CONTRACTED, result.newContentView); } - cachedContentViews.put(FLAG_CONTENT_VIEW_CONTRACTED, result.newContentView); } if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0) { if (result.inflatedExpandedView != null) { privateLayout.setExpandedChild(result.inflatedExpandedView); + cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, result.newExpandedView); } else if (result.newExpandedView == null) { privateLayout.setExpandedChild(null); + cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, null); + } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_EXPANDED) != null) { + cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, result.newExpandedView); } if (result.newExpandedView != null) { privateLayout.setExpandedInflatedSmartReplies( @@ -696,15 +705,18 @@ public class NotificationContentInflater { } else { privateLayout.setExpandedInflatedSmartReplies(null); } - cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, result.newExpandedView); row.setExpandable(result.newExpandedView != null); } if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0) { if (result.inflatedHeadsUpView != null) { privateLayout.setHeadsUpChild(result.inflatedHeadsUpView); + cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, result.newHeadsUpView); } else if (result.newHeadsUpView == null) { privateLayout.setHeadsUpChild(null); + cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, null); + } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_HEADS_UP) != null) { + cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, result.newHeadsUpView); } if (result.newHeadsUpView != null) { privateLayout.setHeadsUpInflatedSmartReplies( @@ -712,14 +724,15 @@ public class NotificationContentInflater { } else { privateLayout.setHeadsUpInflatedSmartReplies(null); } - cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, result.newHeadsUpView); } if ((reInflateFlags & FLAG_CONTENT_VIEW_PUBLIC) != 0) { if (result.inflatedPublicView != null) { publicLayout.setContractedChild(result.inflatedPublicView); + cachedContentViews.put(FLAG_CONTENT_VIEW_PUBLIC, result.newPublicView); + } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_PUBLIC) != null) { + cachedContentViews.put(FLAG_CONTENT_VIEW_PUBLIC, result.newPublicView); } - cachedContentViews.put(FLAG_CONTENT_VIEW_PUBLIC, result.newPublicView); } if ((reInflateFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { @@ -730,8 +743,10 @@ public class NotificationContentInflater { ? publicLayout : privateLayout; newParent.setAmbientChild(result.inflatedAmbientView); otherParent.setAmbientChild(null); + cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); + } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_AMBIENT) != null) { + cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); } - cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); } entry.headsUpStatusBarText = result.headsUpStatusBarText; entry.headsUpStatusBarTextPublic = result.headsUpStatusBarTextPublic; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index c8f389e4ccbe..5bd394fb7187 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -256,7 +256,8 @@ public class MobileSignalController extends SignalController< level++; } boolean dataDisabled = mCurrentState.userSetup - && mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED; + && (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + || mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA); boolean noInternet = mCurrentState.inetCondition == 0; boolean cutOut = dataDisabled || noInternet; return SignalDrawable.getState(level, getNumLevels(), cutOut); @@ -285,7 +286,8 @@ public class MobileSignalController extends SignalController< if (mCurrentState.inetCondition == 0) { dataContentDescription = mContext.getString(R.string.data_connection_no_internet); } - final boolean dataDisabled = mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + final boolean dataDisabled = (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + || mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA) && mCurrentState.userSetup; // Show icon in QS when we are connected or data is disabled. @@ -456,7 +458,12 @@ public class MobileSignalController extends SignalController< if (isCarrierNetworkChangeActive()) { mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE; } else if (isDataDisabled() && !mConfig.alwaysShowDataRatIcon) { - mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; + if (mSubscriptionInfo.getSubscriptionId() + != mDefaults.getDefaultDataSubId()) { + mCurrentState.iconGroup = TelephonyIcons.NOT_DEFAULT_DATA; + } else { + mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; + } } if (isEmergencyOnly() != mCurrentState.isEmergency) { mCurrentState.isEmergency = isEmergencyOnly(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index f4d623770c57..ef39912b6578 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -987,6 +987,7 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("lte") ? TelephonyIcons.LTE : datatype.equals("lte+") ? TelephonyIcons.LTE_PLUS : datatype.equals("dis") ? TelephonyIcons.DATA_DISABLED : + datatype.equals("not") ? TelephonyIcons.NOT_DEFAULT_DATA : TelephonyIcons.UNKNOWN; } if (args.containsKey("roam")) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index 7347f66de8ce..e151ca3e23f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -245,6 +245,22 @@ class TelephonyIcons { 0, false); + static final MobileIconGroup NOT_DEFAULT_DATA = new MobileIconGroup( + "NotDefaultData", + null, + null, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, + 0, 0, + 0, + 0, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], + R.string.not_default_data_content_description, + 0, + false); + + // When adding a new MobileIconGround, check if the dataContentDescription has to be filtered + // in QSCarrier#hasValidTypeContentDescription + /** Mapping icon name(lower case) to the icon object. */ static final Map<String, MobileIconGroup> ICON_NAME_TO_ICON; static { @@ -265,6 +281,7 @@ class TelephonyIcons { ICON_NAME_TO_ICON.put("5g", NR_5G); ICON_NAME_TO_ICON.put("5g_plus", NR_5G_PLUS); ICON_NAME_TO_ICON.put("datadisable", DATA_DISABLED); + ICON_NAME_TO_ICON.put("notdefaultdata", NOT_DEFAULT_DATA); } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java index 6e740b8536b3..2a84c5d4d44d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/Events.java +++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java @@ -56,6 +56,7 @@ public class Events { public static final int EVENT_SHOW_USB_OVERHEAT_ALARM = 19; // (reason|int) (keyguard|bool) public static final int EVENT_DISMISS_USB_OVERHEAT_ALARM = 20; // (reason|int) (keyguard|bool) public static final int EVENT_ODI_CAPTIONS_CLICK = 21; + public static final int EVENT_ODI_CAPTIONS_TOOLTIP_CLICK = 22; private static final String[] EVENT_TAGS = { "show_dialog", @@ -79,7 +80,8 @@ public class Events { "ringer_toggle", "show_usb_overheat_alarm", "dismiss_usb_overheat_alarm", - "odi_captions_click" + "odi_captions_click", + "odi_captions_tooltip_click" }; public static final int DISMISS_REASON_UNKNOWN = 0; diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 9192a25dcd3b..2fa8889a02f9 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -282,9 +282,9 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa Settings.Secure.ODI_CAPTIONS_ENABLED, isEnabled ? 1 : 0); } - public void getCaptionsComponentState() { + public void getCaptionsComponentState(boolean fromTooltip) { if (mDestroyed) return; - mWorker.sendEmptyMessage(W.GET_CAPTIONS_COMPONENT_STATE); + mWorker.obtainMessage(W.GET_CAPTIONS_COMPONENT_STATE, fromTooltip).sendToTarget(); } public void notifyVisible(boolean visible) { @@ -382,13 +382,13 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } } - private void onGetCaptionsComponentStateW() { + private void onGetCaptionsComponentStateW(boolean fromTooltip) { try { String componentNameString = mContext.getString( com.android.internal.R.string.config_defaultSystemCaptionsService); if (TextUtils.isEmpty(componentNameString)) { // component doesn't exist - mCallbacks.onCaptionComponentStateChanged(false); + mCallbacks.onCaptionComponentStateChanged(false, fromTooltip); return; } @@ -399,18 +399,18 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa ComponentName componentName = ComponentName.unflattenFromString(componentNameString); if (componentName == null) { - mCallbacks.onCaptionComponentStateChanged(false); + mCallbacks.onCaptionComponentStateChanged(false, fromTooltip); return; } PackageManager packageManager = mContext.getPackageManager(); mCallbacks.onCaptionComponentStateChanged( packageManager.getComponentEnabledSetting(componentName) - == PackageManager.COMPONENT_ENABLED_STATE_ENABLED); + == PackageManager.COMPONENT_ENABLED_STATE_ENABLED, fromTooltip); } catch (Exception ex) { Log.e(TAG, "isCaptionsServiceEnabled failed to check for captions component", ex); - mCallbacks.onCaptionComponentStateChanged(false); + mCallbacks.onCaptionComponentStateChanged(false, fromTooltip); } } @@ -790,7 +790,8 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa case NOTIFY_VISIBLE: onNotifyVisibleW(msg.arg1 != 0); break; case USER_ACTIVITY: onUserActivityW(); break; case SHOW_SAFETY_WARNING: onShowSafetyWarningW(msg.arg1); break; - case GET_CAPTIONS_COMPONENT_STATE: onGetCaptionsComponentStateW(); break; + case GET_CAPTIONS_COMPONENT_STATE: + onGetCaptionsComponentStateW((Boolean) msg.obj); break; case ACCESSIBILITY_MODE_CHANGED: onAccessibilityModeChanged((Boolean) msg.obj); } } @@ -933,11 +934,13 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } @Override - public void onCaptionComponentStateChanged(Boolean isComponentEnabled) { + public void onCaptionComponentStateChanged( + Boolean isComponentEnabled, Boolean fromTooltip) { boolean componentEnabled = isComponentEnabled == null ? false : isComponentEnabled; for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { entry.getValue().post( - () -> entry.getKey().onCaptionComponentStateChanged(componentEnabled)); + () -> entry.getKey().onCaptionComponentStateChanged( + componentEnabled, fromTooltip)); } } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 398b30963da7..cdda216c5220 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -28,6 +28,7 @@ import static android.media.AudioManager.STREAM_VOICE_CALL; import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static com.android.systemui.volume.Events.DISMISS_REASON_ODI_CAPTIONS_CLICKED; import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED; @@ -64,11 +65,13 @@ import android.util.Log; import android.util.Slog; import android.util.SparseBooleanArray; import android.view.ContextThemeWrapper; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.AccessibilityDelegate; import android.view.ViewGroup; import android.view.ViewPropertyAnimator; +import android.view.ViewStub; import android.view.Window; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; @@ -113,7 +116,10 @@ public class VolumeDialogImpl implements VolumeDialog { static final int DIALOG_TIMEOUT_MILLIS = 3000; static final int DIALOG_SAFETYWARNING_TIMEOUT_MILLIS = 5000; + static final int DIALOG_ODI_CAPTIONS_TOOLTIP_TIMEOUT_MILLIS = 5000; static final int DIALOG_HOVERING_TIMEOUT_MILLIS = 16000; + static final int DIALOG_SHOW_ANIMATION_DURATION = 300; + static final int DIALOG_HIDE_ANIMATION_DURATION = 250; private final Context mContext; private final H mHandler = new H(); @@ -152,15 +158,21 @@ public class VolumeDialogImpl implements VolumeDialog { private boolean mHovering = false; private boolean mShowActiveStreamOnly; private boolean mConfigChanged = false; + private boolean mHasSeenODICaptionsTooltip; + private ViewStub mODICaptionsTooltipViewStub; + private View mODICaptionsTooltipView = null; public VolumeDialogImpl(Context context) { - mContext = new ContextThemeWrapper(context, com.android.systemui.R.style.qs_theme); + mContext = + new ContextThemeWrapper(context, com.android.systemui.R.style.volume_dialog_theme); mController = Dependency.get(VolumeDialogController.class); mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); mAccessibilityMgr = Dependency.get(AccessibilityManagerWrapper.class); mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mShowActiveStreamOnly = showActiveStreamOnly(); + mHasSeenODICaptionsTooltip = + Prefs.getBoolean(context, Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, false); } public void init(int windowType, Callback callback) { @@ -201,8 +213,9 @@ public class VolumeDialogImpl implements VolumeDialog { lp.format = PixelFormat.TRANSLUCENT; lp.setTitle(VolumeDialogImpl.class.getSimpleName()); lp.windowAnimations = -1; + lp.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; mWindow.setAttributes(lp); - mWindow.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + mWindow.setLayout(WRAP_CONTENT, WRAP_CONTENT); mDialog.setContentView(R.layout.volume_dialog); mDialogView = mDialog.findViewById(R.id.volume_dialog); @@ -213,12 +226,13 @@ public class VolumeDialogImpl implements VolumeDialog { mDialogView.animate() .alpha(1) .translationX(0) - .setDuration(300) + .setDuration(DIALOG_SHOW_ANIMATION_DURATION) .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator()) .withEndAction(() -> { if (!Prefs.getBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, false)) { if (mRingerIcon != null) { - mRingerIcon.postOnAnimationDelayed(mSinglePress, 1500); + mRingerIcon.postOnAnimationDelayed( + getSinglePressFor(mRingerIcon), 1500); } } }) @@ -233,20 +247,23 @@ public class VolumeDialogImpl implements VolumeDialog { return true; }); - lp = mWindow.getAttributes(); - lp.gravity = ((FrameLayout.LayoutParams) mDialogView.getLayoutParams()).gravity; - mWindow.setAttributes(lp); - mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows); mRinger = mDialog.findViewById(R.id.ringer); if (mRinger != null) { mRingerIcon = mRinger.findViewById(R.id.ringer_icon); mZenIcon = mRinger.findViewById(R.id.dnd_icon); } + mODICaptionsView = mDialog.findViewById(R.id.odi_captions); if (mODICaptionsView != null) { mODICaptionsIcon = mODICaptionsView.findViewById(R.id.odi_captions_icon); } + mODICaptionsTooltipViewStub = mDialog.findViewById(R.id.odi_captions_tooltip_stub); + if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipViewStub != null) { + mDialogView.removeView(mODICaptionsTooltipViewStub); + mODICaptionsTooltipViewStub = null; + } + mSettingsView = mDialog.findViewById(R.id.settings_container); mSettingsIcon = mDialog.findViewById(R.id.settings); @@ -495,10 +512,70 @@ public class VolumeDialogImpl implements VolumeDialog { }); } - mController.getCaptionsComponentState(); + mController.getCaptionsComponentState(false); + } + + private void checkODICaptionsTooltip(boolean fromDismiss) { + if (!mHasSeenODICaptionsTooltip && !fromDismiss && mODICaptionsTooltipViewStub != null) { + mController.getCaptionsComponentState(true); + } else { + if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) { + hideCaptionsTooltip(); + } + } + } + + protected void showCaptionsTooltip() { + if (!mHasSeenODICaptionsTooltip && mODICaptionsTooltipViewStub != null) { + mODICaptionsTooltipView = mODICaptionsTooltipViewStub.inflate(); + mODICaptionsTooltipView.findViewById(R.id.dismiss).setOnClickListener(v -> { + hideCaptionsTooltip(); + Events.writeEvent(mContext, Events.EVENT_ODI_CAPTIONS_TOOLTIP_CLICK); + }); + mODICaptionsTooltipViewStub = null; + rescheduleTimeoutH(); + } + + if (mODICaptionsTooltipView != null) { + mODICaptionsTooltipView.setAlpha(0.f); + mODICaptionsTooltipView.animate() + .alpha(1.f) + .setStartDelay(DIALOG_SHOW_ANIMATION_DURATION) + .withEndAction(() -> { + if (D.BUG) Log.d(TAG, "tool:checkODICaptionsTooltip() putBoolean true"); + Prefs.putBoolean(mContext, + Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, true); + mHasSeenODICaptionsTooltip = true; + if (mODICaptionsIcon != null) { + mODICaptionsIcon + .postOnAnimation(getSinglePressFor(mODICaptionsIcon)); + } + }) + .start(); + } } - private void updateODICaptionsH(boolean isServiceComponentEnabled) { + private void hideCaptionsTooltip() { + if (mODICaptionsTooltipView != null) { + mODICaptionsTooltipView.animate().cancel(); + mODICaptionsTooltipView.setAlpha(1.f); + mODICaptionsTooltipView.animate() + .alpha(0.f) + .setStartDelay(0) + .setDuration(DIALOG_HIDE_ANIMATION_DURATION) + .start(); + } + } + + protected void tryToRemoveCaptionsTooltip() { + if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) { + ViewGroup container = mDialog.findViewById(R.id.volume_dialog_container); + container.removeView(mODICaptionsTooltipView); + mODICaptionsTooltipView = null; + } + } + + private void updateODICaptionsH(boolean isServiceComponentEnabled, boolean fromTooltip) { if (mODICaptionsView != null) { mODICaptionsView.setVisibility(isServiceComponentEnabled ? VISIBLE : GONE); } @@ -506,6 +583,7 @@ public class VolumeDialogImpl implements VolumeDialog { if (!isServiceComponentEnabled) return; updateCaptionsIcon(); + if (fromTooltip) showCaptionsTooltip(); } private void updateCaptionsIcon() { @@ -602,7 +680,8 @@ public class VolumeDialogImpl implements VolumeDialog { mDialog.show(); Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); mController.notifyVisible(true); - mController.getCaptionsComponentState(); + mController.getCaptionsComponentState(false); + checkODICaptionsTooltip(false); } protected void rescheduleTimeoutH() { @@ -625,11 +704,21 @@ public class VolumeDialogImpl implements VolumeDialog { AccessibilityManager.FLAG_CONTENT_TEXT | AccessibilityManager.FLAG_CONTENT_CONTROLS); } + if (!mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) { + return mAccessibilityMgr.getRecommendedTimeoutMillis( + DIALOG_ODI_CAPTIONS_TOOLTIP_TIMEOUT_MILLIS, + AccessibilityManager.FLAG_CONTENT_TEXT + | AccessibilityManager.FLAG_CONTENT_CONTROLS); + } return mAccessibilityMgr.getRecommendedTimeoutMillis(DIALOG_TIMEOUT_MILLIS, AccessibilityManager.FLAG_CONTENT_CONTROLS); } protected void dismissH(int reason) { + if (D.BUG) { + Log.d(TAG, "mDialog.dismiss() reason: " + Events.DISMISS_REASONS[reason] + + " from: " + Debug.getCaller()); + } mHandler.removeMessages(H.DISMISS); mHandler.removeMessages(H.SHOW); mDialogView.animate().cancel(); @@ -642,14 +731,15 @@ public class VolumeDialogImpl implements VolumeDialog { mDialogView.setAlpha(1); ViewPropertyAnimator animator = mDialogView.animate() .alpha(0) - .setDuration(250) + .setDuration(DIALOG_HIDE_ANIMATION_DURATION) .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator()) .withEndAction(() -> mHandler.postDelayed(() -> { - if (D.BUG) Log.d(TAG, "mDialog.dismiss()"); mDialog.dismiss(); + tryToRemoveCaptionsTooltip(); }, 50)); if (!isLandscape()) animator.translationX(mDialogView.getWidth() / 2); animator.start(); + checkODICaptionsTooltip(true); mController.notifyVisible(false); synchronized (mSafetyWarningLock) { if (mSafetyWarning != null) { @@ -822,6 +912,7 @@ public class VolumeDialogImpl implements VolumeDialog { } protected void onStateChangedH(State state) { + if (D.BUG) Log.d(TAG, "onStateChangedH() state: " + state.toString()); if (mState != null && state != null && mState.ringerModeInternal != state.ringerModeInternal && state.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) { @@ -847,7 +938,7 @@ public class VolumeDialogImpl implements VolumeDialog { mActiveStream = state.activeStream; VolumeRow activeRow = getActiveRow(); updateRowsH(activeRow); - rescheduleTimeoutH(); + if (mShowing) rescheduleTimeoutH(); } for (VolumeRow row : mRows) { updateVolumeRowH(row); @@ -1114,24 +1205,22 @@ public class VolumeDialogImpl implements VolumeDialog { } } - private Runnable mSinglePress = new Runnable() { - @Override - public void run() { - if (mRingerIcon != null) { - mRingerIcon.setPressed(true); - mRingerIcon.postOnAnimationDelayed(mSingleUnpress, 200); + private Runnable getSinglePressFor(ImageButton button) { + return () -> { + if (button != null) { + button.setPressed(true); + button.postOnAnimationDelayed(getSingleUnpressFor(button), 200); } - } - }; + }; + } - private Runnable mSingleUnpress = new Runnable() { - @Override - public void run() { - if (mRingerIcon != null) { - mRingerIcon.setPressed(false); + private Runnable getSingleUnpressFor(ImageButton button) { + return () -> { + if (button != null) { + button.setPressed(false); } - } - }; + }; + } private final VolumeDialogController.Callbacks mControllerCallbackH = new VolumeDialogController.Callbacks() { @@ -1198,8 +1287,9 @@ public class VolumeDialogImpl implements VolumeDialog { } @Override - public void onCaptionComponentStateChanged(Boolean isComponentEnabled) { - updateODICaptionsH(isComponentEnabled); + public void onCaptionComponentStateChanged( + Boolean isComponentEnabled, Boolean fromTooltip) { + updateODICaptionsH(isComponentEnabled, fromTooltip); } }; @@ -1232,7 +1322,7 @@ public class VolumeDialogImpl implements VolumeDialog { private final class CustomDialog extends Dialog implements DialogInterface { public CustomDialog(Context context) { - super(context, com.android.systemui.R.style.qs_theme); + super(context, com.android.systemui.R.style.volume_dialog_theme); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeToolTipView.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeToolTipView.java new file mode 100644 index 000000000000..1de55856f942 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeToolTipView.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.Context; +import android.graphics.CornerPathEffect; +import android.graphics.Paint; +import android.graphics.drawable.ShapeDrawable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.core.content.ContextCompat; + +import com.android.systemui.R; +import com.android.systemui.recents.TriangleShape; + +/** + * Tool tip view that draws an arrow that points to the volume dialog. + */ +public class VolumeToolTipView extends LinearLayout { + public VolumeToolTipView(Context context) { + super(context); + } + + public VolumeToolTipView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public VolumeToolTipView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public VolumeToolTipView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + drawArrow(); + } + + private void drawArrow() { + View arrowView = findViewById(R.id.arrow); + ViewGroup.LayoutParams arrowLp = arrowView.getLayoutParams(); + ShapeDrawable arrowDrawable = new ShapeDrawable(TriangleShape.createHorizontal( + arrowLp.width, arrowLp.height, false)); + Paint arrowPaint = arrowDrawable.getPaint(); + TypedValue typedValue = new TypedValue(); + getContext().getTheme().resolveAttribute(android.R.attr.colorAccent, typedValue, true); + arrowPaint.setColor(ContextCompat.getColor(getContext(), typedValue.resourceId)); + // The corner path effect won't be reflected in the shadow, but shouldn't be noticeable. + arrowPaint.setPathEffect(new CornerPathEffect( + getResources().getDimension(R.dimen.volume_tool_tip_arrow_corner_radius))); + arrowView.setBackground(arrowDrawable); + + } +} 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 de155055b76b..5a1f24a44b2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java @@ -313,7 +313,7 @@ public class NotificationTestHelper { .setIntent(bubbleIntent) .setDeleteIntent(deleteIntent) .setTitle("bubble title") - .setIcon(Icon.createWithResource(mContext, 1)) + .setIcon(Icon.createWithResource(mContext, R.drawable.android)) .setDesiredHeight(314) .build(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index c1f88855ac24..5cafc028d379 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -45,11 +45,13 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.testing.TestableLooper; +import android.testing.TestableResources; import android.util.Log; import com.android.internal.telephony.cdma.EriInfo; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.net.DataUsageController; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; @@ -76,6 +78,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL; protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G; protected static final int DEFAULT_QS_ICON = TelephonyIcons.ICON_3G; + protected static final String NO_DATA_STRING = "Data disabled"; + protected static final String NOT_DEFAULT_DATA_STRING = "Not default data"; protected NetworkControllerImpl mNetworkController; protected MobileSignalController mMobileSignalController; @@ -113,6 +117,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { @Before public void setUp() throws Exception { Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0); + TestableResources res = mContext.getOrCreateTestableResources(); + res.addOverride(R.string.cell_data_off_content_description, NO_DATA_STRING); + res.addOverride(R.string.not_default_data_content_description, NOT_DEFAULT_DATA_STRING); + mMockWm = mock(WifiManager.class); mMockTm = mock(TelephonyManager.class); mMockSm = mock(SubscriptionManager.class); @@ -392,12 +400,21 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut, boolean cutOut) { + verifyLastMobileDataIndicators( + visible, icon, typeIcon, qsVisible, qsIcon, qsTypeIcon, dataIn, dataOut, cutOut, + null); + } + + protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, + boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut, + boolean cutOut, String typeContentDescription) { ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor<IconState> qsIconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class); + ArgumentCaptor<String> typeContentDescriptionArg = ArgumentCaptor.forClass(String.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( iconArg.capture(), @@ -406,7 +423,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { qsTypeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), - anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); + typeContentDescriptionArg.capture(), + anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); @@ -424,6 +442,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { (boolean) dataInArg.getValue()); assertEquals("Data direction out in quick settings", dataOut, (boolean) dataOutArg.getValue()); + if (typeContentDescription != null) { // Only check if it was provided + assertEquals("Type content description", typeContentDescription, + typeContentDescriptionArg.getValue()); + } } protected void assertNetworkNameEquals(String expected) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index 96fad21ed7a3..68323c912fdb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -117,7 +117,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { } @Test - public void testNoInternetIcon() { + public void testNoInternetIcon_withDefaultSub() { setupNetworkController(); when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); setupDefaultSignal(); @@ -127,11 +127,11 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { // Verify that a SignalDrawable with a cut out is used to display data disabled. verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, - false, true); + false, true, NO_DATA_STRING); } @Test - public void testDataDisabledIcon() { + public void testDataDisabledIcon_withDefaultSub() { setupNetworkController(); when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); setupDefaultSignal(); @@ -141,7 +141,37 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { // Verify that a SignalDrawable with a cut out is used to display data disabled. verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, - false, true); + false, true, NO_DATA_STRING); + } + + @Test + public void testNoInternetIcon_withoutDefaultSub() { + setupNetworkController(); + when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + setupDefaultSignal(); + setDefaultSubId(mSubId + 1); + updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); + setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); + + // Verify that a SignalDrawable with a cut out is used to display data disabled. + verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, + true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, + false, true, NOT_DEFAULT_DATA_STRING); + } + + @Test + public void testDataDisabledIcon_withoutDefaultSub() { + setupNetworkController(); + when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + setupDefaultSignal(); + setDefaultSubId(mSubId + 1); + updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); + setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); + + // Verify that a SignalDrawable with a cut out is used to display data disabled. + verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, + true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, + false, true, NOT_DEFAULT_DATA_STRING); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java index 617c17e48452..f3cdbf7409c1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java @@ -118,6 +118,17 @@ public class VolumeDialogImplTest extends SysuiTestCase { } @Test + public void testComputeTimeout_tooltip() { + Mockito.reset(mAccessibilityMgr); + mDialog.showCaptionsTooltip(); + verify(mAccessibilityMgr).getRecommendedTimeoutMillis( + VolumeDialogImpl.DIALOG_ODI_CAPTIONS_TOOLTIP_TIMEOUT_MILLIS, + AccessibilityManager.FLAG_CONTENT_CONTROLS + | AccessibilityManager.FLAG_CONTENT_TEXT); + } + + + @Test public void testComputeTimeout_withHovering() { Mockito.reset(mAccessibilityMgr); View dialog = mDialog.getDialogView(); @@ -146,6 +157,16 @@ public class VolumeDialogImplTest extends SysuiTestCase { | AccessibilityManager.FLAG_CONTENT_CONTROLS); } + @Test + public void testComputeTimeout_standard() { + Mockito.reset(mAccessibilityMgr); + mDialog.tryToRemoveCaptionsTooltip(); + mDialog.rescheduleTimeoutH(); + verify(mAccessibilityMgr).getRecommendedTimeoutMillis( + VolumeDialogImpl.DIALOG_TIMEOUT_MILLIS, + AccessibilityManager.FLAG_CONTENT_CONTROLS); + } + /* @Test public void testContentDescriptions() { diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index ffda5819927b..7106664d0699 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -362,8 +362,8 @@ public class BackupManagerService { * @param dataManagementIntent An {@link Intent} that can be passed to {@link * Context#startActivity} in order to launch the transport's data-management UI. It may be * {@code null} if the transport does not offer any user-facing data management UI. - * @param dataManagementLabel A {@link String} to be used as the label for the transport's data - * management affordance. This MUST be {@code null} when dataManagementIntent is {@code + * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's + * data management affordance. This MUST be {@code null} when dataManagementIntent is {@code * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. @@ -375,7 +375,7 @@ public class BackupManagerService { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - String dataManagementLabel) { + CharSequence dataManagementLabel) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "updateTransportAttributes()"); @@ -521,7 +521,7 @@ public class BackupManagerService { * transport. */ @Nullable - public String getDataManagementLabel(@UserIdInt int userId, String transportName) { + public CharSequence getDataManagementLabel(@UserIdInt int userId, String transportName) { UserBackupManagerService userBackupManagerService = getServiceForUserIfCallerHasPermission(userId, "getDataManagementLabel()"); diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 00cb6d3a0a26..8f0c5d812e1c 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -630,8 +630,7 @@ public class Trampoline extends IBackupManager.Stub { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - String dataManagementLabel) { - + CharSequence dataManagementLabel) { if (isUserReadyForBackup(userId)) { mService.updateTransportAttributes( userId, @@ -710,19 +709,13 @@ public class Trampoline extends IBackupManager.Stub { } @Override - public String getDataManagementLabelForUser(int userId, String transport) + public CharSequence getDataManagementLabelForUser(int userId, String transport) throws RemoteException { return isUserReadyForBackup(userId) ? mService.getDataManagementLabel(userId, transport) : null; } @Override - public String getDataManagementLabel(String transport) - throws RemoteException { - return getDataManagementLabelForUser(binderGetCallingUserId(), transport); - } - - @Override public IRestoreSession beginRestoreSessionForUser( int userId, String packageName, String transportID) throws RemoteException { return isUserReadyForBackup(userId) ? mService.beginRestoreSession(userId, packageName, diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java index a7bada07ffa8..30ce4cf2fd3f 100644 --- a/services/backup/java/com/android/server/backup/TransportManager.java +++ b/services/backup/java/com/android/server/backup/TransportManager.java @@ -284,7 +284,7 @@ public class TransportManager { * @throws TransportNotRegisteredException if the transport is not registered. */ @Nullable - public String getTransportDataManagementLabel(String transportName) + public CharSequence getTransportDataManagementLabel(String transportName) throws TransportNotRegisteredException { synchronized (mTransportLock) { return getRegisteredTransportDescriptionOrThrowLocked(transportName) @@ -327,7 +327,7 @@ public class TransportManager { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - @Nullable String dataManagementLabel) { + @Nullable CharSequence dataManagementLabel) { synchronized (mTransportLock) { TransportDescription description = mRegisteredTransportsDescriptionMap.get(transportComponent); @@ -678,7 +678,7 @@ public class TransportManager { transport.configurationIntent(), transport.currentDestinationString(), transport.dataManagementIntent(), - transport.dataManagementLabel()); + transport.dataManagementIntentLabel()); synchronized (mTransportLock) { mRegisteredTransportsDescriptionMap.put(transportComponent, description); } @@ -707,7 +707,7 @@ public class TransportManager { @Nullable private Intent configurationIntent; private String currentDestinationString; @Nullable private Intent dataManagementIntent; - @Nullable private String dataManagementLabel; + @Nullable private CharSequence dataManagementLabel; private TransportDescription( String name, @@ -715,7 +715,7 @@ public class TransportManager { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - @Nullable String dataManagementLabel) { + @Nullable CharSequence dataManagementLabel) { this.name = name; this.transportDirName = transportDirName; this.configurationIntent = configurationIntent; diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 32e2cacbb37b..447bd8c237dd 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -2929,8 +2929,8 @@ public class UserBackupManagerService { * {@link Context#startActivity} in order to launch the transport's data-management UI. It * may be {@code null} if the transport does not offer any user-facing data * management UI. - * @param dataManagementLabel A {@link String} to be used as the label for the transport's data - * management affordance. This MUST be {@code null} when dataManagementIntent is + * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's + * data management affordance. This MUST be {@code null} when dataManagementIntent is * {@code null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. @@ -2941,7 +2941,7 @@ public class UserBackupManagerService { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - @Nullable String dataManagementLabel) { + @Nullable CharSequence dataManagementLabel) { updateTransportAttributes( Binder.getCallingUid(), transportComponent, @@ -2960,7 +2960,7 @@ public class UserBackupManagerService { @Nullable Intent configurationIntent, String currentDestinationString, @Nullable Intent dataManagementIntent, - @Nullable String dataManagementLabel) { + @Nullable CharSequence dataManagementLabel) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "updateTransportAttributes"); @@ -3159,12 +3159,12 @@ public class UserBackupManagerService { * Supply the menu label for affordances that fire the manage-data intent for the given * transport. */ - public String getDataManagementLabel(String transportName) { + public CharSequence getDataManagementLabel(String transportName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getDataManagementLabel"); try { - String label = mTransportManager.getTransportDataManagementLabel(transportName); + CharSequence label = mTransportManager.getTransportDataManagementLabel(transportName); if (MORE_DEBUG) { Slog.d(TAG, "getDataManagementLabel() returning " + label); } diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index a85b69b528dd..39f7f0f0d1a8 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -127,6 +127,7 @@ public final class BatteryService extends SystemService { // discharge stats before the device dies. private int mCriticalBatteryLevel; + // TODO: Current args don't work since "--unplugged" flag was purposefully removed. private static final String[] DUMPSYS_ARGS = new String[] { "--checkin", "--unplugged" }; private static final String DUMPSYS_DATA_PATH = "/data/system/"; @@ -734,6 +735,7 @@ public final class BatteryService extends SystemService { mLastBatteryLevelChangedSentMs = SystemClock.elapsedRealtime(); } + // TODO: Current code doesn't work since "--unplugged" flag in BSS was purposefully removed. private void logBatteryStatsLocked() { IBinder batteryInfoService = ServiceManager.getService(BatteryStats.SERVICE_NAME); if (batteryInfoService == null) return; diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index c06972932621..ec5987e97ceb 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2174,7 +2174,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (VDBG) log("identical MTU - not setting"); return; } - if (LinkProperties.isValidMtu(mtu, newLp.hasGlobalIPv6Address()) == false) { + if (!LinkProperties.isValidMtu(mtu, newLp.hasGlobalIpv6Address())) { if (mtu != 0) loge("Unexpected mtu value: " + mtu + ", " + iface); return; } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 31010c9c9249..b89223b5cbda 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -64,6 +64,7 @@ import android.location.INetInitiatedListener; import android.location.Location; import android.location.LocationManager; import android.location.LocationRequest; +import android.location.LocationTime; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -2695,6 +2696,19 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override + public LocationTime getGnssTimeMillis() { + synchronized (mLock) { + Location location = mLastLocation.get(LocationManager.GPS_PROVIDER); + if (location == null) { + return null; + } + long currentNanos = SystemClock.elapsedRealtimeNanos(); + long deltaMs = (currentNanos - location.getElapsedRealtimeNanos()) / 1000000L; + return new LocationTime(location.getTime() + deltaMs, currentNanos); + } + } + + @Override public boolean injectLocation(Location location) { mContext.enforceCallingPermission(android.Manifest.permission.LOCATION_HARDWARE, "Location Hardware permission not granted to inject location"); diff --git a/services/core/java/com/android/server/am/HealthStatsBatteryStatsWriter.java b/services/core/java/com/android/server/am/HealthStatsBatteryStatsWriter.java index c2f1890699a8..1c916e94fc0b 100644 --- a/services/core/java/com/android/server/am/HealthStatsBatteryStatsWriter.java +++ b/services/core/java/com/android/server/am/HealthStatsBatteryStatsWriter.java @@ -17,7 +17,7 @@ package com.android.server.am; import android.os.BatteryStats; -import static android.os.BatteryStats.STATS_SINCE_UNPLUGGED; +import static android.os.BatteryStats.STATS_SINCE_CHARGED; import android.os.PowerManager; import android.os.SystemClock; import android.os.health.HealthKeys; @@ -63,20 +63,20 @@ public class HealthStatsBatteryStatsWriter { // MEASUREMENT_REALTIME_BATTERY_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_REALTIME_BATTERY_MS, - bs.computeBatteryRealtime(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + bs.computeBatteryRealtime(mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // MEASUREMENT_UPTIME_BATTERY_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_UPTIME_BATTERY_MS, - bs.computeBatteryUptime(mNowUptimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + bs.computeBatteryUptime(mNowUptimeMs*1000, STATS_SINCE_CHARGED)/1000); // MEASUREMENT_REALTIME_SCREEN_OFF_BATTERY_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_REALTIME_SCREEN_OFF_BATTERY_MS, bs.computeBatteryScreenOffRealtime( - mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // MEASUREMENT_UPTIME_SCREEN_OFF_BATTERY_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_UPTIME_SCREEN_OFF_BATTERY_MS, - bs.computeBatteryScreenOffUptime(mNowUptimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + bs.computeBatteryScreenOffUptime(mNowUptimeMs*1000, STATS_SINCE_CHARGED)/1000); // // Now on to the real per-uid stats... @@ -161,75 +161,75 @@ public class HealthStatsBatteryStatsWriter { if (controller != null) { // MEASUREMENT_WIFI_IDLE_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_IDLE_MS, - controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_RX_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_RX_MS, - controller.getRxTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getRxTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_TX_MS sum = 0; for (final BatteryStats.LongCounter counter: controller.getTxTimeCounters()) { - sum += counter.getCountLocked(STATS_SINCE_UNPLUGGED); + sum += counter.getCountLocked(STATS_SINCE_CHARGED); } uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_TX_MS, sum); // MEASUREMENT_WIFI_POWER_MAMS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_POWER_MAMS, - controller.getPowerCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getPowerCounter().getCountLocked(STATS_SINCE_CHARGED)); } controller = uid.getBluetoothControllerActivity(); if (controller != null) { // MEASUREMENT_BLUETOOTH_IDLE_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_IDLE_MS, - controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_RX_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_RX_MS, - controller.getRxTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getRxTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_TX_MS sum = 0; for (final BatteryStats.LongCounter counter: controller.getTxTimeCounters()) { - sum += counter.getCountLocked(STATS_SINCE_UNPLUGGED); + sum += counter.getCountLocked(STATS_SINCE_CHARGED); } uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_TX_MS, sum); // MEASUREMENT_BLUETOOTH_POWER_MAMS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_POWER_MAMS, - controller.getPowerCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getPowerCounter().getCountLocked(STATS_SINCE_CHARGED)); } controller = uid.getModemControllerActivity(); if (controller != null) { // MEASUREMENT_MOBILE_IDLE_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_IDLE_MS, - controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getIdleTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_RX_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_RX_MS, - controller.getRxTimeCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getRxTimeCounter().getCountLocked(STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_TX_MS sum = 0; for (final BatteryStats.LongCounter counter: controller.getTxTimeCounters()) { - sum += counter.getCountLocked(STATS_SINCE_UNPLUGGED); + sum += counter.getCountLocked(STATS_SINCE_CHARGED); } uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_TX_MS, sum); // MEASUREMENT_MOBILE_POWER_MAMS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_POWER_MAMS, - controller.getPowerCounter().getCountLocked(STATS_SINCE_UNPLUGGED)); + controller.getPowerCounter().getCountLocked(STATS_SINCE_CHARGED)); } // MEASUREMENT_WIFI_RUNNING_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_RUNNING_MS, - uid.getWifiRunningTime(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + uid.getWifiRunningTime(mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // MEASUREMENT_WIFI_FULL_LOCK_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_FULL_LOCK_MS, - uid.getFullWifiLockTime(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + uid.getFullWifiLockTime(mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // TIMER_WIFI_SCAN uidWriter.addTimer(UidHealthStats.TIMER_WIFI_SCAN, - uid.getWifiScanCount(STATS_SINCE_UNPLUGGED), - uid.getWifiScanTime(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + uid.getWifiScanCount(STATS_SINCE_CHARGED), + uid.getWifiScanTime(mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // MEASUREMENT_WIFI_MULTICAST_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_MULTICAST_MS, - uid.getWifiMulticastTime(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED)/1000); + uid.getWifiMulticastTime(mNowRealtimeMs*1000, STATS_SINCE_CHARGED)/1000); // TIMER_AUDIO addTimer(uidWriter, UidHealthStats.TIMER_AUDIO, uid.getAudioTurnedOnTimer()); @@ -280,90 +280,90 @@ public class HealthStatsBatteryStatsWriter { // MEASUREMENT_OTHER_USER_ACTIVITY_COUNT uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_OTHER_USER_ACTIVITY_COUNT, uid.getUserActivityCount(PowerManager.USER_ACTIVITY_EVENT_OTHER, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_BUTTON_USER_ACTIVITY_COUNT uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BUTTON_USER_ACTIVITY_COUNT, uid.getUserActivityCount(PowerManager.USER_ACTIVITY_EVENT_BUTTON, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_TOUCH_USER_ACTIVITY_COUNT uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_TOUCH_USER_ACTIVITY_COUNT, uid.getUserActivityCount(PowerManager.USER_ACTIVITY_EVENT_TOUCH, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_RX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_RX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_TX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_TX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_RX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_RX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_WIFI_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_TX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_TX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_WIFI_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_RX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_RX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_BT_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_TX_BYTES uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_TX_BYTES, uid.getNetworkActivityBytes(BatteryStats.NETWORK_BT_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_RX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_RX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_MOBILE_TX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_MOBILE_TX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_RX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_RX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_WIFI_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_WIFI_TX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_WIFI_TX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_WIFI_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_RX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_RX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_BT_RX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // MEASUREMENT_BLUETOOTH_TX_PACKETS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_BLUETOOTH_TX_PACKETS, uid.getNetworkActivityPackets(BatteryStats.NETWORK_BT_TX_DATA, - STATS_SINCE_UNPLUGGED)); + STATS_SINCE_CHARGED)); // TIMER_MOBILE_RADIO_ACTIVE uidWriter.addTimer(UidHealthStats.TIMER_MOBILE_RADIO_ACTIVE, - uid.getMobileRadioActiveCount(STATS_SINCE_UNPLUGGED), - uid.getMobileRadioActiveTime(STATS_SINCE_UNPLUGGED)); + uid.getMobileRadioActiveCount(STATS_SINCE_CHARGED), + uid.getMobileRadioActiveTime(STATS_SINCE_CHARGED)); // MEASUREMENT_USER_CPU_TIME_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_USER_CPU_TIME_MS, - uid.getUserCpuTimeUs(STATS_SINCE_UNPLUGGED)/1000); + uid.getUserCpuTimeUs(STATS_SINCE_CHARGED)/1000); // MEASUREMENT_SYSTEM_CPU_TIME_MS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_SYSTEM_CPU_TIME_MS, - uid.getSystemCpuTimeUs(STATS_SINCE_UNPLUGGED)/1000); + uid.getSystemCpuTimeUs(STATS_SINCE_CHARGED)/1000); // MEASUREMENT_CPU_POWER_MAMS uidWriter.addMeasurement(UidHealthStats.MEASUREMENT_CPU_POWER_MAMS, 0); @@ -393,27 +393,27 @@ public class HealthStatsBatteryStatsWriter { public void writeProc(HealthStatsWriter procWriter, BatteryStats.Uid.Proc proc) { // MEASUREMENT_USER_TIME_MS procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_USER_TIME_MS, - proc.getUserTime(STATS_SINCE_UNPLUGGED)); + proc.getUserTime(STATS_SINCE_CHARGED)); // MEASUREMENT_SYSTEM_TIME_MS procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_SYSTEM_TIME_MS, - proc.getSystemTime(STATS_SINCE_UNPLUGGED)); + proc.getSystemTime(STATS_SINCE_CHARGED)); // MEASUREMENT_STARTS_COUNT procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_STARTS_COUNT, - proc.getStarts(STATS_SINCE_UNPLUGGED)); + proc.getStarts(STATS_SINCE_CHARGED)); // MEASUREMENT_CRASHES_COUNT procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_CRASHES_COUNT, - proc.getNumCrashes(STATS_SINCE_UNPLUGGED)); + proc.getNumCrashes(STATS_SINCE_CHARGED)); // MEASUREMENT_ANR_COUNT procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_ANR_COUNT, - proc.getNumAnrs(STATS_SINCE_UNPLUGGED)); + proc.getNumAnrs(STATS_SINCE_CHARGED)); // MEASUREMENT_FOREGROUND_MS procWriter.addMeasurement(ProcessHealthStats.MEASUREMENT_FOREGROUND_MS, - proc.getForegroundTime(STATS_SINCE_UNPLUGGED)); + proc.getForegroundTime(STATS_SINCE_CHARGED)); } /** @@ -434,7 +434,7 @@ public class HealthStatsBatteryStatsWriter { final BatteryStats.Counter counter = entry.getValue(); if (counter != null) { pkgWriter.addMeasurements(PackageHealthStats.MEASUREMENTS_WAKEUP_ALARMS_COUNT, - entry.getKey(), counter.getCountLocked(STATS_SINCE_UNPLUGGED)); + entry.getKey(), counter.getCountLocked(STATS_SINCE_CHARGED)); } } } @@ -445,11 +445,11 @@ public class HealthStatsBatteryStatsWriter { public void writeServ(HealthStatsWriter servWriter, BatteryStats.Uid.Pkg.Serv serv) { // MEASUREMENT_START_SERVICE_COUNT servWriter.addMeasurement(ServiceHealthStats.MEASUREMENT_START_SERVICE_COUNT, - serv.getStarts(STATS_SINCE_UNPLUGGED)); + serv.getStarts(STATS_SINCE_CHARGED)); // MEASUREMENT_LAUNCH_COUNT servWriter.addMeasurement(ServiceHealthStats.MEASUREMENT_LAUNCH_COUNT, - serv.getLaunches(STATS_SINCE_UNPLUGGED)); + serv.getLaunches(STATS_SINCE_CHARGED)); } /** @@ -457,8 +457,8 @@ public class HealthStatsBatteryStatsWriter { */ private void addTimer(HealthStatsWriter writer, int key, BatteryStats.Timer timer) { if (timer != null) { - writer.addTimer(key, timer.getCountLocked(STATS_SINCE_UNPLUGGED), - timer.getTotalTimeLocked(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED) / 1000); + writer.addTimer(key, timer.getCountLocked(STATS_SINCE_CHARGED), + timer.getTotalTimeLocked(mNowRealtimeMs*1000, STATS_SINCE_CHARGED) / 1000); } } @@ -468,8 +468,8 @@ public class HealthStatsBatteryStatsWriter { private void addTimers(HealthStatsWriter writer, int key, String name, BatteryStats.Timer timer) { if (timer != null) { - writer.addTimers(key, name, new TimerStat(timer.getCountLocked(STATS_SINCE_UNPLUGGED), - timer.getTotalTimeLocked(mNowRealtimeMs*1000, STATS_SINCE_UNPLUGGED) / 1000)); + writer.addTimers(key, name, new TimerStat(timer.getCountLocked(STATS_SINCE_CHARGED), + timer.getTotalTimeLocked(mNowRealtimeMs*1000, STATS_SINCE_CHARGED) / 1000)); } } } diff --git a/services/core/java/com/android/server/am/MemoryStatUtil.java b/services/core/java/com/android/server/am/MemoryStatUtil.java index 0d035805274c..9cda89a17766 100644 --- a/services/core/java/com/android/server/am/MemoryStatUtil.java +++ b/services/core/java/com/android/server/am/MemoryStatUtil.java @@ -166,17 +166,11 @@ public final class MemoryStatUtil { } final MemoryStat memoryStat = new MemoryStat(); - Matcher m; - m = PGFAULT.matcher(memoryStatContents); - memoryStat.pgfault = m.find() ? Long.parseLong(m.group(1)) : 0; - m = PGMAJFAULT.matcher(memoryStatContents); - memoryStat.pgmajfault = m.find() ? Long.parseLong(m.group(1)) : 0; - m = RSS_IN_BYTES.matcher(memoryStatContents); - memoryStat.rssInBytes = m.find() ? Long.parseLong(m.group(1)) : 0; - m = CACHE_IN_BYTES.matcher(memoryStatContents); - memoryStat.cacheInBytes = m.find() ? Long.parseLong(m.group(1)) : 0; - m = SWAP_IN_BYTES.matcher(memoryStatContents); - memoryStat.swapInBytes = m.find() ? Long.parseLong(m.group(1)) : 0; + memoryStat.pgfault = tryParseLong(PGFAULT, memoryStatContents); + memoryStat.pgmajfault = tryParseLong(PGMAJFAULT, memoryStatContents); + memoryStat.rssInBytes = tryParseLong(RSS_IN_BYTES, memoryStatContents); + memoryStat.cacheInBytes = tryParseLong(CACHE_IN_BYTES, memoryStatContents); + memoryStat.swapInBytes = tryParseLong(SWAP_IN_BYTES, memoryStatContents); return memoryStat; } @@ -217,9 +211,8 @@ public final class MemoryStatUtil { if (procStatusContents == null || procStatusContents.isEmpty()) { return 0; } - Matcher m = RSS_HIGH_WATERMARK_IN_BYTES.matcher(procStatusContents); // Convert value read from /proc/pid/status from kilobytes to bytes. - return m.find() ? Long.parseLong(m.group(1)) * BYTES_IN_KILOBYTE : 0; + return tryParseLong(RSS_HIGH_WATERMARK_IN_BYTES, procStatusContents) * BYTES_IN_KILOBYTE; } @@ -249,8 +242,7 @@ public final class MemoryStatUtil { if (contents == null || contents.isEmpty()) { return 0; } - Matcher m = ION_HEAP_SIZE_IN_BYTES.matcher(contents); - return m.find() ? Long.parseLong(m.group(1)) : 0; + return tryParseLong(ION_HEAP_SIZE_IN_BYTES, contents); } /** @@ -260,6 +252,20 @@ public final class MemoryStatUtil { return DEVICE_HAS_PER_APP_MEMCG; } + /** + * Parses a long from the input using the pattern. Returns 0 if the captured value is not + * parsable. The pattern must have a single capturing group. + */ + private static long tryParseLong(Pattern pattern, String input) { + final Matcher m = pattern.matcher(input); + try { + return m.find() ? Long.parseLong(m.group(1)) : 0; + } catch (NumberFormatException e) { + Slog.e(TAG, "Failed to parse value", e); + return 0; + } + } + public static final class MemoryStat { /** Number of page faults */ public long pgfault; diff --git a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java index e43d1526f760..96a202fa2b10 100644 --- a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java +++ b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java @@ -163,8 +163,8 @@ public class DefaultNetworkMetrics { LinkProperties lp = nai.linkProperties; ev.netId = nai.network().netId; ev.transports |= BitUtils.packBits(nai.networkCapabilities.getTransportTypes()); - ev.ipv4 |= lp.hasIPv4Address() && lp.hasIPv4DefaultRoute(); - ev.ipv6 |= lp.hasGlobalIPv6Address() && lp.hasIPv6DefaultRoute(); + ev.ipv4 |= lp.hasIpv4Address() && lp.hasIpv4DefaultRoute(); + ev.ipv6 |= lp.hasGlobalIpv6Address() && lp.hasIpv6DefaultRoute(); } private static void printEvent(long localTimeMs, PrintWriter pw, DefaultNetworkEvent ev) { diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java index 2646d7669d79..262ba7a475bb 100644 --- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java +++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java @@ -107,8 +107,8 @@ public class Nat464Xlat extends BaseNetworkObserver { // Only run clat on networks that have a global IPv6 address and don't have a native IPv4 // address. LinkProperties lp = nai.linkProperties; - final boolean isIpv6OnlyNetwork = (lp != null) && lp.hasGlobalIPv6Address() - && !lp.hasIPv4Address(); + final boolean isIpv6OnlyNetwork = (lp != null) && lp.hasGlobalIpv6Address() + && !lp.hasIpv4Address(); // If the network tells us it doesn't use clat, respect that. final boolean skip464xlat = (nai.netMisc() != null) && nai.netMisc().skip464xlat; diff --git a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java index c471f0caa3cc..948c690956d3 100644 --- a/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java +++ b/services/core/java/com/android/server/connectivity/NetworkDiagnostics.java @@ -34,10 +34,12 @@ import android.util.Pair; import com.android.internal.util.IndentingPrintWriter; +import libcore.io.IoUtils; + import java.io.Closeable; import java.io.FileDescriptor; -import java.io.InterruptedIOException; import java.io.IOException; +import java.io.InterruptedIOException; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -48,17 +50,13 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; - -import libcore.io.IoUtils; - +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * NetworkDiagnostics @@ -186,7 +184,7 @@ public class NetworkDiagnostics { // TODO: we could use mLinkProperties.isReachable(TEST_DNS6) here, because we won't set any // DNS servers for which isReachable() is false, but since this is diagnostic code, be extra // careful. - if (mLinkProperties.hasGlobalIPv6Address() || mLinkProperties.hasIPv6DefaultRoute()) { + if (mLinkProperties.hasGlobalIpv6Address() || mLinkProperties.hasIpv6DefaultRoute()) { mLinkProperties.addDnsServer(TEST_DNS6); } diff --git a/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java index e78d25a1601b..f4d9006a7068 100644 --- a/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java +++ b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java @@ -31,7 +31,7 @@ import android.net.NetworkUtils; import android.net.SocketKeepalive.InvalidPacketException; import android.net.SocketKeepalive.InvalidSocketException; import android.net.TcpKeepalivePacketData; -import android.net.TcpKeepalivePacketData.TcpSocketInfo; +import android.net.TcpKeepalivePacketDataParcelable; import android.net.TcpRepairWindow; import android.os.Handler; import android.os.MessageQueue; @@ -46,7 +46,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.server.connectivity.KeepaliveTracker.KeepaliveInfo; import java.io.FileDescriptor; -import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketException; @@ -109,8 +108,8 @@ public class TcpKeepaliveController { public static TcpKeepalivePacketData getTcpKeepalivePacket(@NonNull FileDescriptor fd) throws InvalidPacketException, InvalidSocketException { try { - final TcpSocketInfo tsi = switchToRepairMode(fd); - return TcpKeepalivePacketData.tcpKeepalivePacket(tsi); + final TcpKeepalivePacketDataParcelable tcpDetails = switchToRepairMode(fd); + return TcpKeepalivePacketData.tcpKeepalivePacket(tcpDetails); } catch (InvalidPacketException | InvalidSocketException e) { switchOutOfRepairMode(fd); throw e; @@ -120,20 +119,15 @@ public class TcpKeepaliveController { * Switch the tcp socket to repair mode and query detail tcp information. * * @param fd the fd of socket on which to use keepalive offload. - * @return a {@link TcpKeepalivePacketData#TcpSocketInfo} object for current + * @return a {@link TcpKeepalivePacketData#TcpKeepalivePacketDataParcelable} object for current * tcp/ip information. */ - private static TcpSocketInfo switchToRepairMode(FileDescriptor fd) + private static TcpKeepalivePacketDataParcelable switchToRepairMode(FileDescriptor fd) throws InvalidSocketException { if (DBG) Log.i(TAG, "switchToRepairMode to start tcp keepalive : " + fd); + final TcpKeepalivePacketDataParcelable tcpDetails = new TcpKeepalivePacketDataParcelable(); final SocketAddress srcSockAddr; final SocketAddress dstSockAddr; - final InetAddress srcAddress; - final InetAddress dstAddress; - final int srcPort; - final int dstPort; - int seq; - final int ack; final TcpRepairWindow trw; // Query source address and port. @@ -144,8 +138,8 @@ public class TcpKeepaliveController { throw new InvalidSocketException(ERROR_INVALID_SOCKET, e); } if (srcSockAddr instanceof InetSocketAddress) { - srcAddress = getAddress((InetSocketAddress) srcSockAddr); - srcPort = getPort((InetSocketAddress) srcSockAddr); + tcpDetails.srcAddress = getAddress((InetSocketAddress) srcSockAddr); + tcpDetails.srcPort = getPort((InetSocketAddress) srcSockAddr); } else { Log.e(TAG, "Invalid or mismatched SocketAddress"); throw new InvalidSocketException(ERROR_INVALID_SOCKET); @@ -158,8 +152,8 @@ public class TcpKeepaliveController { throw new InvalidSocketException(ERROR_INVALID_SOCKET, e); } if (dstSockAddr instanceof InetSocketAddress) { - dstAddress = getAddress((InetSocketAddress) dstSockAddr); - dstPort = getPort((InetSocketAddress) dstSockAddr); + tcpDetails.dstAddress = getAddress((InetSocketAddress) dstSockAddr); + tcpDetails.dstPort = getPort((InetSocketAddress) dstSockAddr); } else { Log.e(TAG, "Invalid or mismatched peer SocketAddress"); throw new InvalidSocketException(ERROR_INVALID_SOCKET); @@ -178,10 +172,10 @@ public class TcpKeepaliveController { } // Query write sequence number from SEND_QUEUE. Os.setsockoptInt(fd, IPPROTO_TCP, TCP_REPAIR_QUEUE, TCP_SEND_QUEUE); - seq = Os.getsockoptInt(fd, IPPROTO_TCP, TCP_QUEUE_SEQ); + tcpDetails.seq = Os.getsockoptInt(fd, IPPROTO_TCP, TCP_QUEUE_SEQ); // Query read sequence number from RECV_QUEUE. Os.setsockoptInt(fd, IPPROTO_TCP, TCP_REPAIR_QUEUE, TCP_RECV_QUEUE); - ack = Os.getsockoptInt(fd, IPPROTO_TCP, TCP_QUEUE_SEQ); + tcpDetails.ack = Os.getsockoptInt(fd, IPPROTO_TCP, TCP_QUEUE_SEQ); // Switch to NO_QUEUE to prevent illegal socket read/write in repair mode. Os.setsockoptInt(fd, IPPROTO_TCP, TCP_REPAIR_QUEUE, TCP_NO_QUEUE); // Finally, check if socket is still idle. TODO : this check needs to move to @@ -197,6 +191,8 @@ public class TcpKeepaliveController { // Query tcp window size. trw = NetworkUtils.getTcpRepairWindow(fd); + tcpDetails.rcvWnd = trw.rcvWnd; + tcpDetails.rcvWndScale = trw.rcvWndScale; } catch (ErrnoException e) { Log.e(TAG, "Exception reading TCP state from socket", e); if (e.errno == ENOPROTOOPT) { @@ -212,10 +208,9 @@ public class TcpKeepaliveController { // Keepalive sequence number is last sequence number - 1. If it couldn't be retrieved, // then it must be set to -1, so decrement in all cases. - seq = seq - 1; + tcpDetails.seq = tcpDetails.seq - 1; - return new TcpSocketInfo(srcAddress, srcPort, dstAddress, dstPort, seq, ack, trw.rcvWnd, - trw.rcvWndScale); + return tcpDetails; } /** @@ -287,8 +282,8 @@ public class TcpKeepaliveController { switchOutOfRepairMode(fd); } - private static InetAddress getAddress(InetSocketAddress inetAddr) { - return inetAddr.getAddress(); + private static byte [] getAddress(InetSocketAddress inetAddr) { + return inetAddr.getAddress().getAddress(); } private static int getPort(InetSocketAddress inetAddr) { diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java index 100014898127..38eb0bcfd3cc 100644 --- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java +++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java @@ -17,7 +17,6 @@ package com.android.server.connectivity.tethering; import android.net.ConnectivityManager; -import android.net.ip.IpServer; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; @@ -25,6 +24,7 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkState; import android.net.RouteInfo; +import android.net.ip.IpServer; import android.net.util.NetworkConstants; import android.net.util.SharedLog; import android.util.Log; @@ -191,7 +191,7 @@ public class IPv6TetheringCoordinator { if (currentActive != null && currentActive.ipServer == ipServer) { final LinkProperties lp = getIPv6OnlyLinkProperties( mUpstreamNetworkState.linkProperties); - if (lp.hasIPv6DefaultRoute() && lp.hasGlobalIPv6Address()) { + if (lp.hasIpv6DefaultRoute() && lp.hasGlobalIpv6Address()) { return lp; } } diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java b/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java index 6c7ff91761ac..0ef3805ff7c0 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetheringInterfaceUtils.java @@ -67,14 +67,14 @@ public final class TetheringInterfaceUtils { // because "[t]he 3GPP network allocates each default bearer a unique // /64 prefix", per RFC 6459, Section 5.2. final boolean canTether = - (ns != null) && (ns.network != null) && - (ns.linkProperties != null) && (ns.networkCapabilities != null) && + (ns != null) && (ns.network != null) + && (ns.linkProperties != null) && (ns.networkCapabilities != null) // At least one upstream DNS server: - ns.linkProperties.hasIPv6DnsServer() && + && ns.linkProperties.hasIpv6DnsServer() // Minimal amount of IPv6 provisioning: - ns.linkProperties.hasGlobalIPv6Address() && + && ns.linkProperties.hasGlobalIpv6Address() // Temporary approximation of "dedicated prefix": - ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); + && ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); return canTether ? getInterfaceForDestination(ns.linkProperties, Inet6Address.ANY) diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 32f34b8378ce..3010324488b8 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -37,7 +37,6 @@ import android.content.pm.ParceledListSlice; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.ColorSpace; -import android.graphics.GraphicBuffer; import android.graphics.Point; import android.graphics.Rect; import android.hardware.SensorManager; @@ -1275,11 +1274,12 @@ public final class DisplayManagerService extends SystemService { if (token == null) { return false; } - final GraphicBuffer gb = SurfaceControl.screenshotToBufferWithSecureLayersUnsafe( - token, new Rect(), 0 /* width */, 0 /* height */, false /* useIdentityTransform */, - 0 /* rotation */); + final SurfaceControl.ScreenshotGraphicBuffer gb = + SurfaceControl.screenshotToBufferWithSecureLayersUnsafe( + token, new Rect(), 0 /* width */, 0 /* height */, + false /* useIdentityTransform */, 0 /* rotation */); try { - outSurface.attachAndQueueBuffer(gb); + outSurface.attachAndQueueBuffer(gb.getGraphicBuffer()); } catch (RuntimeException e) { Slog.w(TAG, "Failed to take screenshot - " + e.getMessage()); } diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 0c0c23a47999..0488d3a822ad 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -347,6 +347,9 @@ abstract public class ManagedServices { } } } + + writeExtraXmlTags(out); + out.endTag(null, getConfig().xmlTag); } @@ -355,6 +358,16 @@ abstract public class ManagedServices { */ protected void writeExtraAttributes(XmlSerializer out, int userId) throws IOException {} + /** + * Writes extra xml tags within the parent tag specified in {@link Config#xmlTag}. + */ + protected void writeExtraXmlTags(XmlSerializer out) throws IOException {} + + /** + * This is called to process tags other than {@link #TAG_MANAGED_SERVICES}. + */ + protected void readExtraTag(String tag, XmlPullParser parser) throws IOException {} + protected void migrateToXml() { loadAllowedComponentsFromSettings(); } @@ -391,6 +404,8 @@ abstract public class ManagedServices { } mUseXml = true; } + } else { + readExtraTag(tag, parser); } } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 4a215cf7febb..ca3c826d77dd 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -294,6 +294,12 @@ public class NotificationManagerService extends SystemService { static final boolean ENABLE_BLOCKED_TOASTS = true; + static final String[] DEFAULT_ALLOWED_ADJUSTMENTS = new String[] { + Adjustment.KEY_IMPORTANCE, + Adjustment.KEY_CONTEXTUAL_ACTIONS, + Adjustment.KEY_TEXT_REPLIES, + Adjustment.KEY_USER_SENTIMENT}; + // When #matchesCallFilter is called from the ringer, wait at most // 3s to resolve the contacts. This timeout is required since // ContactsProvider might take a long time to start up. @@ -2513,6 +2519,9 @@ public class NotificationManagerService extends SystemService { android.Manifest.permission.INTERACT_ACROSS_USERS, "canNotifyAsPackage for user " + userId); } + if (callingPkg.equals(targetPkg)) { + return true; + } try { ApplicationInfo info = mPackageManager.getApplicationInfo(targetPkg, @@ -2582,10 +2591,21 @@ public class NotificationManagerService extends SystemService { } @Override - public NotificationChannel getNotificationChannel(String pkg, String channelId) { - checkCallerIsSystemOrSameApp(pkg); - return mPreferencesHelper.getNotificationChannel( - pkg, Binder.getCallingUid(), channelId, false /* includeDeleted */); + public NotificationChannel getNotificationChannel(String callingPkg, int userId, + String targetPkg, String channelId) { + if (canNotifyAsPackage(callingPkg, targetPkg, userId) + || isCallingUidSystem()) { + int targetUid = -1; + try { + targetUid = mPackageManagerClient.getPackageUidAsUser(targetPkg, userId); + } catch (NameNotFoundException e) { + /* ignore */ + } + return mPreferencesHelper.getNotificationChannel( + targetPkg, targetUid, channelId, false /* includeDeleted */); + } + throw new SecurityException("Pkg " + callingPkg + + " cannot read channels for " + targetPkg + " in " + userId); } @Override @@ -2720,10 +2740,21 @@ public class NotificationManagerService extends SystemService { } @Override - public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg) { - checkCallerIsSystemOrSameApp(pkg); - return mPreferencesHelper.getNotificationChannels( - pkg, Binder.getCallingUid(), false /* includeDeleted */); + public ParceledListSlice<NotificationChannel> getNotificationChannels( + String callingPkg, String targetPkg, int userId) { + if (canNotifyAsPackage(callingPkg, targetPkg, userId) + || isCallingUidSystem()) { + int targetUid = -1; + try { + targetUid = mPackageManagerClient.getPackageUidAsUser(targetPkg, userId); + } catch (NameNotFoundException e) { + /* ignore */ + } + return mPreferencesHelper.getNotificationChannels( + targetPkg, targetUid, false /* includeDeleted */); + } + throw new SecurityException("Pkg " + callingPkg + + " cannot read channels for " + targetPkg + " in " + userId); } @Override @@ -2790,6 +2821,33 @@ public class NotificationManagerService extends SystemService { handleSavePolicyFile(); } + @Override + public List<String> getAllowedAssistantCapabilities(String pkg) { + checkCallerIsSystemOrSameApp(pkg); + + if (!isCallerSystemOrPhone() + && !mAssistants.isPackageAllowed(pkg, UserHandle.getCallingUserId())) { + throw new SecurityException("Not currently an assistant"); + } + + return mAssistants.getAllowedAssistantCapabilities(); + } + + @Override + public void allowAssistantCapability(String adjustmentType) { + checkCallerIsSystemOrShell(); + mAssistants.allowAdjustmentType(adjustmentType); + + handleSavePolicyFile(); + } + + @Override + public void disallowAssistantCapability(String adjustmentType) { + checkCallerIsSystemOrShell(); + mAssistants.disallowAdjustmentType(adjustmentType); + + handleSavePolicyFile(); + } /** * System-only API for getting a list of current (i.e. not cleared) notifications. @@ -7143,15 +7201,26 @@ public class NotificationManagerService extends SystemService { static final String TAG_ENABLED_NOTIFICATION_ASSISTANTS = "enabled_assistants"; private static final String ATT_USER_SET = "user_set"; + // TODO: STOPSHIP (b/127994217) switch to final value when onboarding flow is implemented + private static final String TAG_ALLOWED_ADJUSTMENT_TYPES = "allowed_adjustments_tmp"; + private static final String ATT_TYPES = "types"; private final Object mLock = new Object(); @GuardedBy("mLock") private ArrayMap<Integer, Boolean> mUserSetMap = new ArrayMap<>(); + private List<String> mAllowedAdjustments = new ArrayList<>(); public NotificationAssistants(Context context, Object lock, UserProfiles up, IPackageManager pm) { super(context, lock, up, pm); + + // TODO: STOPSHIP (b/127994217) remove when the onboarding flow is implemented + // Add all default allowed adjustment types. Will be overwritten by values in xml, + // if they exist + for (int i = 0; i < DEFAULT_ALLOWED_ADJUSTMENTS.length; i++) { + mAllowedAdjustments.add(DEFAULT_ALLOWED_ADJUSTMENTS[i]); + } } @Override @@ -7202,6 +7271,48 @@ public class NotificationManagerService extends SystemService { return android.Manifest.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE; } + @Override + protected void writeExtraXmlTags(XmlSerializer out) throws IOException { + synchronized (mLock) { + out.startTag(null, TAG_ALLOWED_ADJUSTMENT_TYPES); + out.attribute(null, ATT_TYPES, TextUtils.join(",", mAllowedAdjustments)); + out.endTag(null, TAG_ALLOWED_ADJUSTMENT_TYPES); + } + } + + @Override + protected void readExtraTag(String tag, XmlPullParser parser) throws IOException { + if (TAG_ALLOWED_ADJUSTMENT_TYPES.equals(tag)) { + final String types = XmlUtils.readStringAttribute(parser, ATT_TYPES); + if (!TextUtils.isEmpty(types)) { + synchronized (mLock) { + mAllowedAdjustments.clear(); + mAllowedAdjustments.addAll(Arrays.asList(types.split(","))); + } + } + } + } + + protected void allowAdjustmentType(String type) { + synchronized (mLock) { + mAllowedAdjustments.add(type); + } + } + + protected void disallowAdjustmentType(String type) { + synchronized (mLock) { + mAllowedAdjustments.remove(type); + } + } + + protected List<String> getAllowedAssistantCapabilities() { + synchronized (mLock) { + List<String> types = new ArrayList<>(); + types.addAll(mAllowedAdjustments); + return types; + } + } + protected void onNotificationsSeenLocked(ArrayList<NotificationRecord> records) { // There should be only one, but it's a list, so while we enforce // singularity elsewhere, we keep it general here, to avoid surprises. diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java index 8f2e997d319e..61daca7c93bc 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java @@ -17,6 +17,8 @@ package com.android.server.power.batterysaver; import static com.android.server.power.batterysaver.BatterySaverController.reasonToString; +import android.annotation.NonNull; +import android.annotation.StringRes; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -91,7 +93,9 @@ import java.io.PrintWriter; public class BatterySaverStateMachine { private static final String TAG = "BatterySaverStateMachine"; private static final String DYNAMIC_MODE_NOTIF_CHANNEL_ID = "dynamic_mode_notification"; + private static final String BATTERY_SAVER_NOTIF_CHANNEL_ID = "battery_saver_channel"; private static final int DYNAMIC_MODE_NOTIFICATION_ID = 1992; + private static final int STICKY_AUTO_DISABLED_NOTIFICATION_ID = 1993; private final Object mLock; private static final boolean DEBUG = BatterySaverPolicy.DEBUG; @@ -446,6 +450,10 @@ public class BatterySaverStateMachine { runOnBgThreadLazy(mThresholdChangeLogger, 2000); } + if (!mSettingBatterySaverStickyAutoDisableEnabled) { + hideStickyDisabledNotification(); + } + if (enabledChanged) { final String reason = batterySaverEnabled ? "Global.low_power changed to 1" : "Global.low_power changed to 0"; @@ -577,14 +585,17 @@ public class BatterySaverStateMachine { } enableBatterySaverLocked(/*enable*/ true, /*manual*/ true, BatterySaverController.REASON_MANUAL_ON); + hideStickyDisabledNotification(); mState = STATE_MANUAL_ON; } else if (isAutomaticModeActiveLocked() && isInAutomaticLowZoneLocked()) { enableBatterySaverLocked(/*enable*/ true, /*manual*/ false, BatterySaverController.REASON_PERCENTAGE_AUTOMATIC_ON); + hideStickyDisabledNotification(); mState = STATE_AUTOMATIC_ON; } else if (isDynamicModeActiveLocked() && isInDynamicLowZoneLocked()) { enableBatterySaverLocked(/*enable*/ true, /*manual*/ false, BatterySaverController.REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_ON); + hideStickyDisabledNotification(); mState = STATE_AUTOMATIC_ON; } } @@ -678,6 +689,7 @@ public class BatterySaverStateMachine { mBatterySaverStickyBehaviourDisabled || !mSettingBatterySaverEnabledSticky; if (isStickyDisabled || shouldTurnOffSticky) { setStickyActive(false); + triggerStickyDisabledNotification(); mState = STATE_OFF; } else if (!mIsPowered) { // Re-enable BS. @@ -774,40 +786,66 @@ public class BatterySaverStateMachine { @VisibleForTesting void triggerDynamicModeNotification() { NotificationManager manager = mContext.getSystemService(NotificationManager.class); - ensureNotificationChannelExists(manager); + ensureNotificationChannelExists(manager, DYNAMIC_MODE_NOTIF_CHANNEL_ID, + R.string.dynamic_mode_notification_channel_name); + + manager.notify(DYNAMIC_MODE_NOTIFICATION_ID, + buildNotification(DYNAMIC_MODE_NOTIF_CHANNEL_ID, + R.string.dynamic_mode_notification_title, + R.string.dynamic_mode_notification_summary, + Intent.ACTION_POWER_USAGE_SUMMARY)); + } - manager.notify(DYNAMIC_MODE_NOTIFICATION_ID, buildNotification()); + private void triggerStickyDisabledNotification() { + NotificationManager manager = mContext.getSystemService(NotificationManager.class); + ensureNotificationChannelExists(manager, BATTERY_SAVER_NOTIF_CHANNEL_ID, + R.string.battery_saver_notification_channel_name); + + manager.notify(STICKY_AUTO_DISABLED_NOTIFICATION_ID, + buildNotification(BATTERY_SAVER_NOTIF_CHANNEL_ID, + R.string.battery_saver_sticky_disabled_notification_title, + R.string.battery_saver_sticky_disabled_notification_summary, + Settings.ACTION_BATTERY_SAVER_SETTINGS)); } - private void ensureNotificationChannelExists(NotificationManager manager) { + private void ensureNotificationChannelExists(NotificationManager manager, + @NonNull String channelId, @StringRes int nameId) { NotificationChannel channel = new NotificationChannel( - DYNAMIC_MODE_NOTIF_CHANNEL_ID, - mContext.getText( - R.string.dynamic_mode_notification_channel_name), - NotificationManager.IMPORTANCE_DEFAULT); + channelId, mContext.getText(nameId), NotificationManager.IMPORTANCE_DEFAULT); channel.setSound(null, null); manager.createNotificationChannel(channel); } - private Notification buildNotification() { + private Notification buildNotification(@NonNull String channelId, @StringRes int titleId, + @StringRes int summaryId, @NonNull String intentAction) { Resources res = mContext.getResources(); - Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY); + Intent intent = new Intent(intentAction); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent batterySaverIntent = PendingIntent.getActivity( mContext, 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT); + final String summary = res.getString(summaryId); - return new Notification.Builder(mContext, DYNAMIC_MODE_NOTIF_CHANNEL_ID) + return new Notification.Builder(mContext, channelId) .setSmallIcon(R.drawable.ic_battery) - .setContentTitle(res.getString(R.string.dynamic_mode_notification_title)) - .setContentText(res.getString(R.string.dynamic_mode_notification_summary)) + .setContentTitle(res.getString(titleId)) + .setContentText(summary) .setContentIntent(batterySaverIntent) + .setStyle(new Notification.BigTextStyle().bigText(summary)) .setOnlyAlertOnce(true) .build(); } private void hideDynamicModeNotification() { + hideNotification(DYNAMIC_MODE_NOTIFICATION_ID); + } + + private void hideStickyDisabledNotification() { + hideNotification(STICKY_AUTO_DISABLED_NOTIFICATION_ID); + } + + private void hideNotification(int notificationId) { NotificationManager manager = mContext.getSystemService(NotificationManager.class); - manager.cancel(DYNAMIC_MODE_NOTIFICATION_ID); + manager.cancel(notificationId); } private void setStickyActive(boolean active) { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index beb3d82c05fb..6fe8b43db139 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -279,8 +279,11 @@ class TaskSnapshotController { Slog.w(TAG_WM, "Failed to take screenshot. No main window for " + task); return null; } - final GraphicBuffer buffer = SurfaceControl.captureLayers( - task.getSurfaceControl().getHandle(), mTmpRect, scaleFraction); + final SurfaceControl.ScreenshotGraphicBuffer screenshotBuffer = + SurfaceControl.captureLayers( + task.getSurfaceControl().getHandle(), mTmpRect, scaleFraction); + final GraphicBuffer buffer = screenshotBuffer != null ? screenshotBuffer.getGraphicBuffer() + : null; if (buffer == null || buffer.getWidth() <= 1 || buffer.getHeight() <= 1) { if (DEBUG_SCREENSHOT) { Slog.w(TAG_WM, "Failed to take screenshot for " + task); diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index dddc6b755db0..166a33d7a560 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -34,8 +34,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.WALLPAPER_DRAW_PENDING_TIMEOUT; import android.graphics.Bitmap; -import android.graphics.ColorSpace; -import android.graphics.GraphicBuffer; import android.graphics.Rect; import android.hardware.HardwareBuffer; import android.os.Bundle; @@ -738,17 +736,16 @@ class WallpaperController { final Rect bounds = wallpaperWindowState.getBounds(); bounds.offsetTo(0, 0); - GraphicBuffer wallpaperBuffer = SurfaceControl.captureLayers( + SurfaceControl.ScreenshotGraphicBuffer wallpaperBuffer = SurfaceControl.captureLayers( wallpaperWindowState.getSurfaceControl().getHandle(), bounds, 1 /* frameScale */); if (wallpaperBuffer == null) { Slog.w(TAG_WM, "Failed to screenshot wallpaper"); return null; } - // TODO(b/116112787) Now that hardware bitmap creation can take color space, we - // should continue to fix screenshot. - return Bitmap.wrapHardwareBuffer(HardwareBuffer.createFromGraphicBuffer(wallpaperBuffer), - ColorSpace.get(ColorSpace.Named.SRGB)); + return Bitmap.wrapHardwareBuffer( + HardwareBuffer.createFromGraphicBuffer(wallpaperBuffer.getGraphicBuffer()), + wallpaperBuffer.getColorSpace()); } private WindowState getTopVisibleWallpaper() { diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 57377c633c9a..3d84bd40fb5a 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -228,7 +228,7 @@ public: virtual void getReaderConfiguration(InputReaderConfiguration* outConfig); virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId); - virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices); + virtual void notifyInputDevicesChanged(const std::vector<InputDeviceInfo>& inputDevices); virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier& identifier); virtual std::string getDeviceAlias(const InputDeviceIdentifier& identifier); virtual TouchAffineTransformation getTouchAffineTransformation(JNIEnv *env, @@ -598,7 +598,7 @@ void NativeInputManager::ensureSpriteControllerLocked() REQUIRES(mLock) { } } -void NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { +void NativeInputManager::notifyInputDevicesChanged(const std::vector<InputDeviceInfo>& inputDevices) { ATRACE_CALL(); JNIEnv* env = jniEnv(); @@ -608,7 +608,7 @@ void NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo> if (inputDevicesObjArray) { bool error = false; for (size_t i = 0; i < count; i++) { - jobject inputDeviceObj = android_view_InputDevice_create(env, inputDevices.itemAt(i)); + jobject inputDeviceObj = android_view_InputDevice_create(env, inputDevices[i]); if (!inputDeviceObj) { error = true; break; @@ -775,7 +775,7 @@ void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray, int32_t displayId) { - Vector<sp<InputWindowHandle> > windowHandles; + std::vector<sp<InputWindowHandle> > windowHandles; if (windowHandleObjArray) { jsize length = env->GetArrayLength(windowHandleObjArray); @@ -788,7 +788,7 @@ void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleO sp<InputWindowHandle> windowHandle = android_view_InputWindowHandle_getHandle(env, windowHandleObj); if (windowHandle != nullptr) { - windowHandles.push(windowHandle); + windowHandles.push_back(windowHandle); } env->DeleteLocalRef(windowHandleObj); } @@ -800,7 +800,7 @@ void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleO bool newPointerGesturesEnabled = true; size_t numWindows = windowHandles.size(); for (size_t i = 0; i < numWindows; i++) { - const sp<InputWindowHandle>& windowHandle = windowHandles.itemAt(i); + const sp<InputWindowHandle>& windowHandle = windowHandles[i]; const InputWindowInfo* windowInfo = windowHandle->getInfo(); if (windowInfo && windowInfo->hasFocus && (windowInfo->inputFeatures & InputWindowInfo::INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES)) { diff --git a/services/net/java/android/net/TcpKeepalivePacketData.java b/services/net/java/android/net/TcpKeepalivePacketData.java index 398a6b31cbce..d79ad1fe41a9 100644 --- a/services/net/java/android/net/TcpKeepalivePacketData.java +++ b/services/net/java/android/net/TcpKeepalivePacketData.java @@ -25,8 +25,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.system.OsConstants; -import java.net.Inet4Address; import java.net.InetAddress; +import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Objects; @@ -56,10 +56,10 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce // This should only be constructed via static factory methods, such as // tcpKeepalivePacket. - private TcpKeepalivePacketData(TcpSocketInfo tcpDetails, byte[] data) - throws InvalidPacketException { - super(tcpDetails.srcAddress, tcpDetails.srcPort, tcpDetails.dstAddress, - tcpDetails.dstPort, data); + private TcpKeepalivePacketData(final TcpKeepalivePacketDataParcelable tcpDetails, + final byte[] data) throws InvalidPacketException, UnknownHostException { + super(InetAddress.getByAddress(tcpDetails.srcAddress), tcpDetails.srcPort, + InetAddress.getByAddress(tcpDetails.dstAddress), tcpDetails.dstPort, data); tcpSeq = tcpDetails.seq; tcpAck = tcpDetails.ack; // In the packet, the window is shifted right by the window scale. @@ -71,17 +71,22 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce * Factory method to create tcp keepalive packet structure. */ public static TcpKeepalivePacketData tcpKeepalivePacket( - TcpSocketInfo tcpDetails) throws InvalidPacketException { + TcpKeepalivePacketDataParcelable tcpDetails) throws InvalidPacketException { final byte[] packet; - if ((tcpDetails.srcAddress instanceof Inet4Address) - && (tcpDetails.dstAddress instanceof Inet4Address)) { - packet = buildV4Packet(tcpDetails); - } else { - // TODO: support ipv6 + try { + if ((tcpDetails.srcAddress != null) && (tcpDetails.dstAddress != null) + && (tcpDetails.srcAddress.length == 4 /* V4 IP length */) + && (tcpDetails.dstAddress.length == 4 /* V4 IP length */)) { + packet = buildV4Packet(tcpDetails); + } else { + // TODO: support ipv6 + throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); + } + return new TcpKeepalivePacketData(tcpDetails, packet); + } catch (UnknownHostException e) { throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); } - return new TcpKeepalivePacketData(tcpDetails, packet); } /** @@ -89,7 +94,7 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce */ // TODO : if this code is ever moved to the network stack, factorize constants with the ones // over there. - private static byte[] buildV4Packet(TcpSocketInfo tcpDetails) { + private static byte[] buildV4Packet(TcpKeepalivePacketDataParcelable tcpDetails) { final int length = IPV4_HEADER_LENGTH + TCP_HEADER_LENGTH; ByteBuffer buf = ByteBuffer.allocate(length); buf.order(ByteOrder.BIG_ENDIAN); @@ -102,8 +107,8 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce buf.put((byte) OsConstants.IPPROTO_TCP); final int ipChecksumOffset = buf.position(); buf.putShort((short) 0); // IP checksum - buf.put(tcpDetails.srcAddress.getAddress()); - buf.put(tcpDetails.dstAddress.getAddress()); + buf.put(tcpDetails.srcAddress); + buf.put(tcpDetails.dstAddress); buf.putShort((short) tcpDetails.srcPort); buf.putShort((short) tcpDetails.dstPort); buf.putInt(tcpDetails.seq); // Sequence Number @@ -122,31 +127,6 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce // TODO: add buildV6Packet. - /** Represents tcp/ip information. */ - // TODO: Replace TcpSocketInfo with TcpKeepalivePacketDataParcelable. - public static class TcpSocketInfo { - public final InetAddress srcAddress; - public final InetAddress dstAddress; - public final int srcPort; - public final int dstPort; - public final int seq; - public final int ack; - public final int rcvWnd; - public final int rcvWndScale; - - public TcpSocketInfo(InetAddress sAddr, int sPort, InetAddress dAddr, - int dPort, int writeSeq, int readSeq, int rWnd, int rWndScale) { - srcAddress = sAddr; - dstAddress = dAddr; - srcPort = sPort; - dstPort = dPort; - seq = writeSeq; - ack = readSeq; - rcvWnd = rWnd; - rcvWndScale = rWndScale; - } - } - @Override public boolean equals(@Nullable final Object o) { if (!(o instanceof TcpKeepalivePacketData)) return false; @@ -218,6 +198,8 @@ public class TcpKeepalivePacketData extends KeepalivePacketData implements Parce parcel.dstPort = dstPort; parcel.seq = tcpSeq; parcel.ack = tcpAck; + parcel.rcvWnd = tcpWnd; + parcel.rcvWndScale = tcpWndScale; return parcel; } diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java index 0e44f88d2389..fc1128b80499 100644 --- a/services/net/java/android/net/ip/IpServer.java +++ b/services/net/java/android/net/ip/IpServer.java @@ -506,7 +506,7 @@ public class IpServer extends StateMachine { if (v6only != null) { params = new RaParams(); params.mtu = v6only.getMtu(); - params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); + params.hasDefaultRoute = v6only.hasIpv6DefaultRoute(); if (params.hasDefaultRoute) params.hopLimit = getHopLimit(v6only.getInterfaceName()); diff --git a/services/net/java/android/net/shared/InitialConfiguration.java b/services/net/java/android/net/shared/InitialConfiguration.java index e423d62da7c9..007c8ca93d5a 100644 --- a/services/net/java/android/net/shared/InitialConfiguration.java +++ b/services/net/java/android/net/shared/InitialConfiguration.java @@ -207,7 +207,7 @@ public class InitialConfiguration { } private static boolean isIPv6GUA(LinkAddress addr) { - return addr.isIPv6() && addr.isGlobalPreferred(); + return addr.isIpv6() && addr.isGlobalPreferred(); } // TODO: extract out into CollectionUtils. diff --git a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java index 9a6e003c1317..42115d437ee0 100644 --- a/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java +++ b/services/robotests/backup/src/com/android/server/backup/TransportManagerTest.java @@ -554,7 +554,7 @@ public class TransportManagerTest { transportManager.getTransportCurrentDestinationString(mTransportA1.transportName); Intent dataManagementIntent = transportManager.getTransportDataManagementIntent(mTransportA1.transportName); - String dataManagementLabel = + CharSequence dataManagementLabel = transportManager.getTransportDataManagementLabel(mTransportA1.transportName); String transportDirName = transportManager.getTransportDirName(mTransportA1.transportName); String transportDirNameByComponent = diff --git a/services/robotests/backup/src/com/android/server/backup/testing/TransportData.java b/services/robotests/backup/src/com/android/server/backup/testing/TransportData.java index 77f5d9a48c18..3c2981067fe8 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/TransportData.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/TransportData.java @@ -75,7 +75,7 @@ public class TransportData { @Nullable public Intent configurationIntent; @Nullable public String currentDestinationString; @Nullable public Intent dataManagementIntent; - @Nullable public String dataManagementLabel; + @Nullable public CharSequence dataManagementLabel; private TransportData( @TransportStatus int transportStatus, @@ -85,7 +85,7 @@ public class TransportData { Intent configurationIntent, String currentDestinationString, Intent dataManagementIntent, - String dataManagementLabel) { + CharSequence dataManagementLabel) { this.transportStatus = transportStatus; this.transportName = transportName; this.transportComponentShort = transportComponentShort; @@ -103,7 +103,7 @@ public class TransportData { Intent configurationIntent, String currentDestinationString, Intent dataManagementIntent, - String dataManagementLabel) { + CharSequence dataManagementLabel) { this( TransportStatus.REGISTERED_AVAILABLE, transportName, diff --git a/services/robotests/backup/src/com/android/server/backup/testing/TransportTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/TransportTestUtils.java index f6ed6307c82f..7dd5be53157b 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/TransportTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/TransportTestUtils.java @@ -188,7 +188,8 @@ public class TransportTestUtils { when(transportBinder.currentDestinationString()) .thenReturn(transport.currentDestinationString); when(transportBinder.dataManagementIntent()).thenReturn(transport.dataManagementIntent); - when(transportBinder.dataManagementLabel()).thenReturn(transport.dataManagementLabel); + when(transportBinder.dataManagementIntentLabel()) + .thenReturn(transport.dataManagementLabel); } catch (RemoteException e) { fail("RemoteException?"); } diff --git a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java index 71b43973ea14..5fb762eadb49 100644 --- a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java +++ b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java @@ -310,6 +310,8 @@ public class MemoryStatUtilTest { @Test public void testParseIonHeapSizeFromDebugfs_invalidValue() { assertEquals(0, parseIonHeapSizeFromDebugfs("<<no-value>>")); + + assertEquals(0, parseIonHeapSizeFromDebugfs("\ntotal 12345678901234567890\n")); } @Test diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index 3e5ce46e8e3a..dd79aad52fd2 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -82,7 +82,7 @@ public class TrampolineTest { private static final String CURRENT_PASSWORD = "current_password"; private static final String NEW_PASSWORD = "new_password"; private static final String ENCRYPTION_PASSWORD = "encryption_password"; - private static final String DATA_MANAGEMENT_LABEL = "data_management_label"; + private static final CharSequence DATA_MANAGEMENT_LABEL = "data_management_label"; private static final String DESTINATION_STRING = "destination_string"; private static final String[] PACKAGE_NAMES = new String[]{"some.package.name._1", "some.package.name._2"}; @@ -1104,8 +1104,8 @@ public class TrampolineTest { } @Test - public void getDataManagementLabel_calledBeforeInitialize_ignored() throws Exception { - assertNull(mTrampoline.getDataManagementLabel(TRANSPORT_NAME)); + public void getDataManagementLabelForUser_calledBeforeInitialize_ignored() throws Exception { + assertNull(mTrampoline.getDataManagementLabelForUser(mUserId, TRANSPORT_NAME)); verifyNoMoreInteractions(mBackupManagerServiceMock); } @@ -1122,17 +1122,6 @@ public class TrampolineTest { } @Test - public void getDataManagementLabel_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - when(mBackupManagerServiceMock.getDataManagementLabel(mUserId, TRANSPORT_NAME)).thenReturn( - DATA_MANAGEMENT_LABEL); - mTrampoline.initializeService(); - - assertEquals(DATA_MANAGEMENT_LABEL, mTrampoline.getDataManagementLabel(TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDataManagementLabel(mUserId, TRANSPORT_NAME); - } - - @Test public void beginRestoreSession_calledBeforeInitialize_ignored() throws Exception { mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME); verifyNoMoreInteractions(mBackupManagerServiceMock); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 6f967593e6f1..a8da80efa35f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -391,7 +391,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels( PKG, new ParceledListSlice(Arrays.asList(mTestNotificationChannel))); - assertNotNull(mBinderService.getNotificationChannel(PKG, TEST_CHANNEL_ID)); + assertNotNull(mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, TEST_CHANNEL_ID)); } @After @@ -497,7 +498,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(channel))); final NotificationChannel createdChannel = - mBinderService.getNotificationChannel(PKG, "id"); + mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id"); assertTrue(createdChannel != null); } @@ -520,8 +521,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { new NotificationChannel("id2", "name", IMPORTANCE_DEFAULT); mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(channel1, channel2))); - assertTrue(mBinderService.getNotificationChannel(PKG, "id1") != null); - assertTrue(mBinderService.getNotificationChannel(PKG, "id2") != null); + assertTrue(mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, "id1") != null); + assertTrue(mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, "id2") != null); } @Test @@ -538,7 +541,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(dupeChannel))); final NotificationChannel createdChannel = - mBinderService.getNotificationChannel(PKG, "id"); + mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id"); assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance()); } @@ -556,7 +559,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(dupeChannel))); final NotificationChannel createdChannel = - mBinderService.getNotificationChannel(PKG, "id"); + mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id"); assertEquals(NotificationManager.IMPORTANCE_LOW, createdChannel.getImportance()); } @@ -579,7 +582,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(dupeChannel))); final NotificationChannel createdChannel = - mBinderService.getNotificationChannel(PKG, "id"); + mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id"); assertEquals(IMPORTANCE_HIGH, createdChannel.getImportance()); } @@ -593,7 +596,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(channel1, channel2))); final NotificationChannel createdChannel = - mBinderService.getNotificationChannel(PKG, "id"); + mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id"); assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance()); } @@ -646,8 +649,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(1, mBinderService.getActiveNotifications(sbn.getPackageName()).length); assertEquals(IMPORTANCE_LOW, mService.getNotificationRecord(sbn.getKey()).getImportance()); - assertEquals(IMPORTANCE_LOW, - mBinderService.getNotificationChannel(PKG, channel.getId()).getImportance()); + assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, channel.getId()).getImportance()); } @Test @@ -664,8 +667,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE); mBinderService.updateNotificationChannelForPackage(PKG, mUid, update); waitForIdle(); - assertEquals(IMPORTANCE_NONE, - mBinderService.getNotificationChannel(PKG, channel.getId()).getImportance()); + assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, channel.getId()).getImportance()); StatusBarNotification sbn = generateNotificationRecord(channel).sbn; sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE; @@ -677,8 +680,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(1, mBinderService.getActiveNotifications(sbn.getPackageName()).length); assertEquals(IMPORTANCE_LOW, mService.getNotificationRecord(sbn.getKey()).getImportance()); - assertEquals(IMPORTANCE_LOW, - mBinderService.getNotificationChannel(PKG, channel.getId()).getImportance()); + assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, channel.getId()).getImportance()); mBinderService.cancelNotificationWithTag(PKG, "tag", sbn.getId(), sbn.getUserId()); waitForIdle(); @@ -686,8 +689,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { update.setFgServiceShown(true); mBinderService.updateNotificationChannelForPackage(PKG, mUid, update); waitForIdle(); - assertEquals(IMPORTANCE_NONE, - mBinderService.getNotificationChannel(PKG, channel.getId()).getImportance()); + assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, channel.getId()).getImportance()); sbn = generateNotificationRecord(channel).sbn; sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE; @@ -697,8 +700,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // The second time it is shown, we keep the user's preference. assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length); assertNull(mService.getNotificationRecord(sbn.getKey())); - assertEquals(IMPORTANCE_NONE, - mBinderService.getNotificationChannel(PKG, channel.getId()).getImportance()); + assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel( + PKG, mContext.getUserId(), PKG, channel.getId()).getImportance()); } @Test @@ -2692,7 +2695,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.getNotificationRecord(sbn.getKey()).getImportance()); NotificationChannel defaultChannel = mBinderService.getNotificationChannel( - preOPkg, NotificationChannel.DEFAULT_CHANNEL_ID); + preOPkg, mContext.getUserId(), preOPkg, NotificationChannel.DEFAULT_CHANNEL_ID); assertEquals(IMPORTANCE_UNSPECIFIED, defaultChannel.getImportance()); } @@ -4192,6 +4195,25 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testgetNotificationChannels_crossUser() throws Exception { + // same user no problem + mBinderService.getNotificationChannels("src", "target", mContext.getUserId()); + + // cross user, no permission, problem + try { + mBinderService.getNotificationChannels("src", "target", mContext.getUserId() + 1); + fail("Should not be callable cross user without cross user permission"); + } catch (SecurityException e) { + // good + } + + // cross user, with permission, no problem + TestablePermissions perms = mContext.getTestablePermissions(); + perms.setPermission(android.Manifest.permission.INTERACT_ACROSS_USERS, PERMISSION_GRANTED); + mBinderService.getNotificationChannels("src", "target", mContext.getUserId() + 1); + } + + @Test public void setDefaultAssistantForUser_fromConfigXml() { clearDeviceConfig(); ComponentName xmlConfig = new ComponentName("config", "xml"); @@ -4264,4 +4286,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { componentName, false); } + + public void testGetAllowedAssistantCapabilities() throws Exception { + List<String> capabilities = mBinderService.getAllowedAssistantCapabilities(null); + assertNotNull(capabilities); + + for (int i = capabilities.size() - 1; i >= 0; i--) { + String capability = capabilities.get(i); + mBinderService.disallowAssistantCapability(capability); + assertEquals(i + 1, mBinderService.getAllowedAssistantCapabilities(null).size()); + List<String> currentCapabilities = mBinderService.getAllowedAssistantCapabilities(null); + assertNotNull(currentCapabilities); + assertFalse(currentCapabilities.contains(capability)); + } + } } diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp index f5b4308a1b50..92ea872f04fc 100644 --- a/startop/view_compiler/Android.bp +++ b/startop/view_compiler/Android.bp @@ -22,7 +22,6 @@ cc_defaults { ], shared_libs: [ "libbase", - "libz", "slicer", ], static_libs: [ diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java index 16791a4b8680..7d4ee7686512 100644 --- a/telecomm/java/android/telecom/Log.java +++ b/telecomm/java/android/telecom/Log.java @@ -16,6 +16,7 @@ package android.telecom; +import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.net.Uri; import android.os.Build; @@ -97,6 +98,7 @@ public class Log { } } + @UnsupportedAppUsage public static void i(String prefix, String format, Object... args) { if (INFO) { android.util.Slog.i(TAG, buildMessage(prefix, format, args)); @@ -127,6 +129,7 @@ public class Log { } } + @UnsupportedAppUsage public static void w(String prefix, String format, Object... args) { if (WARN) { android.util.Slog.w(TAG, buildMessage(prefix, format, args)); diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java index 10ffb804c8d0..19b11b666018 100644 --- a/telephony/java/android/telephony/CellIdentityTdscdma.java +++ b/telephony/java/android/telephony/CellIdentityTdscdma.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.telephony.gsm.GsmCellLocation; @@ -205,6 +206,12 @@ public final class CellIdentityTdscdma extends CellIdentity { /** Implement the Parcelable interface */ @Override + public int describeContents() { + return 0; + } + + /** Implement the Parcelable interface */ + @Override public void writeToParcel(Parcel dest, int flags) { if (DBG) log("writeToParcel(Parcel, int): " + toString()); super.writeToParcel(dest, CellInfo.TYPE_TDSCDMA); @@ -226,16 +233,17 @@ public final class CellIdentityTdscdma extends CellIdentity { /** Implement the Parcelable interface */ @SuppressWarnings("hiding") - public static final @android.annotation.NonNull Creator<CellIdentityTdscdma> CREATOR = + @NonNull + public static final Creator<CellIdentityTdscdma> CREATOR = new Creator<CellIdentityTdscdma>() { @Override - public CellIdentityTdscdma createFromParcel(Parcel in) { + public @NonNull CellIdentityTdscdma createFromParcel(Parcel in) { in.readInt(); // skip return createFromParcelBody(in); } @Override - public CellIdentityTdscdma[] newArray(int size) { + public @NonNull CellIdentityTdscdma[] newArray(int size) { return new CellIdentityTdscdma[size]; } }; diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java index 93baabf34c16..1830086ba448 100644 --- a/telephony/java/android/telephony/CellInfoTdscdma.java +++ b/telephony/java/android/telephony/CellInfoTdscdma.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; @@ -24,7 +25,9 @@ import java.util.Objects; /** * A {@link CellInfo} representing a TD-SCDMA cell that provides identity and measurement info. * - * @hide + * @see android.telephony.CellInfo + * @see android.telephony.CellSignalStrengthTdscdma + * @see android.telephony.CellIdentityTdscdma */ public final class CellInfoTdscdma extends CellInfo implements Parcelable { @@ -72,18 +75,21 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable { mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma); } - @Override public CellIdentityTdscdma getCellIdentity() { + @Override + public @NonNull CellIdentityTdscdma getCellIdentity() { return mCellIdentityTdscdma; } + /** @hide */ public void setCellIdentity(CellIdentityTdscdma cid) { mCellIdentityTdscdma = cid; } @Override - public CellSignalStrengthTdscdma getCellSignalStrength() { + public @NonNull CellSignalStrengthTdscdma getCellSignalStrength() { return mCellSignalStrengthTdscdma; } + /** @hide */ public void setCellSignalStrength(CellSignalStrengthTdscdma css) { mCellSignalStrengthTdscdma = css; @@ -149,15 +155,16 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable { } /** Implement the Parcelable interface */ - public static final @android.annotation.NonNull Creator<CellInfoTdscdma> CREATOR = new Creator<CellInfoTdscdma>() { + @NonNull + public static final Creator<CellInfoTdscdma> CREATOR = new Creator<CellInfoTdscdma>() { @Override - public CellInfoTdscdma createFromParcel(Parcel in) { + public @NonNull CellInfoTdscdma createFromParcel(Parcel in) { in.readInt(); // Skip past token, we know what it is return createFromParcelBody(in); } @Override - public CellInfoTdscdma[] newArray(int size) { + public @NonNull CellInfoTdscdma[] newArray(int size) { return new CellInfoTdscdma[size]; } }; diff --git a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java index e79643fbf709..ddbd851bbce5 100644 --- a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; @@ -25,7 +26,8 @@ import java.util.Objects; /** * Tdscdma signal strength related information. * - * @hide + * This class provides signal strength and signal quality information for the TD-SCDMA air + * interface. For more information see 3gpp 25.225. */ public final class CellSignalStrengthTdscdma extends CellSignalStrength implements Parcelable { @@ -59,7 +61,9 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen * @param rssi in dBm [-113, -51] or UNAVAILABLE * @param ber [0-7], 99 or UNAVAILABLE * @param rscp in dBm [-120, -24] or UNAVAILABLE - * @hide */ + * + * @hide + */ public CellSignalStrengthTdscdma(int rssi, int ber, int rscp) { mRssi = inRangeOrUnavailable(rssi, -113, -51); mBitErrorRate = inRangeOrUnavailable(ber, 0, 7, 99); @@ -148,8 +152,7 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen } /** - * Get the RSCP as dBm - * @hide + * Get the RSCP as dBm value -120..-24dBm or {@link CellInfo#UNAVAILABLE UNAVAILABLE}. */ public int getRscp() { return mRscp; @@ -160,7 +163,7 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen * * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 * - * @return RSCP in ASU 0..96, 255, or UNAVAILABLE + * @return RSCP in ASU 0..96, 255, or {@link CellInfo#UNAVAILABLE UNAVAILABLE}. */ @Override public int getAsuLevel() { @@ -237,15 +240,16 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen /** Implement the Parcelable interface */ @SuppressWarnings("hiding") - public static final @android.annotation.NonNull Parcelable.Creator<CellSignalStrengthTdscdma> CREATOR = + @NonNull + public static final Parcelable.Creator<CellSignalStrengthTdscdma> CREATOR = new Parcelable.Creator<CellSignalStrengthTdscdma>() { @Override - public CellSignalStrengthTdscdma createFromParcel(Parcel in) { + public @NonNull CellSignalStrengthTdscdma createFromParcel(Parcel in) { return new CellSignalStrengthTdscdma(in); } @Override - public CellSignalStrengthTdscdma[] newArray(int size) { + public @NonNull CellSignalStrengthTdscdma[] newArray(int size) { return new CellSignalStrengthTdscdma[size]; } }; diff --git a/telephony/java/android/telephony/INetworkService.aidl b/telephony/java/android/telephony/INetworkService.aidl index 67e5650ab359..3a9c3a5bd45d 100644 --- a/telephony/java/android/telephony/INetworkService.aidl +++ b/telephony/java/android/telephony/INetworkService.aidl @@ -25,7 +25,7 @@ oneway interface INetworkService { void createNetworkServiceProvider(int slotId); void removeNetworkServiceProvider(int slotId); - void getNetworkRegistrationInfo(int slotId, int domain, INetworkServiceCallback callback); + void requestNetworkRegistrationInfo(int slotId, int domain, INetworkServiceCallback callback); void registerForNetworkRegistrationInfoChanged(int slotId, INetworkServiceCallback callback); void unregisterForNetworkRegistrationInfoChanged(int slotId, INetworkServiceCallback callback); } diff --git a/telephony/java/android/telephony/INetworkServiceCallback.aidl b/telephony/java/android/telephony/INetworkServiceCallback.aidl index 33b3ac0940b5..c35986c65f37 100644 --- a/telephony/java/android/telephony/INetworkServiceCallback.aidl +++ b/telephony/java/android/telephony/INetworkServiceCallback.aidl @@ -24,6 +24,6 @@ import android.telephony.NetworkRegistrationInfo; */ oneway interface INetworkServiceCallback { - void onGetNetworkRegistrationInfoComplete(int result, in NetworkRegistrationInfo state); + void onRequestNetworkRegistrationInfoComplete(int result, in NetworkRegistrationInfo state); void onNetworkStateChanged(); } diff --git a/telephony/java/android/telephony/JapanesePhoneNumberFormatter.java b/telephony/java/android/telephony/JapanesePhoneNumberFormatter.java index f5e53ef1ee5d..92a674c57688 100644 --- a/telephony/java/android/telephony/JapanesePhoneNumberFormatter.java +++ b/telephony/java/android/telephony/JapanesePhoneNumberFormatter.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.UnsupportedAppUsage; import android.text.Editable; /* @@ -154,6 +155,7 @@ import android.text.Editable; -35, -35, -35, -35, -35, -35, -35, -35, -35, -45, -26, -15, -15, -15, -15, -15, -15, -15, -15, -15}; + @UnsupportedAppUsage public static void format(Editable text) { // Here, "root" means the position of "'": // 0'3, 0'90, and +81'-90 diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java index bc989dd8c5ad..8c5e10788b89 100644 --- a/telephony/java/android/telephony/NetworkService.java +++ b/telephony/java/android/telephony/NetworkService.java @@ -18,6 +18,7 @@ package android.telephony; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.app.Service; import android.content.Intent; @@ -54,7 +55,8 @@ public abstract class NetworkService extends Service { private final String TAG = NetworkService.class.getSimpleName(); - public static final String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService"; + @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + public static final String SERVICE_INTERFACE = "android.telephony.NetworkService"; private static final int NETWORK_SERVICE_CREATE_NETWORK_SERVICE_PROVIDER = 1; private static final int NETWORK_SERVICE_REMOVE_NETWORK_SERVICE_PROVIDER = 2; @@ -104,13 +106,14 @@ public abstract class NetworkService extends Service { } /** - * API to get network registration info. The result will be passed to the callback. + * Request network registration info. The result will be passed to the callback. + * * @param domain Network domain * @param callback The callback for reporting network registration info */ - public void getNetworkRegistrationInfo(@Domain int domain, - @NonNull NetworkServiceCallback callback) { - callback.onGetNetworkRegistrationInfoComplete( + public void requestNetworkRegistrationInfo(@Domain int domain, + @NonNull NetworkServiceCallback callback) { + callback.onRequestNetworkRegistrationInfoComplete( NetworkServiceCallback.RESULT_ERROR_UNSUPPORTED, null); } @@ -192,7 +195,7 @@ public abstract class NetworkService extends Service { case NETWORK_SERVICE_GET_REGISTRATION_INFO: if (serviceProvider == null) break; int domainId = message.arg2; - serviceProvider.getNetworkRegistrationInfo(domainId, + serviceProvider.requestNetworkRegistrationInfo(domainId, new NetworkServiceCallback(callback)); break; @@ -231,14 +234,15 @@ public abstract class NetworkService extends Service { * will call this method after binding the network service for each active SIM slot id. * * @param slotIndex SIM slot id the network service associated with. - * @return Network service object + * @return Network service object. Null if failed to create the provider (e.g. invalid slot + * index) */ @Nullable public abstract NetworkServiceProvider onCreateNetworkServiceProvider(int slotIndex); @Override public IBinder onBind(Intent intent) { - if (intent == null || !NETWORK_SERVICE_INTERFACE.equals(intent.getAction())) { + if (intent == null || !SERVICE_INTERFACE.equals(intent.getAction())) { loge("Unexpected intent " + intent); return null; } @@ -280,8 +284,8 @@ public abstract class NetworkService extends Service { } @Override - public void getNetworkRegistrationInfo( - int slotIndex, int domain, INetworkServiceCallback callback) { + public void requestNetworkRegistrationInfo(int slotIndex, int domain, + INetworkServiceCallback callback) { mHandler.obtainMessage(NETWORK_SERVICE_GET_REGISTRATION_INFO, slotIndex, domain, callback).sendToTarget(); } diff --git a/telephony/java/android/telephony/NetworkServiceCallback.java b/telephony/java/android/telephony/NetworkServiceCallback.java index cc2524000091..1c64bcd28966 100644 --- a/telephony/java/android/telephony/NetworkServiceCallback.java +++ b/telephony/java/android/telephony/NetworkServiceCallback.java @@ -28,9 +28,9 @@ import java.lang.ref.WeakReference; /** * Network service callback. Object of this class is passed to NetworkServiceProvider upon - * calling getNetworkRegistrationInfo, to receive asynchronous feedback from NetworkServiceProvider - * upon onGetNetworkRegistrationInfoComplete. It's like a wrapper of INetworkServiceCallback - * because INetworkServiceCallback can't be a parameter type in public APIs. + * calling requestNetworkRegistrationInfo, to receive asynchronous feedback from + * NetworkServiceProvider upon onRequestNetworkRegistrationInfoComplete. It's like a wrapper of + * INetworkServiceCallback because INetworkServiceCallback can't be a parameter type in public APIs. * * @hide */ @@ -70,20 +70,20 @@ public class NetworkServiceCallback { /** * Called to indicate result of - * {@link NetworkServiceProvider#getNetworkRegistrationInfo(int, NetworkServiceCallback)} + * {@link NetworkServiceProvider#requestNetworkRegistrationInfo(int, NetworkServiceCallback)} * * @param result Result status like {@link NetworkServiceCallback#RESULT_SUCCESS} or - * {@link NetworkServiceCallback#RESULT_ERROR_UNSUPPORTED} + * {@link NetworkServiceCallback#RESULT_ERROR_UNSUPPORTED} * @param state The state information to be returned to callback. */ - public void onGetNetworkRegistrationInfoComplete(int result, - @Nullable NetworkRegistrationInfo state) { + public void onRequestNetworkRegistrationInfoComplete(int result, + @Nullable NetworkRegistrationInfo state) { INetworkServiceCallback callback = mCallback.get(); if (callback != null) { try { - callback.onGetNetworkRegistrationInfoComplete(result, state); + callback.onRequestNetworkRegistrationInfoComplete(result, state); } catch (RemoteException e) { - Rlog.e(mTag, "Failed to onGetNetworkRegistrationInfoComplete on the remote"); + Rlog.e(mTag, "Failed to onRequestNetworkRegistrationInfoComplete on the remote"); } } else { Rlog.e(mTag, "Weak reference of callback is null."); diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 30dcaa0091d2..df31f50d28a4 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -1586,7 +1586,7 @@ public class ServiceState implements Parcelable { == NetworkRegistrationInfo.REGISTRATION_STATE_HOME) { // If the device is on IWLAN, return IWLAN as the network type. This is to simulate the // behavior of legacy mode device. In the future caller should use - // getNetworkRegistrationInfo() to retrieve the actual data network type on cellular + // requestNetworkRegistrationInfo() to retrieve the actual data network type on cellular // or on IWLAN. return iwlanRegState.getAccessNetworkTechnology(); } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1eb6cc35848a..244d622930bb 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -5296,7 +5296,6 @@ public class TelephonyManager { */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi - @Nullable public boolean iccCloseLogicalChannelBySlot(int slotIndex, int channel) { try { ITelephony telephony = getITelephony(); @@ -5373,8 +5372,8 @@ public class TelephonyManager { * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU * is sent to the SIM. * @param data Data to be sent with the APDU. - * @return The APDU response from the ICC card with the status appended at - * the end. + * @return The APDU response from the ICC card with the status appended at the end, or null if + * there is an issue connecting to the Telephony service. * @hide */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java index 0622cddcbb99..17699d70cb18 100644 --- a/telephony/java/android/telephony/data/DataCallResponse.java +++ b/telephony/java/android/telephony/data/DataCallResponse.java @@ -17,16 +17,21 @@ package android.telephony.data; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.net.LinkAddress; import android.os.Parcel; import android.os.Parcelable; +import android.telephony.DataFailCause; +import android.telephony.DataFailCause.FailCause; import android.telephony.data.ApnSetting.ProtocolType; import com.android.internal.annotations.VisibleForTesting; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; @@ -39,83 +44,114 @@ import java.util.Objects; */ @SystemApi public final class DataCallResponse implements Parcelable { - private final int mStatus; + + /** {@hide} */ + @IntDef(prefix = "LINK_STATUS_", value = { + LINK_STATUS_UNKNOWN, + LINK_STATUS_INACTIVE, + LINK_STATUS_DORMANT, + LINK_STATUS_ACTIVE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface LinkStatus {} + + /** Unknown status */ + public static final int LINK_STATUS_UNKNOWN = -1; + + /** Indicates the data connection is inactive. */ + public static final int LINK_STATUS_INACTIVE = 0; + + /** Indicates the data connection is active with physical link dormant. */ + public static final int LINK_STATUS_DORMANT = 1; + + /** Indicates the data connection is active with physical link up. */ + public static final int LINK_STATUS_ACTIVE = 2; + + private final @FailCause int mCause; private final int mSuggestedRetryTime; - private final int mCid; - private final int mActive; - private final int mProtocolType; - private final String mIfname; + private final int mId; + private final @LinkStatus int mLinkStatus; + private final @ProtocolType int mProtocolType; + private final String mInterfaceName; private final List<LinkAddress> mAddresses; - private final List<InetAddress> mDnses; - private final List<InetAddress> mGateways; - private final List<String> mPcscfs; + private final List<InetAddress> mDnsAddresses; + private final List<InetAddress> mGatewayAddresses; + private final List<InetAddress> mPcscfAddresses; private final int mMtu; /** - * @param status Data call fail cause. 0 indicates no error. + * @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error. * @param suggestedRetryTime The suggested data retry time in milliseconds. - * @param cid The unique id of the data connection. - * @param active Data connection active status. 0 = inactive, 1 = dormant, 2 = active. + * @param id The unique id of the data connection. + * @param linkStatus Data connection link status. * @param protocolType The connection protocol, should be one of the PDP_type values in 3GPP - * TS 27.007 section 10.1.1. For example, "IP", "IPV6", "IPV4V6", or "PPP". - * @param ifname The network interface name. + * TS 27.007 section 10.1.1. For example, "IP", "IPV6", "IPV4V6", or "PPP". + * @param interfaceName The network interface name. * @param addresses A list of addresses with optional "/" prefix length, e.g., - * "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64". Typically 1 IPv4 or 1 IPv6 or - * one of each. If the prefix length is absent the addresses are assumed to be - * point to point with IPv4 having a prefix length of 32 and IPv6 128. - * @param dnses A list of DNS server addresses, e.g., "192.0.1.3" or - * "192.0.1.11 2001:db8::1". Null if no dns server addresses returned. - * @param gateways A list of default gateway addresses, e.g., "192.0.1.3" or - * "192.0.1.11 2001:db8::1". When null, the addresses represent point to point - * connections. - * @param pcscfs A list of Proxy Call State Control Function address via PCO(Protocol - * Configuration Option) for IMS client. - * @param mtu MTU (Maximum transmission unit) received from network Value <= 0 means network has - * either not sent a value or sent an invalid value. + * "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64". Typically 1 IPv4 or 1 IPv6 or + * one of each. If the prefix length is absent the addresses are assumed to be + * point to point with IPv4 having a prefix length of 32 and IPv6 128. + * @param dnsAddresses A list of DNS server addresses, e.g., "192.0.1.3" or + * "192.0.1.11 2001:db8::1". Null if no dns server addresses returned. + * @param gatewayAddresses A list of default gateway addresses, e.g., "192.0.1.3" or + * "192.0.1.11 2001:db8::1". When null, the addresses represent point to point connections. + * @param pcscfAddresses A list of Proxy Call State Control Function address via PCO (Protocol + * Configuration Option) for IMS client. + * @param mtu MTU (maximum transmission unit) in bytes received from network. Zero or negative + * values means network has either not sent a value or sent an invalid value. + * either not sent a value or sent an invalid value. + * + * @removed Use the {@link Builder()} instead. */ - public DataCallResponse(int status, int suggestedRetryTime, int cid, int active, - @ProtocolType int protocolType, @Nullable String ifname, + public DataCallResponse(@FailCause int cause, int suggestedRetryTime, int id, + @LinkStatus int linkStatus, + @ProtocolType int protocolType, @Nullable String interfaceName, @Nullable List<LinkAddress> addresses, - @Nullable List<InetAddress> dnses, - @Nullable List<InetAddress> gateways, - @Nullable List<String> pcscfs, int mtu) { - mStatus = status; + @Nullable List<InetAddress> dnsAddresses, + @Nullable List<InetAddress> gatewayAddresses, + @Nullable List<InetAddress> pcscfAddresses, int mtu) { + mCause = cause; mSuggestedRetryTime = suggestedRetryTime; - mCid = cid; - mActive = active; + mId = id; + mLinkStatus = linkStatus; mProtocolType = protocolType; - mIfname = (ifname == null) ? "" : ifname; - mAddresses = (addresses == null) ? new ArrayList<>() : addresses; - mDnses = (dnses == null) ? new ArrayList<>() : dnses; - mGateways = (gateways == null) ? new ArrayList<>() : gateways; - mPcscfs = (pcscfs == null) ? new ArrayList<>() : pcscfs; + mInterfaceName = (interfaceName == null) ? "" : interfaceName; + mAddresses = (addresses == null) + ? new ArrayList<>() : new ArrayList<>(addresses); + mDnsAddresses = (dnsAddresses == null) + ? new ArrayList<>() : new ArrayList<>(dnsAddresses); + mGatewayAddresses = (gatewayAddresses == null) + ? new ArrayList<>() : new ArrayList<>(gatewayAddresses); + mPcscfAddresses = (pcscfAddresses == null) + ? new ArrayList<>() : new ArrayList<>(pcscfAddresses); mMtu = mtu; } /** @hide */ @VisibleForTesting public DataCallResponse(Parcel source) { - mStatus = source.readInt(); + mCause = source.readInt(); mSuggestedRetryTime = source.readInt(); - mCid = source.readInt(); - mActive = source.readInt(); + mId = source.readInt(); + mLinkStatus = source.readInt(); mProtocolType = source.readInt(); - mIfname = source.readString(); + mInterfaceName = source.readString(); mAddresses = new ArrayList<>(); source.readList(mAddresses, LinkAddress.class.getClassLoader()); - mDnses = new ArrayList<>(); - source.readList(mDnses, InetAddress.class.getClassLoader()); - mGateways = new ArrayList<>(); - source.readList(mGateways, InetAddress.class.getClassLoader()); - mPcscfs = new ArrayList<>(); - source.readList(mPcscfs, InetAddress.class.getClassLoader()); + mDnsAddresses = new ArrayList<>(); + source.readList(mDnsAddresses, InetAddress.class.getClassLoader()); + mGatewayAddresses = new ArrayList<>(); + source.readList(mGatewayAddresses, InetAddress.class.getClassLoader()); + mPcscfAddresses = new ArrayList<>(); + source.readList(mPcscfAddresses, InetAddress.class.getClassLoader()); mMtu = source.readInt(); } /** - * @return Data call fail cause. 0 indicates no error. + * @return Data call fail cause. {@link DataFailCause#NONE} indicates no error. */ - public int getStatus() { return mStatus; } + @FailCause + public int getCause() { return mCause; } /** * @return The suggested data retry time in milliseconds. @@ -125,12 +161,12 @@ public final class DataCallResponse implements Parcelable { /** * @return The unique id of the data connection. */ - public int getCallId() { return mCid; } + public int getId() { return mId; } /** - * @return 0 = inactive, 1 = dormant, 2 = active. + * @return The link status */ - public int getActive() { return mActive; } + @LinkStatus public int getLinkStatus() { return mLinkStatus; } /** * @return The connection protocol type. @@ -139,13 +175,13 @@ public final class DataCallResponse implements Parcelable { public int getProtocolType() { return mProtocolType; } /** - * @return The network interface name. + * @return The network interface name (e.g. "rmnet_data1"). */ @NonNull - public String getIfname() { return mIfname; } + public String getInterfaceName() { return mInterfaceName; } /** - * @return A list of {@link LinkAddress} + * @return A list of addresses of this data connection. */ @NonNull public List<LinkAddress> getAddresses() { return mAddresses; } @@ -155,25 +191,25 @@ public final class DataCallResponse implements Parcelable { * "192.0.1.11 2001:db8::1". Empty list if no dns server addresses returned. */ @NonNull - public List<InetAddress> getDnses() { return mDnses; } + public List<InetAddress> getDnsAddresses() { return mDnsAddresses; } /** * @return A list of default gateway addresses, e.g., "192.0.1.3" or * "192.0.1.11 2001:db8::1". Empty list if the addresses represent point to point connections. */ @NonNull - public List<InetAddress> getGateways() { return mGateways; } + public List<InetAddress> getGatewayAddresses() { return mGatewayAddresses; } /** - * @return A list of Proxy Call State Control Function address via PCO(Protocol Configuration + * @return A list of Proxy Call State Control Function address via PCO (Protocol Configuration * Option) for IMS client. */ @NonNull - public List<String> getPcscfs() { return mPcscfs; } + public List<InetAddress> getPcscfAddresses() { return mPcscfAddresses; } /** - * @return MTU received from network Value <= 0 means network has either not sent a value or - * sent an invalid value + * @return MTU (maximum transmission unit) in bytes received from network. Zero or negative + * values means network has either not sent a value or sent an invalid value. */ public int getMtu() { return mMtu; } @@ -181,16 +217,16 @@ public final class DataCallResponse implements Parcelable { public String toString() { StringBuffer sb = new StringBuffer(); sb.append("DataCallResponse: {") - .append(" status=").append(mStatus) + .append(" cause=").append(mCause) .append(" retry=").append(mSuggestedRetryTime) - .append(" cid=").append(mCid) - .append(" active=").append(mActive) + .append(" cid=").append(mId) + .append(" linkStatus=").append(mLinkStatus) .append(" protocolType=").append(mProtocolType) - .append(" ifname=").append(mIfname) + .append(" ifname=").append(mInterfaceName) .append(" addresses=").append(mAddresses) - .append(" dnses=").append(mDnses) - .append(" gateways=").append(mGateways) - .append(" pcscf=").append(mPcscfs) + .append(" dnses=").append(mDnsAddresses) + .append(" gateways=").append(mGatewayAddresses) + .append(" pcscf=").append(mPcscfAddresses) .append(" mtu=").append(mMtu) .append("}"); return sb.toString(); @@ -200,32 +236,33 @@ public final class DataCallResponse implements Parcelable { public boolean equals (Object o) { if (this == o) return true; - if (o == null || !(o instanceof DataCallResponse)) { + if (!(o instanceof DataCallResponse)) { return false; } DataCallResponse other = (DataCallResponse) o; - return this.mStatus == other.mStatus + return this.mCause == other.mCause && this.mSuggestedRetryTime == other.mSuggestedRetryTime - && this.mCid == other.mCid - && this.mActive == other.mActive + && this.mId == other.mId + && this.mLinkStatus == other.mLinkStatus && this.mProtocolType == other.mProtocolType - && this.mIfname.equals(other.mIfname) + && this.mInterfaceName.equals(other.mInterfaceName) && mAddresses.size() == other.mAddresses.size() && mAddresses.containsAll(other.mAddresses) - && mDnses.size() == other.mDnses.size() - && mDnses.containsAll(other.mDnses) - && mGateways.size() == other.mGateways.size() - && mGateways.containsAll(other.mGateways) - && mPcscfs.size() == other.mPcscfs.size() - && mPcscfs.containsAll(other.mPcscfs) + && mDnsAddresses.size() == other.mDnsAddresses.size() + && mDnsAddresses.containsAll(other.mDnsAddresses) + && mGatewayAddresses.size() == other.mGatewayAddresses.size() + && mGatewayAddresses.containsAll(other.mGatewayAddresses) + && mPcscfAddresses.size() == other.mPcscfAddresses.size() + && mPcscfAddresses.containsAll(other.mPcscfAddresses) && mMtu == other.mMtu; } @Override public int hashCode() { - return Objects.hash(mStatus, mSuggestedRetryTime, mCid, mActive, mProtocolType, mIfname, - mAddresses, mDnses, mGateways, mPcscfs, mMtu); + return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType, + mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses, + mMtu); } @Override @@ -235,16 +272,16 @@ public final class DataCallResponse implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mStatus); + dest.writeInt(mCause); dest.writeInt(mSuggestedRetryTime); - dest.writeInt(mCid); - dest.writeInt(mActive); + dest.writeInt(mId); + dest.writeInt(mLinkStatus); dest.writeInt(mProtocolType); - dest.writeString(mIfname); + dest.writeString(mInterfaceName); dest.writeList(mAddresses); - dest.writeList(mDnses); - dest.writeList(mGateways); - dest.writeList(mPcscfs); + dest.writeList(mDnsAddresses); + dest.writeList(mGatewayAddresses); + dest.writeList(mPcscfAddresses); dest.writeInt(mMtu); } @@ -260,4 +297,183 @@ public final class DataCallResponse implements Parcelable { return new DataCallResponse[size]; } }; -}
\ No newline at end of file + + /** + * Provides a convenient way to set the fields of a {@link DataCallResponse} when creating a new + * instance. + * + * <p>The example below shows how you might create a new {@code DataCallResponse}: + * + * <pre><code> + * + * DataCallResponse response = new DataCallResponse.Builder() + * .setAddresses(Arrays.asList("192.168.1.2")) + * .setProtocolType(ApnSetting.PROTOCOL_IPV4V6) + * .build(); + * </code></pre> + */ + public static final class Builder { + private @FailCause int mCause; + + private int mSuggestedRetryTime; + + private int mId; + + private @LinkStatus int mLinkStatus; + + private @ProtocolType int mProtocolType; + + private String mInterfaceName; + + private List<LinkAddress> mAddresses; + + private List<InetAddress> mDnsAddresses; + + private List<InetAddress> mGatewayAddresses; + + private List<InetAddress> mPcscfAddresses; + + private int mMtu; + + /** + * Default constructor for Builder. + */ + public Builder() { + } + + /** + * Set data call fail cause. + * + * @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error. + * @return The same instance of the builder. + */ + public @NonNull Builder setCause(@FailCause int cause) { + mCause = cause; + return this; + } + + /** + * Set the suggested data retry time. + * + * @param suggestedRetryTime The suggested data retry time in milliseconds. + * @return The same instance of the builder. + */ + public @NonNull Builder setSuggestedRetryTime(int suggestedRetryTime) { + mSuggestedRetryTime = suggestedRetryTime; + return this; + } + + /** + * Set the unique id of the data connection. + * + * @param id The unique id of the data connection. + * @return The same instance of the builder. + */ + public @NonNull Builder setId(int id) { + mId = id; + return this; + } + + /** + * Set the link status + * + * @param linkStatus The link status + * @return The same instance of the builder. + */ + public @NonNull Builder setLinkStatus(@LinkStatus int linkStatus) { + mLinkStatus = linkStatus; + return this; + } + + /** + * Set the connection protocol type. + * + * @param protocolType The connection protocol type. + * @return The same instance of the builder. + */ + public @NonNull Builder setProtocolType(@ProtocolType int protocolType) { + mProtocolType = protocolType; + return this; + } + + /** + * Set the network interface name. + * + * @param interfaceName The network interface name (e.g. "rmnet_data1"). + * @return The same instance of the builder. + */ + public @NonNull Builder setInterfaceName(@NonNull String interfaceName) { + mInterfaceName = interfaceName; + return this; + } + + /** + * Set the addresses of this data connection. + * + * @param addresses The list of address of the data connection. + * @return The same instance of the builder. + */ + public @NonNull Builder setAddresses(@NonNull List<LinkAddress> addresses) { + mAddresses = addresses; + return this; + } + + /** + * Set the DNS addresses of this data connection + * + * @param dnsAddresses The list of DNS address of the data connection. + * @return The same instance of the builder. + */ + public @NonNull Builder setDnsAddresses(@NonNull List<InetAddress> dnsAddresses) { + mDnsAddresses = dnsAddresses; + return this; + } + + /** + * Set the gateway addresses of this data connection + * + * @param gatewayAddresses The list of gateway address of the data connection. + * @return The same instance of the builder. + */ + public @NonNull Builder setGatewayAddresses(@NonNull List<InetAddress> gatewayAddresses) { + mGatewayAddresses = gatewayAddresses; + return this; + } + + /** + * Set the Proxy Call State Control Function address via PCO(Protocol Configuration + * Option) for IMS client. + * + * @param pcscfAddresses The list of pcscf address of the data connection. + * @return The same instance of the builder. + */ + public @NonNull Builder setPcscfAddresses(@NonNull List<InetAddress> pcscfAddresses) { + mPcscfAddresses = pcscfAddresses; + return this; + } + + /** + * Set maximum transmission unit of the data connection. + * + * @param mtu MTU (maximum transmission unit) in bytes received from network. Zero or + * negative values means network has either not sent a value or sent an invalid value. + * + * @return The same instance of the builder. + */ + public @NonNull Builder setMtu(int mtu) { + mMtu = mtu; + return this; + } + + /** + * Build the DataCallResponse. + * + * @return the DataCallResponse object. + */ + public @NonNull DataCallResponse build() { + return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus, + mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, + mPcscfAddresses, mMtu); + } + } +} diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index bcb47f73cb4d..c53ade16cae4 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -34,6 +34,7 @@ import com.android.internal.telephony.RILConstants; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Objects; /** * Description of a mobile data profile used for establishing @@ -50,7 +51,7 @@ public final class DataProfile implements Parcelable { TYPE_COMMON, TYPE_3GPP, TYPE_3GPP2}) - public @interface DataProfileType {} + public @interface Type {} /** Common data profile */ public static final int TYPE_COMMON = 0; @@ -75,25 +76,25 @@ public final class DataProfile implements Parcelable { private final String mPassword; - @DataProfileType + @Type private final int mType; - private final int mMaxConnsTime; + private final int mMaxConnectionsTime; - private final int mMaxConns; + private final int mMaxConnections; private final int mWaitTime; private final boolean mEnabled; @ApnType - private final int mSupportedApnTypesBitmap; + private final int mSupportedApnTypesBitmask; @ProtocolType private final int mRoamingProtocolType; @NetworkTypeBitMask - private final int mBearerBitmap; + private final int mBearerBitmask; private final int mMtu; @@ -102,11 +103,13 @@ public final class DataProfile implements Parcelable { private final boolean mPreferred; /** @hide */ - public DataProfile(int profileId, String apn, @ProtocolType int protocolType, int authType, - String userName, String password, int type, int maxConnsTime, int maxConns, - int waitTime, boolean enabled, @ApnType int supportedApnTypesBitmap, - @ProtocolType int roamingProtocolType, @NetworkTypeBitMask int bearerBitmap, - int mtu, boolean persistent, boolean preferred) { + private DataProfile(int profileId, String apn, @ProtocolType int protocolType, int authType, + String userName, String password, int type, int maxConnectionsTime, + int maxConnections, int waitTime, boolean enabled, + @ApnType int supportedApnTypesBitmask, + @ProtocolType int roamingProtocolType, + @NetworkTypeBitMask int bearerBitmask, int mtu, boolean persistent, + boolean preferred) { this.mProfileId = profileId; this.mApn = apn; this.mProtocolType = protocolType; @@ -118,21 +121,19 @@ public final class DataProfile implements Parcelable { this.mUserName = userName; this.mPassword = password; this.mType = type; - this.mMaxConnsTime = maxConnsTime; - this.mMaxConns = maxConns; + this.mMaxConnectionsTime = maxConnectionsTime; + this.mMaxConnections = maxConnections; this.mWaitTime = waitTime; this.mEnabled = enabled; - - this.mSupportedApnTypesBitmap = supportedApnTypesBitmap; + this.mSupportedApnTypesBitmask = supportedApnTypesBitmask; this.mRoamingProtocolType = roamingProtocolType; - this.mBearerBitmap = bearerBitmap; + this.mBearerBitmask = bearerBitmask; this.mMtu = mtu; this.mPersistent = persistent; this.mPreferred = preferred; } - /** @hide */ - public DataProfile(Parcel source) { + private DataProfile(Parcel source) { mProfileId = source.readInt(); mApn = source.readString(); mProtocolType = source.readInt(); @@ -140,13 +141,13 @@ public final class DataProfile implements Parcelable { mUserName = source.readString(); mPassword = source.readString(); mType = source.readInt(); - mMaxConnsTime = source.readInt(); - mMaxConns = source.readInt(); + mMaxConnectionsTime = source.readInt(); + mMaxConnections = source.readInt(); mWaitTime = source.readInt(); mEnabled = source.readBoolean(); - mSupportedApnTypesBitmap = source.readInt(); + mSupportedApnTypesBitmask = source.readInt(); mRoamingProtocolType = source.readInt(); - mBearerBitmap = source.readInt(); + mBearerBitmask = source.readInt(); mMtu = source.readInt(); mPersistent = source.readBoolean(); mPreferred = source.readBoolean(); @@ -158,7 +159,8 @@ public final class DataProfile implements Parcelable { public int getProfileId() { return mProfileId; } /** - * @return The APN to establish data connection. + * @return The APN (Access Point Name) to establish data connection. This is a string + * specifically defined by the carrier. */ @NonNull public String getApn() { return mApn; } @@ -166,7 +168,7 @@ public final class DataProfile implements Parcelable { /** * @return The connection protocol defined in 3GPP TS 27.007 section 10.1.1. */ - public @ProtocolType int getProtocol() { return mProtocolType; } + public @ProtocolType int getProtocolType() { return mProtocolType; } /** * @return The authentication protocol used for this PDP context. @@ -188,22 +190,28 @@ public final class DataProfile implements Parcelable { /** * @return The profile type. */ - public @DataProfileType int getType() { return mType; } + public @Type int getType() { return mType; } /** * @return The period in seconds to limit the maximum connections. + * + * @hide */ - public int getMaxConnsTime() { return mMaxConnsTime; } + public int getMaxConnectionsTime() { return mMaxConnectionsTime; } /** * @return The maximum connections allowed. + * + * @hide */ - public int getMaxConns() { return mMaxConns; } + public int getMaxConnections() { return mMaxConnections; } /** * @return The required wait time in seconds after a successful UE initiated disconnect of a * given PDN connection before the device can send a new PDN connection request for that given * PDN. + * + * @hide */ public int getWaitTime() { return mWaitTime; } @@ -213,19 +221,19 @@ public final class DataProfile implements Parcelable { public boolean isEnabled() { return mEnabled; } /** - * @return The supported APN types bitmap. + * @return The supported APN types bitmask. */ - public @ApnType int getSupportedApnTypesBitmap() { return mSupportedApnTypesBitmap; } + public @ApnType int getSupportedApnTypesBitmask() { return mSupportedApnTypesBitmask; } /** * @return The connection protocol on roaming network defined in 3GPP TS 27.007 section 10.1.1. */ - public @ProtocolType int getRoamingProtocol() { return mRoamingProtocolType; } + public @ProtocolType int getRoamingProtocolType() { return mRoamingProtocolType; } /** - * @return The bearer bitmap indicating the applicable networks for this data profile. + * @return The bearer bitmask indicating the applicable networks for this data profile. */ - public @NetworkTypeBitMask int getBearerBitmap() { return mBearerBitmap; } + public @NetworkTypeBitMask int getBearerBitmask() { return mBearerBitmask; } /** * @return The maximum transmission unit (MTU) size in bytes. @@ -239,7 +247,8 @@ public final class DataProfile implements Parcelable { /** * @return {@code true} if this data profile was used to bring up the last default - * (i.e internet) data connection successfully. + * (i.e internet) data connection successfully, or the one chosen by the user in Settings' + * APN editor. For one carrier there can be only one profiled preferred. */ public boolean isPreferred() { return mPreferred; } @@ -253,19 +262,13 @@ public final class DataProfile implements Parcelable { return "DataProfile=" + mProfileId + "/" + mProtocolType + "/" + mAuthType + "/" + (Build.IS_USER ? "***/***/***" : (mApn + "/" + mUserName + "/" + mPassword)) + "/" + mType + "/" - + mMaxConnsTime + "/" + mMaxConns + "/" - + mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmap + "/" - + mRoamingProtocolType + "/" + mBearerBitmap + "/" + mMtu + "/" + mPersistent + "/" + + mMaxConnectionsTime + "/" + mMaxConnections + "/" + + mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmask + "/" + + mRoamingProtocolType + "/" + mBearerBitmask + "/" + mMtu + "/" + mPersistent + "/" + mPreferred; } @Override - public boolean equals(Object o) { - if (o instanceof DataProfile == false) return false; - return (o == this || toString().equals(o.toString())); - } - - @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mProfileId); dest.writeString(mApn); @@ -274,13 +277,13 @@ public final class DataProfile implements Parcelable { dest.writeString(mUserName); dest.writeString(mPassword); dest.writeInt(mType); - dest.writeInt(mMaxConnsTime); - dest.writeInt(mMaxConns); + dest.writeInt(mMaxConnectionsTime); + dest.writeInt(mMaxConnections); dest.writeInt(mWaitTime); dest.writeBoolean(mEnabled); - dest.writeInt(mSupportedApnTypesBitmap); + dest.writeInt(mSupportedApnTypesBitmask); dest.writeInt(mRoamingProtocolType); - dest.writeInt(mBearerBitmap); + dest.writeInt(mBearerBitmask); dest.writeInt(mMtu); dest.writeBoolean(mPersistent); dest.writeBoolean(mPreferred); @@ -298,4 +301,312 @@ public final class DataProfile implements Parcelable { return new DataProfile[size]; } }; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DataProfile that = (DataProfile) o; + return mProfileId == that.mProfileId + && mProtocolType == that.mProtocolType + && mAuthType == that.mAuthType + && mType == that.mType + && mMaxConnectionsTime == that.mMaxConnectionsTime + && mMaxConnections == that.mMaxConnections + && mWaitTime == that.mWaitTime + && mEnabled == that.mEnabled + && mSupportedApnTypesBitmask == that.mSupportedApnTypesBitmask + && mRoamingProtocolType == that.mRoamingProtocolType + && mBearerBitmask == that.mBearerBitmask + && mMtu == that.mMtu + && mPersistent == that.mPersistent + && mPreferred == that.mPreferred + && Objects.equals(mApn, that.mApn) + && Objects.equals(mUserName, that.mUserName) + && Objects.equals(mPassword, that.mPassword); + } + + @Override + public int hashCode() { + return Objects.hash(mProfileId, mApn, mProtocolType, mAuthType, mUserName, mPassword, mType, + mMaxConnectionsTime, mMaxConnections, mWaitTime, mEnabled, + mSupportedApnTypesBitmask, mRoamingProtocolType, mBearerBitmask, mMtu, mPersistent, + mPreferred); + } + + /** + * Provides a convenient way to set the fields of a {@link DataProfile} when creating a new + * instance. + * + * <p>The example below shows how you might create a new {@code DataProfile}: + * + * <pre><code> + * + * DataProfile dp = new DataProfile.Builder() + * .setApn("apn.xyz.com") + * .setProtocol(ApnSetting.PROTOCOL_IPV4V6) + * .build(); + * </code></pre> + */ + public static final class Builder { + private int mProfileId; + + private String mApn; + + @ProtocolType + private int mProtocolType; + + @AuthType + private int mAuthType; + + private String mUserName; + + private String mPassword; + + @Type + private int mType; + + private int mMaxConnectionsTime; + + private int mMaxConnections; + + private int mWaitTime; + + private boolean mEnabled; + + @ApnType + private int mSupportedApnTypesBitmask; + + @ProtocolType + private int mRoamingProtocolType; + + @NetworkTypeBitMask + private int mBearerBitmask; + + private int mMtu; + + private boolean mPersistent; + + private boolean mPreferred; + + /** + * Default constructor for Builder. + */ + public Builder() { + } + + /** + * Set profile id. Note that this is not a global unique id of the data profile. This id + * is only used by certain CDMA carriers to identify the type of data profile. + * + * @param profileId Network domain. + * @return The same instance of the builder. + */ + public @NonNull Builder setProfileId(int profileId) { + mProfileId = profileId; + return this; + } + + /** + * Set the APN (Access Point Name) to establish data connection. This is a string + * specifically defined by the carrier. + * + * @param apn Access point name + * @return The same instance of the builder. + */ + public @NonNull Builder setApn(@NonNull String apn) { + mApn = apn; + return this; + } + + /** + * Set the connection protocol type. + * + * @param protocolType The connection protocol defined in 3GPP TS 27.007 section 10.1.1. + * @return The same instance of the builder. + */ + public @NonNull Builder setProtocolType(@ProtocolType int protocolType) { + mProtocolType = protocolType; + return this; + } + + /** + * Set the authentication type. + * + * @param authType The authentication type + * @return The same instance of the builder. + */ + public @NonNull Builder setAuthType(@AuthType int authType) { + mAuthType = authType; + return this; + } + + /** + * Set the user name + * + * @param userName The user name + * @return The same instance of the builder. + */ + public @NonNull Builder setUserName(@NonNull String userName) { + mUserName = userName; + return this; + } + + /** + * Set the password + * + * @param password The password + * @return The same instance of the builder. + */ + public @NonNull Builder setPassword(@NonNull String password) { + mPassword = password; + return this; + } + + /** + * Set the type + * + * @param type The profile type + * @return The same instance of the builder. + */ + public @NonNull Builder setType(@Type int type) { + mType = type; + return this; + } + + /** + * Set the period in seconds to limit the maximum connections. + * + * @param maxConnectionsTime The profile type + * @return The same instance of the builder. + * + * @hide + */ + public @NonNull Builder setMaxConnectionsTime(int maxConnectionsTime) { + mMaxConnectionsTime = maxConnectionsTime; + return this; + } + + /** + * Set the maximum connections allowed. + * + * @param maxConnections The maximum connections allowed. + * @return The same instance of the builder. + * + * @hide + */ + public @NonNull Builder setMaxConnections(int maxConnections) { + mMaxConnections = maxConnections; + return this; + } + + /** + * Set the period in seconds to limit the maximum connections. + * + * @param waitTime The required wait time in seconds after a successful UE initiated + * disconnect of a given PDN connection before the device can send a new PDN connection + * request for that given PDN. + * + * @return The same instance of the builder. + * + * @hide + */ + public @NonNull Builder setWaitTime(int waitTime) { + mWaitTime = waitTime; + return this; + } + + /** + * Enable the data profile + * + * @param isEnabled {@code true} to enable the data profile, otherwise disable. + * @return The same instance of the builder. + */ + public @NonNull Builder enable(boolean isEnabled) { + mEnabled = isEnabled; + return this; + } + + /** + * Set the supported APN types bitmask. + * + * @param supportedApnTypesBitmask The supported APN types bitmask. + * @return The same instance of the builder. + */ + public @NonNull Builder setSupportedApnTypesBitmask(@ApnType int supportedApnTypesBitmask) { + mSupportedApnTypesBitmask = supportedApnTypesBitmask; + return this; + } + + /** + * Set the connection protocol type for roaming. + * + * @param protocolType The connection protocol defined in 3GPP TS 27.007 section 10.1.1. + * @return The same instance of the builder. + */ + public @NonNull Builder setRoamingProtocolType(@ProtocolType int protocolType) { + mRoamingProtocolType = protocolType; + return this; + } + + /** + * Set the bearer bitmask indicating the applicable networks for this data profile. + * + * @param bearerBitmask The bearer bitmask indicating the applicable networks for this data + * profile. + * @return The same instance of the builder. + */ + public @NonNull Builder setBearerBitmask(@NetworkTypeBitMask int bearerBitmask) { + mBearerBitmask = bearerBitmask; + return this; + } + + /** + * Set the maximum transmission unit (MTU) size in bytes. + * + * @param mtu The maximum transmission unit (MTU) size in bytes. + * @return The same instance of the builder. + */ + public @NonNull Builder setMtu(int mtu) { + mMtu = mtu; + return this; + } + + /** + * Set data profile as preferred/non-preferred. + * + * @param isPreferred {@code true} if this data profile was used to bring up the last + * default (i.e internet) data connection successfully, or the one chosen by the user in + * Settings' APN editor. For one carrier there can be only one profiled preferred. + * @return The same instance of the builder. + */ + public @NonNull Builder setPreferred(boolean isPreferred) { + mPreferred = isPreferred; + return this; + } + + /** + * Set data profile as persistent/non-persistent + * + * @param isPersistent {@code true} if this data profile was used to bring up the last + * default (i.e internet) data connection successfully. + * @return The same instance of the builder. + */ + public @NonNull Builder setPersistent(boolean isPersistent) { + mPersistent = isPersistent; + return this; + } + + /** + * Build the DataProfile object + * + * @return The data profile object + */ + public @NonNull DataProfile build() { + return new DataProfile(mProfileId, mApn, mProtocolType, mAuthType, mUserName, mPassword, + mType, mMaxConnectionsTime, mMaxConnections, mWaitTime, mEnabled, + mSupportedApnTypesBitmask, mRoamingProtocolType, mBearerBitmask, mMtu, + mPersistent, mPreferred); + } + } } diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java index 59d1e1e7115a..372bdf1c0f81 100644 --- a/telephony/java/android/telephony/data/DataService.java +++ b/telephony/java/android/telephony/data/DataService.java @@ -19,6 +19,7 @@ package android.telephony.data; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.app.Service; import android.content.Intent; @@ -58,10 +59,12 @@ import java.util.List; public abstract class DataService extends Service { private static final String TAG = DataService.class.getSimpleName(); - public static final String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService"; + @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + public static final String SERVICE_INTERFACE = "android.telephony.data.DataService"; /** {@hide} */ @IntDef(prefix = "REQUEST_REASON_", value = { + REQUEST_REASON_UNKNOWN, REQUEST_REASON_NORMAL, REQUEST_REASON_HANDOVER, }) @@ -70,6 +73,7 @@ public abstract class DataService extends Service { /** {@hide} */ @IntDef(prefix = "REQUEST_REASON_", value = { + REQUEST_REASON_UNKNOWN, REQUEST_REASON_NORMAL, REQUEST_REASON_SHUTDOWN, REQUEST_REASON_HANDOVER, @@ -77,6 +81,8 @@ public abstract class DataService extends Service { @Retention(RetentionPolicy.SOURCE) public @interface DeactivateDataReason {} + /** The reason of the data request is unknown */ + public static final int REQUEST_REASON_UNKNOWN = 0; /** The reason of the data request is normal */ public static final int REQUEST_REASON_NORMAL = 1; @@ -94,7 +100,7 @@ public abstract class DataService extends Service { private static final int DATA_SERVICE_REQUEST_DEACTIVATE_DATA_CALL = 5; private static final int DATA_SERVICE_REQUEST_SET_INITIAL_ATTACH_APN = 6; private static final int DATA_SERVICE_REQUEST_SET_DATA_PROFILE = 7; - private static final int DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST = 8; + private static final int DATA_SERVICE_REQUEST_REQUEST_DATA_CALL_LIST = 8; private static final int DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED = 9; private static final int DATA_SERVICE_REQUEST_UNREGISTER_DATA_CALL_LIST_CHANGED = 10; private static final int DATA_SERVICE_INDICATION_DATA_CALL_LIST_CHANGED = 11; @@ -149,14 +155,13 @@ public abstract class DataService extends Service { * {@link #REQUEST_REASON_HANDOVER}. * @param linkProperties If {@code reason} is {@link #REQUEST_REASON_HANDOVER}, this is the * link properties of the existing data connection, otherwise null. - * @param callback The result callback for this request. Null if the client does not care - * about the result. + * @param callback The result callback for this request. */ public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile, boolean isRoaming, boolean allowRoaming, @SetupDataReason int reason, @Nullable LinkProperties linkProperties, - @Nullable DataServiceCallback callback) { + @NonNull DataServiceCallback callback) { // The default implementation is to return unsupported. if (callback != null) { callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, @@ -190,11 +195,10 @@ public abstract class DataService extends Service { * * @param dataProfile Data profile used for data call setup. See {@link DataProfile}. * @param isRoaming True if the device is data roaming. - * @param callback The result callback for this request. Null if the client does not care - * about the result. + * @param callback The result callback for this request. */ public void setInitialAttachApn(@NonNull DataProfile dataProfile, boolean isRoaming, - @Nullable DataServiceCallback callback) { + @NonNull DataServiceCallback callback) { // The default implementation is to return unsupported. if (callback != null) { callback.onSetInitialAttachApnComplete( @@ -209,11 +213,10 @@ public abstract class DataService extends Service { * * @param dps A list of data profiles. * @param isRoaming True if the device is data roaming. - * @param callback The result callback for this request. Null if the client does not care - * about the result. + * @param callback The result callback for this request. */ public void setDataProfile(@NonNull List<DataProfile> dps, boolean isRoaming, - @Nullable DataServiceCallback callback) { + @NonNull DataServiceCallback callback) { // The default implementation is to return unsupported. if (callback != null) { callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); @@ -225,9 +228,10 @@ public abstract class DataService extends Service { * * @param callback The result callback for this request. */ - public void getDataCallList(@NonNull DataServiceCallback callback) { + public void requestDataCallList(@NonNull DataServiceCallback callback) { // The default implementation is to return unsupported. - callback.onGetDataCallListComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, null); + callback.onRequestDataCallListComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, + null); } private void registerForDataCallListChanged(IDataServiceCallback callback) { @@ -409,10 +413,10 @@ public abstract class DataService extends Service { ? new DataServiceCallback(setDataProfileRequest.callback) : null); break; - case DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST: + case DATA_SERVICE_REQUEST_REQUEST_DATA_CALL_LIST: if (serviceProvider == null) break; - serviceProvider.getDataCallList(new DataServiceCallback( + serviceProvider.requestDataCallList(new DataServiceCallback( (IDataServiceCallback) message.obj)); break; case DATA_SERVICE_REQUEST_REGISTER_DATA_CALL_LIST_CHANGED: @@ -455,14 +459,14 @@ public abstract class DataService extends Service { * will call this method after binding the data service for each active SIM slot id. * * @param slotIndex SIM slot id the data service associated with. - * @return Data service object + * @return Data service object. Null if failed to create the provider (e.g. invalid slot index) */ @Nullable public abstract DataServiceProvider onCreateDataServiceProvider(int slotIndex); @Override public IBinder onBind(Intent intent) { - if (intent == null || !DATA_SERVICE_INTERFACE.equals(intent.getAction())) { + if (intent == null || !SERVICE_INTERFACE.equals(intent.getAction())) { loge("Unexpected intent " + intent); return null; } @@ -531,12 +535,12 @@ public abstract class DataService extends Service { } @Override - public void getDataCallList(int slotIndex, IDataServiceCallback callback) { + public void requestDataCallList(int slotIndex, IDataServiceCallback callback) { if (callback == null) { - loge("getDataCallList: callback is null"); + loge("requestDataCallList: callback is null"); return; } - mHandler.obtainMessage(DATA_SERVICE_REQUEST_GET_DATA_CALL_LIST, slotIndex, 0, + mHandler.obtainMessage(DATA_SERVICE_REQUEST_REQUEST_DATA_CALL_LIST, slotIndex, 0, callback).sendToTarget(); } diff --git a/telephony/java/android/telephony/data/DataServiceCallback.java b/telephony/java/android/telephony/data/DataServiceCallback.java index 2d0cfe80366c..5d8d79367ba4 100644 --- a/telephony/java/android/telephony/data/DataServiceCallback.java +++ b/telephony/java/android/telephony/data/DataServiceCallback.java @@ -140,21 +140,21 @@ public class DataServiceCallback { } /** - * Called to indicate result for the request {@link DataServiceProvider#getDataCallList( + * Called to indicate result for the request {@link DataServiceProvider#requestDataCallList( * DataServiceCallback)}. * * @param result The result code. Must be one of the {@link ResultCode}. * @param dataCallList List of the current active data connection. If no data call is presented, * set it to an empty list. */ - public void onGetDataCallListComplete(@ResultCode int result, - @NonNull List<DataCallResponse> dataCallList) { + public void onRequestDataCallListComplete(@ResultCode int result, + @NonNull List<DataCallResponse> dataCallList) { IDataServiceCallback callback = mCallback.get(); if (callback != null) { try { - callback.onGetDataCallListComplete(result, dataCallList); + callback.onRequestDataCallListComplete(result, dataCallList); } catch (RemoteException e) { - Rlog.e(TAG, "Failed to onGetDataCallListComplete on the remote"); + Rlog.e(TAG, "Failed to onRequestDataCallListComplete on the remote"); } } } diff --git a/telephony/java/android/telephony/data/IDataService.aidl b/telephony/java/android/telephony/data/IDataService.aidl index d4d9be85ffa8..9c74dcccec54 100644 --- a/telephony/java/android/telephony/data/IDataService.aidl +++ b/telephony/java/android/telephony/data/IDataService.aidl @@ -35,7 +35,7 @@ oneway interface IDataService IDataServiceCallback callback); void setDataProfile(int slotId, in List<DataProfile> dps, boolean isRoaming, IDataServiceCallback callback); - void getDataCallList(int slotId, IDataServiceCallback callback); + void requestDataCallList(int slotId, IDataServiceCallback callback); void registerForDataCallListChanged(int slotId, IDataServiceCallback callback); void unregisterForDataCallListChanged(int slotId, IDataServiceCallback callback); } diff --git a/telephony/java/android/telephony/data/IDataServiceCallback.aidl b/telephony/java/android/telephony/data/IDataServiceCallback.aidl index 856185b2974f..cec757d23988 100644 --- a/telephony/java/android/telephony/data/IDataServiceCallback.aidl +++ b/telephony/java/android/telephony/data/IDataServiceCallback.aidl @@ -28,6 +28,6 @@ oneway interface IDataServiceCallback void onDeactivateDataCallComplete(int result); void onSetInitialAttachApnComplete(int result); void onSetDataProfileComplete(int result); - void onGetDataCallListComplete(int result, in List<DataCallResponse> dataCallList); + void onRequestDataCallListComplete(int result, in List<DataCallResponse> dataCallList); void onDataCallListChanged(in List<DataCallResponse> dataCallList); } diff --git a/telephony/java/android/telephony/data/IQualifiedNetworksService.aidl b/telephony/java/android/telephony/data/IQualifiedNetworksService.aidl index 9c80cb77e435..3bf09bc19788 100644 --- a/telephony/java/android/telephony/data/IQualifiedNetworksService.aidl +++ b/telephony/java/android/telephony/data/IQualifiedNetworksService.aidl @@ -23,6 +23,6 @@ import android.telephony.data.IQualifiedNetworksServiceCallback; */ interface IQualifiedNetworksService { - oneway void createNetworkAvailabilityUpdater(int slotId, IQualifiedNetworksServiceCallback callback); - oneway void removeNetworkAvailabilityUpdater(int slotId); + oneway void createNetworkAvailabilityProvider(int slotId, IQualifiedNetworksServiceCallback callback); + oneway void removeNetworkAvailabilityProvider(int slotId); } diff --git a/telephony/java/android/telephony/data/QualifiedNetworksService.java b/telephony/java/android/telephony/data/QualifiedNetworksService.java index c38f2788ca92..0e1751d50949 100644 --- a/telephony/java/android/telephony/data/QualifiedNetworksService.java +++ b/telephony/java/android/telephony/data/QualifiedNetworksService.java @@ -17,7 +17,6 @@ package android.telephony.data; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.Service; import android.content.Intent; @@ -34,14 +33,21 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; +import java.util.List; + /** - * Base class of the qualified networks service. Services that extend QualifiedNetworksService must - * register the service in their AndroidManifest to be detected by the framework. They must be - * protected by the permission "android.permission.BIND_TELEPHONY_QUALIFIED_NETWORKS_SERVICE". - * The qualified networks service definition in the manifest must follow the following format: + * Base class of the qualified networks service, which is a vendor service providing up-to-date + * qualified network information to the frameworks for data handover control. A qualified network + * is defined as an access network that is ready for bringing up data connection for given APN + * types. + * + * Services that extend QualifiedNetworksService must register the service in their AndroidManifest + * to be detected by the framework. They must be protected by the permission + * "android.permission.BIND_TELEPHONY_DATA_SERVICE". The qualified networks service definition in + * the manifest must follow the following format: * ... * <service android:name=".xxxQualifiedNetworksService" - * android:permission="android.permission.BIND_TELEPHONY_QUALIFIED_NETWORKS_SERVICE" > + * android:permission="android.permission.BIND_TELEPHONY_DATA_SERVICE" > * <intent-filter> * <action android:name="android.telephony.data.QualifiedNetworksService" /> * </intent-filter> @@ -55,28 +61,28 @@ public abstract class QualifiedNetworksService extends Service { public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService"; - private static final int QNS_CREATE_NETWORK_AVAILABILITY_UPDATER = 1; - private static final int QNS_REMOVE_NETWORK_AVAILABILITY_UPDATER = 2; - private static final int QNS_REMOVE_ALL_NETWORK_AVAILABILITY_UPDATERS = 3; + private static final int QNS_CREATE_NETWORK_AVAILABILITY_PROVIDER = 1; + private static final int QNS_REMOVE_NETWORK_AVAILABILITY_PROVIDER = 2; + private static final int QNS_REMOVE_ALL_NETWORK_AVAILABILITY_PROVIDERS = 3; private static final int QNS_UPDATE_QUALIFIED_NETWORKS = 4; private final HandlerThread mHandlerThread; private final QualifiedNetworksServiceHandler mHandler; - private final SparseArray<NetworkAvailabilityUpdater> mUpdaters = new SparseArray<>(); + private final SparseArray<NetworkAvailabilityProvider> mProviders = new SparseArray<>(); /** @hide */ @VisibleForTesting public final IQualifiedNetworksServiceWrapper mBinder = new IQualifiedNetworksServiceWrapper(); /** - * The abstract class of the network availability updater implementation. The vendor qualified + * The abstract class of the network availability provider implementation. The vendor qualified * network service must extend this class to report the available networks for data - * connection setup. Note that each instance of network availability updater is associated with + * connection setup. Note that each instance of network availability provider is associated with * one physical SIM slot. */ - public abstract class NetworkAvailabilityUpdater implements AutoCloseable { + public abstract class NetworkAvailabilityProvider implements AutoCloseable { private final int mSlotIndex; private IQualifiedNetworksServiceCallback mCallback; @@ -89,14 +95,14 @@ public abstract class QualifiedNetworksService extends Service { /** * Constructor - * @param slotIndex SIM slot index the network availability updater associated with. + * @param slotIndex SIM slot index the network availability provider associated with. */ - public NetworkAvailabilityUpdater(int slotIndex) { + public NetworkAvailabilityProvider(int slotIndex) { mSlotIndex = slotIndex; } /** - * @return SIM slot index the network availability updater associated with. + * @return SIM slot index the network availability provider associated with. */ public final int getSlotIndex() { return mSlotIndex; @@ -121,7 +127,7 @@ public abstract class QualifiedNetworksService extends Service { } /** - * Update the qualified networks list. Network availability updater must invoke this method + * Update the qualified networks list. Network availability provider must invoke this method * whenever the qualified networks changes. If this method is never invoked for certain * APN types, then frameworks will always use the default (i.e. cellular) data and network * service. @@ -129,14 +135,16 @@ public abstract class QualifiedNetworksService extends Service { * @param apnTypes APN types of the qualified networks. This must be a bitmask combination * of {@link ApnSetting.ApnType}. * @param qualifiedNetworkTypes List of network types which are qualified for data - * connection setup for {@link @apnType} in the preferred order. Each element in the array - * is a {@link AccessNetworkType}. An empty list or null indicates no networks are qualified + * connection setup for {@link @apnType} in the preferred order. Each element in the list + * is a {@link AccessNetworkType}. An empty list indicates no networks are qualified * for data setup. */ - public final void updateQualifiedNetworkTypes(@ApnType int apnTypes, - @Nullable int[] qualifiedNetworkTypes) { + public final void updateQualifiedNetworkTypes( + @ApnType int apnTypes, @NonNull List<Integer> qualifiedNetworkTypes) { + int[] qualifiedNetworkTypesArray = + qualifiedNetworkTypes.stream().mapToInt(i->i).toArray(); mHandler.obtainMessage(QNS_UPDATE_QUALIFIED_NETWORKS, mSlotIndex, apnTypes, - qualifiedNetworkTypes).sendToTarget(); + qualifiedNetworkTypesArray).sendToTarget(); } private void onUpdateQualifiedNetworkTypes(@ApnType int apnTypes, @@ -152,7 +160,7 @@ public abstract class QualifiedNetworksService extends Service { } /** - * Called when the qualified networks updater is removed. The extended class should + * Called when the qualified networks provider is removed. The extended class should * implement this method to perform cleanup works. */ @Override @@ -168,48 +176,48 @@ public abstract class QualifiedNetworksService extends Service { public void handleMessage(Message message) { IQualifiedNetworksServiceCallback callback; final int slotIndex = message.arg1; - NetworkAvailabilityUpdater updater = mUpdaters.get(slotIndex); + NetworkAvailabilityProvider provider = mProviders.get(slotIndex); switch (message.what) { - case QNS_CREATE_NETWORK_AVAILABILITY_UPDATER: - if (mUpdaters.get(slotIndex) != null) { - loge("Network availability updater for slot " + slotIndex + case QNS_CREATE_NETWORK_AVAILABILITY_PROVIDER: + if (mProviders.get(slotIndex) != null) { + loge("Network availability provider for slot " + slotIndex + " already existed."); return; } - updater = createNetworkAvailabilityUpdater(slotIndex); - if (updater != null) { - mUpdaters.put(slotIndex, updater); + provider = onCreateNetworkAvailabilityProvider(slotIndex); + if (provider != null) { + mProviders.put(slotIndex, provider); callback = (IQualifiedNetworksServiceCallback) message.obj; - updater.registerForQualifiedNetworkTypesChanged(callback); + provider.registerForQualifiedNetworkTypesChanged(callback); } else { - loge("Failed to create network availability updater. slot index = " + loge("Failed to create network availability provider. slot index = " + slotIndex); } break; - case QNS_REMOVE_NETWORK_AVAILABILITY_UPDATER: - if (updater != null) { - updater.close(); - mUpdaters.remove(slotIndex); + case QNS_REMOVE_NETWORK_AVAILABILITY_PROVIDER: + if (provider != null) { + provider.close(); + mProviders.remove(slotIndex); } break; - case QNS_REMOVE_ALL_NETWORK_AVAILABILITY_UPDATERS: - for (int i = 0; i < mUpdaters.size(); i++) { - updater = mUpdaters.get(i); - if (updater != null) { - updater.close(); + case QNS_REMOVE_ALL_NETWORK_AVAILABILITY_PROVIDERS: + for (int i = 0; i < mProviders.size(); i++) { + provider = mProviders.get(i); + if (provider != null) { + provider.close(); } } - mUpdaters.clear(); + mProviders.clear(); break; case QNS_UPDATE_QUALIFIED_NETWORKS: - if (updater == null) break; - updater.onUpdateQualifiedNetworkTypes(message.arg2, (int[]) message.obj); + if (provider == null) break; + provider.onUpdateQualifiedNetworkTypes(message.arg2, (int[]) message.obj); break; } } @@ -227,8 +235,8 @@ public abstract class QualifiedNetworksService extends Service { } /** - * Create the instance of {@link NetworkAvailabilityUpdater}. Vendor qualified network service - * must override this method to facilitate the creation of {@link NetworkAvailabilityUpdater} + * Create the instance of {@link NetworkAvailabilityProvider}. Vendor qualified network service + * must override this method to facilitate the creation of {@link NetworkAvailabilityProvider} * instances. The system will call this method after binding the qualified networks service for * each active SIM slot index. * @@ -236,7 +244,7 @@ public abstract class QualifiedNetworksService extends Service { * @return Qualified networks service instance */ @NonNull - public abstract NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int slotIndex); + public abstract NetworkAvailabilityProvider onCreateNetworkAvailabilityProvider(int slotIndex); /** @hide */ @Override @@ -251,7 +259,7 @@ public abstract class QualifiedNetworksService extends Service { /** @hide */ @Override public boolean onUnbind(Intent intent) { - mHandler.obtainMessage(QNS_REMOVE_ALL_NETWORK_AVAILABILITY_UPDATERS).sendToTarget(); + mHandler.obtainMessage(QNS_REMOVE_ALL_NETWORK_AVAILABILITY_PROVIDERS).sendToTarget(); return false; } @@ -267,15 +275,15 @@ public abstract class QualifiedNetworksService extends Service { */ private class IQualifiedNetworksServiceWrapper extends IQualifiedNetworksService.Stub { @Override - public void createNetworkAvailabilityUpdater(int slotIndex, - IQualifiedNetworksServiceCallback callback) { - mHandler.obtainMessage(QNS_CREATE_NETWORK_AVAILABILITY_UPDATER, slotIndex, 0, + public void createNetworkAvailabilityProvider(int slotIndex, + IQualifiedNetworksServiceCallback callback) { + mHandler.obtainMessage(QNS_CREATE_NETWORK_AVAILABILITY_PROVIDER, slotIndex, 0, callback).sendToTarget(); } @Override - public void removeNetworkAvailabilityUpdater(int slotIndex) { - mHandler.obtainMessage(QNS_REMOVE_NETWORK_AVAILABILITY_UPDATER, slotIndex, 0) + public void removeNetworkAvailabilityProvider(int slotIndex) { + mHandler.obtainMessage(QNS_REMOVE_NETWORK_AVAILABILITY_PROVIDER, slotIndex, 0) .sendToTarget(); } } diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index 52919df1cf0a..834743d7ffed 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -39,7 +39,6 @@ import android.util.Log; import androidx.test.InstrumentationRegistry; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -531,7 +530,6 @@ public class RollbackTest { /** * Test rollback of apks involving splits. */ - @Ignore("b/127520966 build issues with splits need to be sorted out") @Test public void testRollbackWithSplits() throws Exception { try { @@ -827,6 +825,7 @@ public class RollbackTest { RollbackTestUtils.adoptShellPermissionIdentity( Manifest.permission.INSTALL_PACKAGES, Manifest.permission.DELETE_PACKAGES, + Manifest.permission.MANAGE_ROLLBACKS, Manifest.permission.TEST_MANAGE_ROLLBACKS, Manifest.permission.KILL_BACKGROUND_PROCESSES, Manifest.permission.RESTART_PACKAGES); diff --git a/tests/net/java/android/net/LinkAddressTest.java b/tests/net/java/android/net/LinkAddressTest.java index be7bd1b108b0..d462441b22fa 100644 --- a/tests/net/java/android/net/LinkAddressTest.java +++ b/tests/net/java/android/net/LinkAddressTest.java @@ -81,14 +81,14 @@ public class LinkAddressTest { assertEquals(25, address.getPrefixLength()); assertEquals(0, address.getFlags()); assertEquals(RT_SCOPE_UNIVERSE, address.getScope()); - assertTrue(address.isIPv4()); + assertTrue(address.isIpv4()); address = new LinkAddress(V6_ADDRESS, 127); assertEquals(V6_ADDRESS, address.getAddress()); assertEquals(127, address.getPrefixLength()); assertEquals(0, address.getFlags()); assertEquals(RT_SCOPE_UNIVERSE, address.getScope()); - assertTrue(address.isIPv6()); + assertTrue(address.isIpv6()); // Nonsensical flags/scopes or combinations thereof are acceptable. address = new LinkAddress(V6 + "/64", IFA_F_DEPRECATED | IFA_F_PERMANENT, RT_SCOPE_LINK); @@ -96,14 +96,14 @@ public class LinkAddressTest { assertEquals(64, address.getPrefixLength()); assertEquals(IFA_F_DEPRECATED | IFA_F_PERMANENT, address.getFlags()); assertEquals(RT_SCOPE_LINK, address.getScope()); - assertTrue(address.isIPv6()); + assertTrue(address.isIpv6()); address = new LinkAddress(V4 + "/23", 123, 456); assertEquals(V4_ADDRESS, address.getAddress()); assertEquals(23, address.getPrefixLength()); assertEquals(123, address.getFlags()); assertEquals(456, address.getScope()); - assertTrue(address.isIPv4()); + assertTrue(address.isIpv4()); // InterfaceAddress doesn't have a constructor. Fetch some from an interface. List<InterfaceAddress> addrs = NetworkInterface.getByName("lo").getInterfaceAddresses(); diff --git a/tests/net/java/android/net/LinkPropertiesTest.java b/tests/net/java/android/net/LinkPropertiesTest.java index 9a7d48723e8c..417729150be8 100644 --- a/tests/net/java/android/net/LinkPropertiesTest.java +++ b/tests/net/java/android/net/LinkPropertiesTest.java @@ -405,8 +405,8 @@ public class LinkPropertiesTest { LinkProperties lp = new LinkProperties(); // No addresses. - assertFalse(lp.hasIPv4Address()); - assertFalse(lp.hasGlobalIPv6Address()); + assertFalse(lp.hasIpv4Address()); + assertFalse(lp.hasGlobalIpv6Address()); // Addresses on stacked links don't count. LinkProperties stacked = new LinkProperties(); @@ -414,53 +414,53 @@ public class LinkPropertiesTest { lp.addStackedLink(stacked); stacked.addLinkAddress(LINKADDRV4); stacked.addLinkAddress(LINKADDRV6); - assertTrue(stacked.hasIPv4Address()); - assertTrue(stacked.hasGlobalIPv6Address()); - assertFalse(lp.hasIPv4Address()); - assertFalse(lp.hasGlobalIPv6Address()); + assertTrue(stacked.hasIpv4Address()); + assertTrue(stacked.hasGlobalIpv6Address()); + assertFalse(lp.hasIpv4Address()); + assertFalse(lp.hasGlobalIpv6Address()); lp.removeStackedLink("stacked"); - assertFalse(lp.hasIPv4Address()); - assertFalse(lp.hasGlobalIPv6Address()); + assertFalse(lp.hasIpv4Address()); + assertFalse(lp.hasGlobalIpv6Address()); // Addresses on the base link. - // Check the return values of hasIPvXAddress and ensure the add/remove methods return true + // Check the return values of hasIpvXAddress and ensure the add/remove methods return true // iff something changes. assertEquals(0, lp.getLinkAddresses().size()); assertTrue(lp.addLinkAddress(LINKADDRV6)); assertEquals(1, lp.getLinkAddresses().size()); - assertFalse(lp.hasIPv4Address()); - assertTrue(lp.hasGlobalIPv6Address()); + assertFalse(lp.hasIpv4Address()); + assertTrue(lp.hasGlobalIpv6Address()); assertTrue(lp.removeLinkAddress(LINKADDRV6)); assertEquals(0, lp.getLinkAddresses().size()); assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL)); assertEquals(1, lp.getLinkAddresses().size()); - assertFalse(lp.hasGlobalIPv6Address()); + assertFalse(lp.hasGlobalIpv6Address()); assertTrue(lp.addLinkAddress(LINKADDRV4)); assertEquals(2, lp.getLinkAddresses().size()); - assertTrue(lp.hasIPv4Address()); - assertFalse(lp.hasGlobalIPv6Address()); + assertTrue(lp.hasIpv4Address()); + assertFalse(lp.hasGlobalIpv6Address()); assertTrue(lp.addLinkAddress(LINKADDRV6)); assertEquals(3, lp.getLinkAddresses().size()); - assertTrue(lp.hasIPv4Address()); - assertTrue(lp.hasGlobalIPv6Address()); + assertTrue(lp.hasIpv4Address()); + assertTrue(lp.hasGlobalIpv6Address()); assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL)); assertEquals(2, lp.getLinkAddresses().size()); - assertTrue(lp.hasIPv4Address()); - assertTrue(lp.hasGlobalIPv6Address()); + assertTrue(lp.hasIpv4Address()); + assertTrue(lp.hasGlobalIpv6Address()); // Adding an address twice has no effect. // Removing an address that's not present has no effect. assertFalse(lp.addLinkAddress(LINKADDRV4)); assertEquals(2, lp.getLinkAddresses().size()); - assertTrue(lp.hasIPv4Address()); + assertTrue(lp.hasIpv4Address()); assertTrue(lp.removeLinkAddress(LINKADDRV4)); assertEquals(1, lp.getLinkAddresses().size()); - assertFalse(lp.hasIPv4Address()); + assertFalse(lp.hasIpv4Address()); assertFalse(lp.removeLinkAddress(LINKADDRV4)); assertEquals(1, lp.getLinkAddresses().size()); @@ -546,8 +546,8 @@ public class LinkPropertiesTest { assertFalse("v4only:addr+dns", lp4.isProvisioned()); lp4.addRoute(new RouteInfo(GATEWAY1)); assertTrue("v4only:addr+dns+route", lp4.isProvisioned()); - assertTrue("v4only:addr+dns+route", lp4.isIPv4Provisioned()); - assertFalse("v4only:addr+dns+route", lp4.isIPv6Provisioned()); + assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned()); + assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned()); LinkProperties lp6 = new LinkProperties(); assertFalse("v6only:empty", lp6.isProvisioned()); @@ -558,11 +558,11 @@ public class LinkPropertiesTest { lp6.addRoute(new RouteInfo(GATEWAY61)); assertFalse("v6only:fe80+dns+route", lp6.isProvisioned()); lp6.addLinkAddress(LINKADDRV6); - assertTrue("v6only:fe80+global+dns+route", lp6.isIPv6Provisioned()); + assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned()); assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned()); lp6.removeLinkAddress(LINKADDRV6LINKLOCAL); - assertFalse("v6only:global+dns+route", lp6.isIPv4Provisioned()); - assertTrue("v6only:global+dns+route", lp6.isIPv6Provisioned()); + assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned()); + assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned()); assertTrue("v6only:global+dns+route", lp6.isProvisioned()); LinkProperties lp46 = new LinkProperties(); @@ -572,12 +572,12 @@ public class LinkPropertiesTest { lp46.addDnsServer(DNS6); assertFalse("dualstack:missing-routes", lp46.isProvisioned()); lp46.addRoute(new RouteInfo(GATEWAY1)); - assertTrue("dualstack:v4-provisioned", lp46.isIPv4Provisioned()); - assertFalse("dualstack:v4-provisioned", lp46.isIPv6Provisioned()); + assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned()); + assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned()); assertTrue("dualstack:v4-provisioned", lp46.isProvisioned()); lp46.addRoute(new RouteInfo(GATEWAY61)); - assertTrue("dualstack:both-provisioned", lp46.isIPv4Provisioned()); - assertTrue("dualstack:both-provisioned", lp46.isIPv6Provisioned()); + assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned()); + assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned()); assertTrue("dualstack:both-provisioned", lp46.isProvisioned()); // A link with an IPv6 address and default route, but IPv4 DNS server. @@ -585,8 +585,8 @@ public class LinkPropertiesTest { mixed.addLinkAddress(LINKADDRV6); mixed.addDnsServer(DNS1); mixed.addRoute(new RouteInfo(GATEWAY61)); - assertFalse("mixed:addr6+route6+dns4", mixed.isIPv4Provisioned()); - assertFalse("mixed:addr6+route6+dns4", mixed.isIPv6Provisioned()); + assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned()); + assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned()); assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned()); } @@ -617,16 +617,16 @@ public class LinkPropertiesTest { v6lp.addLinkAddress(LINKADDRV6); v6lp.addRoute(new RouteInfo(GATEWAY61)); v6lp.addDnsServer(DNS6); - assertFalse(v6lp.isIPv4Provisioned()); - assertTrue(v6lp.isIPv6Provisioned()); + assertFalse(v6lp.isIpv4Provisioned()); + assertTrue(v6lp.isIpv6Provisioned()); assertTrue(v6lp.isProvisioned()); LinkProperties v46lp = new LinkProperties(v6lp); v46lp.addLinkAddress(LINKADDRV4); v46lp.addRoute(new RouteInfo(GATEWAY1)); v46lp.addDnsServer(DNS1); - assertTrue(v46lp.isIPv4Provisioned()); - assertTrue(v46lp.isIPv6Provisioned()); + assertTrue(v46lp.isIpv4Provisioned()); + assertTrue(v46lp.isIpv6Provisioned()); assertTrue(v46lp.isProvisioned()); assertEquals(ProvisioningChange.STILL_PROVISIONED, diff --git a/tests/net/java/android/net/TcpKeepalivePacketDataTest.java b/tests/net/java/android/net/TcpKeepalivePacketDataTest.java index 1f2dd275bb7b..372ffcd057b4 100644 --- a/tests/net/java/android/net/TcpKeepalivePacketDataTest.java +++ b/tests/net/java/android/net/TcpKeepalivePacketDataTest.java @@ -21,12 +21,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import android.net.SocketKeepalive.InvalidPacketException; -import android.net.TcpKeepalivePacketData.TcpSocketInfo; import com.android.internal.util.TestUtils; -import libcore.net.InetAddressUtils; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,14 +34,14 @@ import java.nio.ByteBuffer; @RunWith(JUnit4.class) public final class TcpKeepalivePacketDataTest { + private static final byte[] IPV4_KEEPALIVE_SRC_ADDR = {10, 0, 0, 1}; + private static final byte[] IPV4_KEEPALIVE_DST_ADDR = {10, 0, 0, 5}; @Before public void setUp() {} @Test - public void testV4TcpKeepalivePacket() { - final InetAddress srcAddr = InetAddressUtils.parseNumericAddress("192.168.0.1"); - final InetAddress dstAddr = InetAddressUtils.parseNumericAddress("192.168.0.10"); + public void testV4TcpKeepalivePacket() throws Exception { final int srcPort = 1234; final int dstPort = 4321; final int seq = 0x11111111; @@ -52,20 +49,28 @@ public final class TcpKeepalivePacketDataTest { final int wnd = 8000; final int wndScale = 2; TcpKeepalivePacketData resultData = null; - TcpSocketInfo testInfo = new TcpSocketInfo( - srcAddr, srcPort, dstAddr, dstPort, seq, ack, wnd, wndScale); + final TcpKeepalivePacketDataParcelable testInfo = new TcpKeepalivePacketDataParcelable(); + testInfo.srcAddress = IPV4_KEEPALIVE_SRC_ADDR; + testInfo.srcPort = srcPort; + testInfo.dstAddress = IPV4_KEEPALIVE_DST_ADDR; + testInfo.dstPort = dstPort; + testInfo.seq = seq; + testInfo.ack = ack; + testInfo.rcvWnd = wnd; + testInfo.rcvWndScale = wndScale; try { resultData = TcpKeepalivePacketData.tcpKeepalivePacket(testInfo); } catch (InvalidPacketException e) { fail("InvalidPacketException: " + e); } - assertEquals(testInfo.srcAddress, resultData.srcAddress); - assertEquals(testInfo.dstAddress, resultData.dstAddress); + assertEquals(InetAddress.getByAddress(testInfo.srcAddress), resultData.srcAddress); + assertEquals(InetAddress.getByAddress(testInfo.dstAddress), resultData.dstAddress); assertEquals(testInfo.srcPort, resultData.srcPort); assertEquals(testInfo.dstPort, resultData.dstPort); assertEquals(testInfo.seq, resultData.tcpSeq); assertEquals(testInfo.ack, resultData.tcpAck); + assertEquals(testInfo.rcvWnd, resultData.tcpWnd); assertEquals(testInfo.rcvWndScale, resultData.tcpWndScale); TestUtils.assertParcelingIsLossless(resultData, TcpKeepalivePacketData.CREATOR); @@ -78,11 +83,11 @@ public final class TcpKeepalivePacketDataTest { byte[] ip = new byte[4]; buf = ByteBuffer.wrap(packet, 12, 4); buf.get(ip); - assertArrayEquals(ip, srcAddr.getAddress()); + assertArrayEquals(ip, IPV4_KEEPALIVE_SRC_ADDR); // Destination IP address. buf = ByteBuffer.wrap(packet, 16, 4); buf.get(ip); - assertArrayEquals(ip, dstAddr.getAddress()); + assertArrayEquals(ip, IPV4_KEEPALIVE_DST_ADDR); buf = ByteBuffer.wrap(packet, 20, 12); // Source port. @@ -102,25 +107,32 @@ public final class TcpKeepalivePacketDataTest { @Test public void testParcel() throws Exception { - final InetAddress srcAddr = InetAddresses.parseNumericAddress("192.168.0.1"); - final InetAddress dstAddr = InetAddresses.parseNumericAddress("192.168.0.10"); final int srcPort = 1234; final int dstPort = 4321; final int sequence = 0x11111111; final int ack = 0x22222222; final int wnd = 48_000; final int wndScale = 2; + final TcpKeepalivePacketDataParcelable testInfo = new TcpKeepalivePacketDataParcelable(); + testInfo.srcAddress = IPV4_KEEPALIVE_SRC_ADDR; + testInfo.srcPort = srcPort; + testInfo.dstAddress = IPV4_KEEPALIVE_DST_ADDR; + testInfo.dstPort = dstPort; + testInfo.seq = sequence; + testInfo.ack = ack; + testInfo.rcvWnd = wnd; + testInfo.rcvWndScale = wndScale; TcpKeepalivePacketData testData = null; TcpKeepalivePacketDataParcelable resultData = null; - TcpSocketInfo testInfo = new TcpSocketInfo( - srcAddr, srcPort, dstAddr, dstPort, sequence, ack, wnd, wndScale); testData = TcpKeepalivePacketData.tcpKeepalivePacket(testInfo); resultData = testData.toStableParcelable(); - assertArrayEquals(resultData.srcAddress, srcAddr.getAddress()); - assertArrayEquals(resultData.dstAddress, dstAddr.getAddress()); + assertArrayEquals(resultData.srcAddress, IPV4_KEEPALIVE_SRC_ADDR); + assertArrayEquals(resultData.dstAddress, IPV4_KEEPALIVE_DST_ADDR); assertEquals(resultData.srcPort, srcPort); assertEquals(resultData.dstPort, dstPort); assertEquals(resultData.seq, sequence); assertEquals(resultData.ack, ack); + assertEquals(resultData.rcvWnd, wnd); + assertEquals(resultData.rcvWndScale, wndScale); } } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index e01b29f2160f..9dfe4362e838 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -2550,7 +2550,8 @@ public class ConnectivityServiceTest { verifyActiveNetwork(TRANSPORT_CELLULAR); } - @Test + // TODO(b/128426024): deflake and re-enable + // @Test public void testPartialConnectivity() { // Register network callback. NetworkRequest request = new NetworkRequest.Builder() diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index fdba72333f0b..6c42ac398b47 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -550,7 +550,7 @@ public class TetheringTest { mTetheringDependencies.ipv6CoordinatorNotifyList) { NetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false); ipSrv.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, - upstreamState.linkProperties.isIPv6Provisioned() + upstreamState.linkProperties.isIpv6Provisioned() ? ipv6OnlyState.linkProperties : null); } diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java index 147f054b1abb..04710e436ffb 100644 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java +++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java @@ -39,7 +39,6 @@ import java.util.Optional; public final class InspectableClassModel { private final @NonNull ClassName mClassName; private final @NonNull Map<String, Property> mPropertyMap; - private @NonNull Optional<String> mNodeName = Optional.empty(); /** * @param className The name of the modeled class @@ -54,15 +53,6 @@ public final class InspectableClassModel { return mClassName; } - @NonNull - public Optional<String> getNodeName() { - return mNodeName; - } - - public void setNodeName(@NonNull Optional<String> nodeName) { - mNodeName = nodeName; - } - /** * Add a property to the model, replacing an existing property of the same name. * diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java deleted file mode 100644 index 64a60fbc9179..000000000000 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableNodeNameProcessor.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.processor.view.inspector; - -import androidx.annotation.NonNull; - -import java.util.Optional; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.Element; - -/** - * Process {@code @InspectableNodeName} annotations. - * - * @see android.view.inspector.InspectableNodeName - */ -public final class InspectableNodeNameProcessor implements ModelProcessor { - private final @NonNull String mQualifiedName; - private final @NonNull ProcessingEnvironment mProcessingEnv; - private final @NonNull AnnotationUtils mAnnotationUtils; - - /** - * @param annotationQualifiedName The qualified name of the annotation to process - * @param processingEnv The processing environment from the parent processor - */ - public InspectableNodeNameProcessor( - @NonNull String annotationQualifiedName, - @NonNull ProcessingEnvironment processingEnv) { - mQualifiedName = annotationQualifiedName; - mProcessingEnv = processingEnv; - mAnnotationUtils = new AnnotationUtils(processingEnv); - } - - /** - * Set the node name on the model if one is supplied. - * - * If the model already has a different node name, the node name will not be updated, and - * the processor will print an error the the messager. - * - * @param element The annotated element to operate on - * @param model The model this element should be merged into - */ - @Override - public void process(@NonNull Element element, @NonNull InspectableClassModel model) { - try { - final AnnotationMirror mirror = - mAnnotationUtils.exactlyOneMirror(mQualifiedName, element); - final Optional<String> nodeName = mAnnotationUtils - .typedValueByName("value", String.class, element, mirror); - - if (!model.getNodeName().isPresent() || model.getNodeName().equals(nodeName)) { - model.setNodeName(nodeName); - } else { - final String message = String.format( - "Node name was already set to \"%s\", refusing to change it to \"%s\".", - model.getNodeName().get(), - nodeName); - throw new ProcessingException(message, element, mirror); - } - } catch (ProcessingException processingException) { - processingException.print(mProcessingEnv.getMessager()); - } - } -} diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java index 7f5f9ca8a8f8..2bd867c235c7 100644 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java +++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java @@ -46,7 +46,7 @@ import javax.lang.model.type.TypeMirror; * * @see android.view.inspector.InspectableProperty */ -public final class InspectablePropertyProcessor implements ModelProcessor { +public final class InspectablePropertyProcessor { private final @NonNull String mQualifiedName; private final @NonNull ProcessingEnvironment mProcessingEnv; private final @NonNull AnnotationUtils mAnnotationUtils; @@ -139,7 +139,6 @@ public final class InspectablePropertyProcessor implements ModelProcessor { mAnnotationUtils = new AnnotationUtils(processingEnv); } - @Override public void process(@NonNull Element element, @NonNull InspectableClassModel model) { try { final AnnotationMirror annotation = @@ -608,7 +607,7 @@ public final class InspectablePropertyProcessor implements ModelProcessor { * Build a model of an {@code int} enumeration mapping from annotation values. * * This method only handles the one-to-one mapping of mirrors of - * {@link android.view.inspector.InspectableProperty.EnumMap} annotations into + * {@link android.view.inspector.InspectableProperty.EnumEntry} annotations into * {@link IntEnumEntry} objects. Further validation should be handled elsewhere * * @see android.view.inspector.InspectableProperty#enumMapping() @@ -656,7 +655,7 @@ public final class InspectablePropertyProcessor implements ModelProcessor { * Build a model of an {@code int} flag mapping from annotation values. * * This method only handles the one-to-one mapping of mirrors of - * {@link android.view.inspector.InspectableProperty.FlagMap} annotations into + * {@link android.view.inspector.InspectableProperty.FlagEntry} annotations into * {@link IntFlagEntry} objects. Further validation should be handled elsewhere * * @see android.view.inspector.IntFlagMapping diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java index c428a4613c95..6e38c245c70e 100644 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java +++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java @@ -163,8 +163,6 @@ public final class InspectionCompanionGenerator { .addMethod(generateMapProperties(properties, fields)) .addMethod(generateReadProperties(properties, fields, model.getClassName())); - model.getNodeName().ifPresent(name -> builder.addMethod(generateGetNodeName(name))); - return builder.build(); } @@ -451,31 +449,6 @@ public final class InspectionCompanionGenerator { } /** - * Generate an implementation of - * {@link android.view.inspector.InspectionCompanion#getNodeName()}. - * - * Example: - * <pre> - * @Override - * public String getNodeName() { - * return "nodeName"; - * } - * </pre> - * - * @param nodeName The name of this node - * @return A method definition that returns the node name - */ - @NonNull - private MethodSpec generateGetNodeName(@NonNull String nodeName) { - return MethodSpec.methodBuilder("getNodeName") - .addAnnotation(Override.class) - .addModifiers(Modifier.PUBLIC) - .returns(String.class) - .addStatement("return $S", nodeName) - .build(); - } - - /** * Generate the final class name for the inspection companion from the model's class name. * * The generated class is added to the same package as the source class. If the class in the diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java deleted file mode 100644 index ab38f4c9e1b0..000000000000 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/ModelProcessor.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.processor.view.inspector; - -import androidx.annotation.NonNull; - -import javax.lang.model.element.Element; - -/** - * An interface for annotation processors that operate on a single element and a class model. - */ -public interface ModelProcessor { - /** - * Process the supplied element, mutating the model as needed. - * - * @param element The annotated element to operate on - * @param model The model this element should be merged into - */ - void process(@NonNull Element element, @NonNull InspectableClassModel model); -} diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java index d9ed1fb9f343..80d37273b422 100644 --- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java +++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/PlatformInspectableProcessor.java @@ -38,25 +38,18 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.util.ElementFilter; - /** * An annotation processor for the platform inspectable annotations. * - * It mostly delegates to {@link ModelProcessor} and {@link InspectionCompanionGenerator}. This - * modular architecture allows the core generation code to be reused for comparable annotations - * outside the platform, such as in AndroidX. + * It mostly delegates to {@link InspectablePropertyProcessor} and + * {@link InspectionCompanionGenerator}. This modular architecture allows the core generation code + * to be reused for comparable annotations outside the platform. * - * @see android.view.inspector.InspectableNodeName * @see android.view.inspector.InspectableProperty */ -@SupportedAnnotationTypes({ - PlatformInspectableProcessor.NODE_NAME_QUALIFIED_NAME, - PlatformInspectableProcessor.PROPERTY_QUALIFIED_NAME -}) +@SupportedAnnotationTypes({PlatformInspectableProcessor.ANNOTATION_QUALIFIED_NAME}) public final class PlatformInspectableProcessor extends AbstractProcessor { - static final String NODE_NAME_QUALIFIED_NAME = - "android.view.inspector.InspectableNodeName"; - static final String PROPERTY_QUALIFIED_NAME = + static final String ANNOTATION_QUALIFIED_NAME = "android.view.inspector.InspectableProperty"; @Override @@ -71,18 +64,8 @@ public final class PlatformInspectableProcessor extends AbstractProcessor { final Map<String, InspectableClassModel> modelMap = new HashMap<>(); for (TypeElement annotation : annotations) { - if (annotation.getQualifiedName().contentEquals(NODE_NAME_QUALIFIED_NAME)) { - runModelProcessor( - roundEnv.getElementsAnnotatedWith(annotation), - new InspectableNodeNameProcessor(NODE_NAME_QUALIFIED_NAME, processingEnv), - modelMap); - - } else if (annotation.getQualifiedName().contentEquals(PROPERTY_QUALIFIED_NAME)) { - runModelProcessor( - roundEnv.getElementsAnnotatedWith(annotation), - new InspectablePropertyProcessor(PROPERTY_QUALIFIED_NAME, processingEnv), - modelMap); - + if (annotation.getQualifiedName().contentEquals(ANNOTATION_QUALIFIED_NAME)) { + processProperties(roundEnv.getElementsAnnotatedWith(annotation), modelMap); } else { fail("Unexpected annotation type", annotation); } @@ -106,16 +89,17 @@ public final class PlatformInspectableProcessor extends AbstractProcessor { } /** - * Run a {@link ModelProcessor} for a set of elements + * Runs {@link PlatformInspectableProcessor} on a set of annotated elements. * - * @param elements Elements to process, should be annotated correctly - * @param processor The processor to use - * @param modelMap A map of qualified class names to models + * @param elements A set of annotated elements to process + * @param modelMap A map of qualified class names to class models to update */ - private void runModelProcessor( + private void processProperties( @NonNull Set<? extends Element> elements, - @NonNull ModelProcessor processor, @NonNull Map<String, InspectableClassModel> modelMap) { + final InspectablePropertyProcessor processor = + new InspectablePropertyProcessor(ANNOTATION_QUALIFIED_NAME, processingEnv); + for (Element element : elements) { final Optional<TypeElement> classElement = enclosingClassElement(element); diff --git a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java index 3ec620a1a4bf..c6e6018869ac 100644 --- a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java +++ b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java @@ -36,7 +36,6 @@ import org.junit.Test; import java.io.IOException; import java.net.URL; import java.util.Arrays; -import java.util.Optional; /** * Tests for {@link InspectionCompanionGenerator} @@ -56,12 +55,6 @@ public class InspectionCompanionGeneratorTest { } @Test - public void testNodeName() { - mModel.setNodeName(Optional.of("NodeName")); - assertGeneratedFileEquals("NodeName"); - } - - @Test public void testNestedClass() { mModel = new InspectableClassModel( ClassName.get("com.android.node", "Outer", "Inner")); diff --git a/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NodeName.java.txt b/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NodeName.java.txt deleted file mode 100644 index ffa1f0be02d4..000000000000 --- a/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/NodeName.java.txt +++ /dev/null @@ -1,37 +0,0 @@ -package com.android.node; - -import android.view.inspector.InspectionCompanion; -import android.view.inspector.PropertyMapper; -import android.view.inspector.PropertyReader; -import java.lang.Override; -import java.lang.String; - -/** - * Inspection companion for {@link TestNode}. - * - * Generated by {@link android.processor.view.inspector.InspectionCompanionGenerator} - * on behalf of {@link android.processor.view.inspector.InspectionCompanionGeneratorTest}. - */ -public final class TestNode$InspectionCompanion implements InspectionCompanion<TestNode> { - /** - * Guards against reading properties before mapping them. - */ - private boolean mPropertiesMapped = false; - - @Override - public void mapProperties(PropertyMapper propertyMapper) { - mPropertiesMapped = true; - } - - @Override - public void readProperties(TestNode node, PropertyReader propertyReader) { - if (!mPropertiesMapped) { - throw new InspectionCompanion.UninitializedPropertyMapException(); - } - } - - @Override - public String getNodeName() { - return "NodeName"; - } -} diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java index b2251163591b..daea601e9f96 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java @@ -18,6 +18,7 @@ package android.net.wifi.aware; import static android.net.wifi.aware.WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR; +import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; import android.net.NetworkSpecifier; @@ -302,12 +303,6 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements /** * A builder class for a Wi-Fi Aware network specifier to set up an Aware connection with a * peer. - * <p> - * Note that all Wi-Fi Aware connection specifier objects must call the - * {@link Builder#setDiscoverySession(DiscoverySession)} to specify the context - * within which the connection is created, and - * {@link Builder#setPeerHandle(PeerHandle)} to specify the peer to which the - * connection is created. */ public static final class Builder { private DiscoverySession mDiscoverySession; @@ -318,42 +313,27 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements private int mTransportProtocol = -1; // invalid value /** - * Configure the {@link PublishDiscoverySession} or {@link SubscribeDiscoverySession} - * discovery session in whose context the connection is created. - * <p> - * Note: this method must be called for any connection request! + * Create a builder for {@link WifiAwareNetworkSpecifier} used in requests to set up a + * Wi-Fi Aware connection with a peer. * - * @param discoverySession A Wi-Fi Aware discovery session. - * @return the current {@link Builder} builder, enabling chaining of builder - * methods. - */ - public @NonNull Builder setDiscoverySession(@NonNull DiscoverySession discoverySession) { - if (discoverySession == null) { - throw new IllegalArgumentException("Non-null discoverySession required"); - } - mDiscoverySession = discoverySession; - return this; - } - - /** - * Configure the {@link PeerHandle} of the peer to which the Wi-Fi Aware connection is - * requested. The peer is discovered through Wi-Fi Aware discovery, - * <p> - * Note: this method must be called for any connection request! - * - * @param peerHandle The peer's handle obtained through + * @param discoverySession A Wi-Fi Aware discovery session in whose context the connection + * is created. + * @param peerHandle The handle of the peer to which the Wi-Fi Aware connection is + * requested. The peer is discovered through Wi-Fi Aware discovery. The + * handle can be obtained through * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)} * or * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle, byte[])}. - * @return the current {@link Builder} builder, enabling chaining of builder - * methods. */ - public @NonNull Builder setPeerHandle(@NonNull PeerHandle peerHandle) { + public Builder(@NonNull DiscoverySession discoverySession, @NonNull PeerHandle peerHandle) { + if (discoverySession == null) { + throw new IllegalArgumentException("Non-null discoverySession required"); + } if (peerHandle == null) { throw new IllegalArgumentException("Non-null peerHandle required"); } + mDiscoverySession = discoverySession; mPeerHandle = peerHandle; - return this; } /** @@ -407,7 +387,7 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements * @return the current {@link Builder} builder, enabling chaining of builder * methods. */ - public @NonNull Builder setPort(int port) { + public @NonNull Builder setPort(@IntRange(from = 0, to = 65535) int port) { if (port <= 0 || port > 65535) { throw new IllegalArgumentException("The port must be a positive value (0, 65535]"); } @@ -432,7 +412,8 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements * @return the current {@link Builder} builder, enabling chaining of builder * methods. */ - public @NonNull Builder setTransportProtocol(int transportProtocol) { + public @NonNull + Builder setTransportProtocol(@IntRange(from = 0, to = 255) int transportProtocol) { if (transportProtocol < 0 || transportProtocol > 255) { throw new IllegalArgumentException( "The transport protocol must be in range [0, 255]"); @@ -460,6 +441,9 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements if (mDiscoverySession == null) { throw new IllegalStateException("Null discovery session!?"); } + if (mPeerHandle == null) { + throw new IllegalStateException("Null peerHandle!?"); + } if (mPskPassphrase != null & mPmk != null) { throw new IllegalStateException( "Can only specify a Passphrase or a PMK - not both!"); @@ -481,10 +465,6 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements } } - if (role == WIFI_AWARE_DATA_PATH_ROLE_INITIATOR && mPeerHandle == null) { - throw new IllegalStateException("Null peerHandle!?"); - } - return new WifiAwareNetworkSpecifier( WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB, role, mDiscoverySession.mClientId, mDiscoverySession.mSessionId, mPeerHandle.peerId, diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java index 657a3383612d..905540e081ed 100644 --- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java +++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java @@ -958,8 +958,8 @@ public class WifiAwareManagerTest { WifiAwareNetworkSpecifier ns = (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierOpen( peerHandle); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession.getValue()).setPeerHandle(peerHandle).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder( + publishSession.getValue(), peerHandle).build(); // validate format collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, @@ -979,9 +979,8 @@ public class WifiAwareManagerTest { // (4) request an encrypted (PMK) network specifier from the session ns = (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierPmk( peerHandle, pmk); - nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession.getValue()).setPeerHandle(peerHandle).setPmk(pmk).setPort( - port).setTransportProtocol(transportProtocol).build(); + nsb = new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), peerHandle).setPmk( + pmk).setPort(port).setTransportProtocol(transportProtocol).build(); // validate format collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, @@ -1005,9 +1004,9 @@ public class WifiAwareManagerTest { (WifiAwareNetworkSpecifier) publishSession.getValue() .createNetworkSpecifierPassphrase( peerHandle, passphrase); - nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession.getValue()).setPeerHandle(peerHandle).setPskPassphrase( - passphrase).setPort(port).setTransportProtocol(transportProtocol).build(); + nsb = new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), + peerHandle).setPskPassphrase(passphrase).setPort(port).setTransportProtocol( + transportProtocol).build(); // validate format collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, @@ -1255,16 +1254,15 @@ public class WifiAwareManagerTest { // (3) create network specifier if (doPmk) { if (useBuilder) { - new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession.getValue()).setPeerHandle(peerHandle).setPmk(pmk).build(); + new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), peerHandle).setPmk( + pmk).build(); } else { publishSession.getValue().createNetworkSpecifierPmk(peerHandle, pmk); } } else { if (useBuilder) { - new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession.getValue()).setPeerHandle(peerHandle).setPskPassphrase( - passphrase).build(); + new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), + peerHandle).setPskPassphrase(passphrase).build(); } else { publishSession.getValue().createNetworkSpecifierPassphrase(peerHandle, passphrase); } @@ -1353,8 +1351,8 @@ public class WifiAwareManagerTest { DiscoverySession publishSession = executeSessionStartup(true); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession).setPeerHandle(peerHandle).setPmk(pmk).setPort(port).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setPmk(pmk).setPort(port).build(); } /** @@ -1368,8 +1366,8 @@ public class WifiAwareManagerTest { DiscoverySession publishSession = executeSessionStartup(true); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession).setPeerHandle(peerHandle).setPort(port).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setPort(port).build(); } /** @@ -1383,8 +1381,8 @@ public class WifiAwareManagerTest { DiscoverySession subscribeSession = executeSessionStartup(false); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - subscribeSession).setPeerHandle(peerHandle).setPort(port).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(subscribeSession, + peerHandle).setPort(port).build(); } /** @@ -1403,27 +1401,23 @@ public class WifiAwareManagerTest { DiscoverySession publishSession = executeSessionStartup(true); try { - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder() - .setDiscoverySession(publishSession).setPeerHandle(peerHandle) - .setPmk(pmk).setTransportProtocol(tpNegative).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setPmk(pmk).setTransportProtocol(tpNegative).build(); assertTrue("No exception on negative transport protocol!", false); } catch (IllegalArgumentException e) { // nop - exception is correct! } try { - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder() - .setDiscoverySession(publishSession).setPeerHandle(peerHandle) - .setPmk(pmk).setTransportProtocol(tpTooLarge).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setPmk(pmk).setTransportProtocol(tpTooLarge).build(); assertTrue("No exception on >255 transport protocol!", false); } catch (IllegalArgumentException e) { // nop - exception is correct! } - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder() - .setDiscoverySession(publishSession).setPeerHandle(peerHandle) - .setPmk(pmk).setTransportProtocol(tpSmallest).build(); - nsb = new WifiAwareNetworkSpecifier.Builder().setDiscoverySession( - publishSession).setPeerHandle(peerHandle).setPmk(pmk).setTransportProtocol( - tpLargest).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setPmk(pmk).setTransportProtocol(tpSmallest).build(); + nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, peerHandle).setPmk( + pmk).setTransportProtocol(tpLargest).build(); } /** @@ -1437,9 +1431,8 @@ public class WifiAwareManagerTest { DiscoverySession publishSession = executeSessionStartup(true); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder() - .setDiscoverySession(publishSession).setPeerHandle(peerHandle) - .setTransportProtocol(transportProtocol).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, + peerHandle).setTransportProtocol(transportProtocol).build(); } /** @@ -1453,9 +1446,8 @@ public class WifiAwareManagerTest { DiscoverySession subscribeSession = executeSessionStartup(false); - WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder() - .setDiscoverySession(subscribeSession).setPeerHandle(peerHandle) - .setTransportProtocol(transportProtocol).build(); + WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(subscribeSession, + peerHandle).setTransportProtocol(transportProtocol).build(); } /* |