diff options
73 files changed, 1013 insertions, 517 deletions
diff --git a/StubLibraries.bp b/StubLibraries.bp index 0eb504f00853..10d64fc0ec7a 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -471,6 +471,22 @@ java_library { }, } +java_library { + name: "android_system_server_stubs_current", + defaults: ["android_stubs_dists_default"], + srcs: [":services-non-updatable-stubs"], + installable: false, + static_libs: [ + "android_module_lib_stubs_current", + ], + sdk_version: "none", + system_modules: "none", + java_version: "1.8", + dist: { + dir: "apistubs/android/system-server", + }, +} + ///////////////////////////////////////////////////////////////////// // hwbinder.stubs provides APIs required for building HIDL Java // libraries. diff --git a/api/Android.bp b/api/Android.bp index 6e83c083245a..2df31ecb7715 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -341,7 +341,7 @@ genrule { { targets: ["sdk", "win_sdk"], dir: "apistubs/android/system-server/api", - dest: "merge-android.txt", + dest: "android.txt", }, ], } @@ -364,7 +364,7 @@ genrule { { targets: ["sdk", "win_sdk"], dir: "apistubs/android/system-server/api", - dest: "merge-removed.txt", + dest: "removed.txt", }, ], } diff --git a/cmds/idmap2/idmap2d/aidl/android/os/OverlayablePolicy.aidl b/cmds/idmap2/idmap2d/aidl/android/os/OverlayablePolicy.aidl index 403d8c55de16..a47b8416dbf5 100644 --- a/cmds/idmap2/idmap2d/aidl/android/os/OverlayablePolicy.aidl +++ b/cmds/idmap2/idmap2d/aidl/android/os/OverlayablePolicy.aidl @@ -20,14 +20,16 @@ package android.os; * @see ResourcesTypes.h ResTable_overlayable_policy_header::PolicyFlags * @hide */ -interface OverlayablePolicy { - const int PUBLIC = 0x00000001; - const int SYSTEM_PARTITION = 0x00000002; - const int VENDOR_PARTITION = 0x00000004; - const int PRODUCT_PARTITION = 0x00000008; - const int SIGNATURE = 0x00000010; - const int ODM_PARTITION = 0x00000020; - const int OEM_PARTITION = 0x00000040; - const int ACTOR_SIGNATURE = 0x00000080; - const int CONFIG_SIGNATURE = 0x0000100; +@Backing(type="int") +enum OverlayablePolicy { + NONE = 0x00000000, + PUBLIC = 0x00000001, + SYSTEM_PARTITION = 0x00000002, + VENDOR_PARTITION = 0x00000004, + PRODUCT_PARTITION = 0x00000008, + SIGNATURE = 0x00000010, + ODM_PARTITION = 0x00000020, + OEM_PARTITION = 0x00000040, + ACTOR_SIGNATURE = 0x00000080, + CONFIG_SIGNATURE = 0x0000100, } diff --git a/core/api/current.txt b/core/api/current.txt index d04012e941f8..d82cd72a6691 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -25146,9 +25146,6 @@ package android.net { field public static final int UNSUPPORTED = -1; // 0xffffffff } - public interface TunnelConnectionParams { - } - public abstract class Uri implements java.lang.Comparable<android.net.Uri> android.os.Parcelable { method public abstract android.net.Uri.Builder buildUpon(); method public int compareTo(android.net.Uri); @@ -25713,16 +25710,16 @@ package android.net.vcn { method @NonNull public int[] getExposedCapabilities(); method @NonNull public String getGatewayConnectionName(); method @IntRange(from=android.net.vcn.VcnGatewayConnectionConfig.MIN_MTU_V6) public int getMaxMtu(); - method @NonNull public long[] getRetryIntervalsMs(); + method @NonNull public long[] getRetryIntervalsMillis(); } public static final class VcnGatewayConnectionConfig.Builder { - ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.TunnelConnectionParams); + ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.ipsec.ike.IkeTunnelConnectionParams); method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder addExposedCapability(int); method @NonNull public android.net.vcn.VcnGatewayConnectionConfig build(); method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int); method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMaxMtu(@IntRange(from=android.net.vcn.VcnGatewayConnectionConfig.MIN_MTU_V6) int); - method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMs(@NonNull long[]); + method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMillis(@NonNull long[]); } public class VcnManager { @@ -40409,7 +40406,6 @@ package android.telephony { method @IntRange(from=1, to=261) public int getBand(); method @IntRange(from=1) public int getCellBandwidthDownlinkKhz(); method @IntRange(from=1) public int getCellBandwidthUplinkKhz(); - method @Deprecated public int getChannelNumber(); method public int getConnectionStatus(); method @IntRange(from=0) public int getDownlinkChannelNumber(); method @IntRange(from=0) public int getDownlinkFrequencyKhz(); diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 66ac74ac84d9..848f480c79a1 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -59,13 +59,13 @@ package android.net { public final class NetworkStateSnapshot implements android.os.Parcelable { ctor public NetworkStateSnapshot(@NonNull android.net.Network, @NonNull android.net.NetworkCapabilities, @NonNull android.net.LinkProperties, @Nullable String, int); method public int describeContents(); + method public int getLegacyType(); + method @NonNull public android.net.LinkProperties getLinkProperties(); + method @NonNull public android.net.Network getNetwork(); + method @NonNull public android.net.NetworkCapabilities getNetworkCapabilities(); + method @Nullable public String getSubscriberId(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.NetworkStateSnapshot> CREATOR; - field public final int legacyType; - field @NonNull public final android.net.LinkProperties linkProperties; - field @NonNull public final android.net.Network network; - field @NonNull public final android.net.NetworkCapabilities networkCapabilities; - field @Nullable public final String subscriberId; } public class NetworkWatchlistManager { @@ -89,11 +89,11 @@ package android.net { public final class UnderlyingNetworkInfo implements android.os.Parcelable { ctor public UnderlyingNetworkInfo(int, @NonNull String, @NonNull java.util.List<java.lang.String>); method public int describeContents(); + method @NonNull public String getIface(); + method public int getOwnerUid(); + method @NonNull public java.util.List<java.lang.String> getUnderlyingIfaces(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.net.UnderlyingNetworkInfo> CREATOR; - field @NonNull public final String iface; - field public final int ownerUid; - field @NonNull public final java.util.List<java.lang.String> underlyingIfaces; } public class VpnManager { diff --git a/core/api/test-current.txt b/core/api/test-current.txt index fd6d47e56b52..e2975ad85ff8 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -14,6 +14,7 @@ package android { field public static final String CONTROL_DEVICE_LIGHTS = "android.permission.CONTROL_DEVICE_LIGHTS"; field public static final String FORCE_DEVICE_POLICY_MANAGER_LOGS = "android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS"; field public static final String FORCE_STOP_PACKAGES = "android.permission.FORCE_STOP_PACKAGES"; + field public static final String INSTALL_TEST_ONLY_PACKAGE = "android.permission.INSTALL_TEST_ONLY_PACKAGE"; field public static final String KEEP_UNINSTALLED_PACKAGES = "android.permission.KEEP_UNINSTALLED_PACKAGES"; field public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS"; field public static final String MANAGE_CRATES = "android.permission.MANAGE_CRATES"; @@ -1683,6 +1684,7 @@ package android.telephony { public class TelephonyManager { method public int addDevicePolicyOverrideApn(@NonNull android.content.Context, @NonNull android.telephony.data.ApnSetting); method public int getCarrierIdListVersion(); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCertsFromCarrierPrivilegeAccessRules(); method @NonNull public java.util.List<android.telephony.data.ApnSetting> getDevicePolicyOverrideApns(@NonNull android.content.Context); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag(); method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion(); diff --git a/core/java/android/app/compat/PackageOverride.java b/core/java/android/app/compat/PackageOverride.java index 59b355523a30..fad6cd311021 100644 --- a/core/java/android/app/compat/PackageOverride.java +++ b/core/java/android/app/compat/PackageOverride.java @@ -19,6 +19,7 @@ package android.app.compat; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.content.pm.PackageInfo; import android.os.Parcel; import java.lang.annotation.Retention; @@ -101,12 +102,20 @@ public final class PackageOverride { return VALUE_UNDEFINED; } - /** Returns the minimum version code the override applies to. */ + /** + * Returns the minimum APK version code the override applies to. + * + * @see PackageInfo#getLongVersionCode() + */ public long getMinVersionCode() { return mMinVersionCode; } - /** Returns the minimum version code the override applies from. */ + /** + * Returns the maximum APK version code the override applies from. + * + * @see PackageInfo#getLongVersionCode() + */ public long getMaxVersionCode() { return mMaxVersionCode; } @@ -146,9 +155,11 @@ public final class PackageOverride { private boolean mEnabled; /** - * Sets the minimum version code the override should apply from. + * Sets the minimum APK version code the override should apply from. * * default value: {@code Long.MIN_VALUE}. + * + * @see PackageInfo#getLongVersionCode() */ @NonNull public Builder setMinVersionCode(long minVersionCode) { @@ -157,9 +168,11 @@ public final class PackageOverride { } /** - * Sets the maximum version code the override should apply to. + * Sets the maximum APK version code the override should apply to. * * default value: {@code Long.MAX_VALUE}. + * + * @see PackageInfo#getLongVersionCode() */ @NonNull public Builder setMaxVersionCode(long maxVersionCode) { diff --git a/core/java/android/content/pm/OWNERS b/core/java/android/content/pm/OWNERS index f0def80505ce..4e674f6ec9a8 100644 --- a/core/java/android/content/pm/OWNERS +++ b/core/java/android/content/pm/OWNERS @@ -4,7 +4,8 @@ toddke@android.com toddke@google.com patb@google.com -per-file PackageParser.java = chiuwinson@google.com +per-file PackageParser.java = set noparent +per-file PackageParser.java = chiuwinson@google.com,patb@google.com,toddke@google.com per-file *Shortcut* = file:/core/java/android/content/pm/SHORTCUT_OWNERS per-file AppSearchPerson.java = file:/core/java/android/content/pm/SHORTCUT_OWNERS per-file *Launcher* = file:/core/java/android/content/pm/LAUNCHER_OWNERS diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index e385cd2b7ecd..362a205d6178 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -26,6 +26,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.os.RemoteException; +import android.os.UserHandle; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import android.util.Slog; @@ -334,11 +335,23 @@ public class BiometricManager { * in Keystore land as SIDs, and are used during key generation. * @hide */ - @RequiresPermission(USE_BIOMETRIC_INTERNAL) public long[] getAuthenticatorIds() { + return getAuthenticatorIds(UserHandle.myUserId()); + } + + /** + * Get a list of AuthenticatorIDs for biometric authenticators which have 1) enrolled templates, + * and 2) meet the requirements for integrating with Keystore. The AuthenticatorIDs are known + * in Keystore land as SIDs, and are used during key generation. + * + * @param userId Android user ID for user to look up. + * + * @hide + */ + public long[] getAuthenticatorIds(int userId) { if (mService != null) { try { - return mService.getAuthenticatorIds(); + return mService.getAuthenticatorIds(userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -347,6 +360,5 @@ public class BiometricManager { return new long[0]; } } - } diff --git a/core/java/android/hardware/biometrics/IAuthService.aidl b/core/java/android/hardware/biometrics/IAuthService.aidl index a6f6c1ea0293..3542482927cb 100644 --- a/core/java/android/hardware/biometrics/IAuthService.aidl +++ b/core/java/android/hardware/biometrics/IAuthService.aidl @@ -55,5 +55,7 @@ interface IAuthService { // Get a list of AuthenticatorIDs for authenticators which have enrolled templates and meet // the requirements for integrating with Keystore. The AuthenticatorID are known in Keystore // land as SIDs, and are used during key generation. - long[] getAuthenticatorIds(); + // If userId is not equal to the calling user ID, the caller must have the + // USE_BIOMETRIC_INTERNAL permission. + long[] getAuthenticatorIds(in int userId); } diff --git a/core/java/android/hardware/face/OWNERS b/core/java/android/hardware/face/OWNERS index be10df1099ed..0b4d9d9d6f54 100644 --- a/core/java/android/hardware/face/OWNERS +++ b/core/java/android/hardware/face/OWNERS @@ -1,7 +1,3 @@ # Bug component: 879035 -curtislb@google.com -ilyamaty@google.com -jaggies@google.com -joshmccloskey@google.com -kchyn@google.com +include /services/core/java/com/android/server/biometrics/OWNERS diff --git a/core/java/android/hardware/fingerprint/OWNERS b/core/java/android/hardware/fingerprint/OWNERS index e55b8c564ddb..5c9367240b8d 100644 --- a/core/java/android/hardware/fingerprint/OWNERS +++ b/core/java/android/hardware/fingerprint/OWNERS @@ -1,8 +1,3 @@ # Bug component: 114777 -curtislb@google.com -ilyamaty@google.com -jaggies@google.com -joshmccloskey@google.com -kchyn@google.com - +include /services/core/java/com/android/server/biometrics/OWNERS diff --git a/core/java/android/hardware/iris/OWNERS b/core/java/android/hardware/iris/OWNERS index 33527f824827..0b4d9d9d6f54 100644 --- a/core/java/android/hardware/iris/OWNERS +++ b/core/java/android/hardware/iris/OWNERS @@ -1,3 +1,3 @@ # Bug component: 879035 -jaggies@google.com +include /services/core/java/com/android/server/biometrics/OWNERS diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index 1eef7d9a5337..3bde6fa6913d 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -186,19 +186,19 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { */ public static NetworkIdentity buildNetworkIdentity(Context context, NetworkStateSnapshot snapshot, boolean defaultNetwork, @NetworkType int subType) { - final int legacyType = snapshot.legacyType; + final int legacyType = snapshot.getLegacyType(); - final String subscriberId = snapshot.subscriberId; + final String subscriberId = snapshot.getSubscriberId(); String networkId = null; - boolean roaming = !snapshot.networkCapabilities.hasCapability( + boolean roaming = !snapshot.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); - boolean metered = !snapshot.networkCapabilities.hasCapability( + boolean metered = !snapshot.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_METERED); - final int oemManaged = getOemBitfield(snapshot.networkCapabilities); + final int oemManaged = getOemBitfield(snapshot.getNetworkCapabilities()); if (legacyType == TYPE_WIFI) { - networkId = snapshot.networkCapabilities.getSsid(); + networkId = snapshot.getNetworkCapabilities().getSsid(); if (networkId == null) { final WifiManager wifi = context.getSystemService(WifiManager.class); final WifiInfo info = wifi.getConnectionInfo(); diff --git a/core/java/android/net/NetworkStateSnapshot.java b/core/java/android/net/NetworkStateSnapshot.java index 0d26c2de8698..9df861a6ffdc 100644 --- a/core/java/android/net/NetworkStateSnapshot.java +++ b/core/java/android/net/NetworkStateSnapshot.java @@ -37,47 +37,76 @@ import java.util.Objects; public final class NetworkStateSnapshot implements Parcelable { /** The network associated with this snapshot. */ @NonNull - public final Network network; + private final Network mNetwork; /** The {@link NetworkCapabilities} of the network associated with this snapshot. */ @NonNull - public final NetworkCapabilities networkCapabilities; + private final NetworkCapabilities mNetworkCapabilities; /** The {@link LinkProperties} of the network associated with this snapshot. */ @NonNull - public final LinkProperties linkProperties; + private final LinkProperties mLinkProperties; /** * The Subscriber Id of the network associated with this snapshot. See * {@link android.telephony.TelephonyManager#getSubscriberId()}. */ @Nullable - public final String subscriberId; + private final String mSubscriberId; /** * The legacy type of the network associated with this snapshot. See * {@code ConnectivityManager#TYPE_*}. */ - public final int legacyType; + private final int mLegacyType; public NetworkStateSnapshot(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities, @NonNull LinkProperties linkProperties, @Nullable String subscriberId, int legacyType) { - this.network = Objects.requireNonNull(network); - this.networkCapabilities = Objects.requireNonNull(networkCapabilities); - this.linkProperties = Objects.requireNonNull(linkProperties); - this.subscriberId = subscriberId; - this.legacyType = legacyType; + mNetwork = Objects.requireNonNull(network); + mNetworkCapabilities = Objects.requireNonNull(networkCapabilities); + mLinkProperties = Objects.requireNonNull(linkProperties); + mSubscriberId = subscriberId; + mLegacyType = legacyType; } /** @hide */ public NetworkStateSnapshot(@NonNull Parcel in) { - network = in.readParcelable(null); - networkCapabilities = in.readParcelable(null); - linkProperties = in.readParcelable(null); - subscriberId = in.readString(); - legacyType = in.readInt(); + mNetwork = in.readParcelable(null); + mNetworkCapabilities = in.readParcelable(null); + mLinkProperties = in.readParcelable(null); + mSubscriberId = in.readString(); + mLegacyType = in.readInt(); + } + + /** Get the network associated with this snapshot */ + @NonNull + public Network getNetwork() { + return mNetwork; + } + + /** Get {@link NetworkCapabilities} of the network associated with this snapshot. */ + @NonNull + public NetworkCapabilities getNetworkCapabilities() { + return mNetworkCapabilities; + } + + /** Get the {@link LinkProperties} of the network associated with this snapshot. */ + @NonNull + public LinkProperties getLinkProperties() { + return mLinkProperties; + } + + /** Get the Subscriber Id of the network associated with this snapshot. */ + @Nullable + public String getSubscriberId() { + return mSubscriberId; + } + + /** Get the legacy type of the network associated with this snapshot. */ + public int getLegacyType() { + return mLegacyType; } @Override @@ -87,11 +116,11 @@ public final class NetworkStateSnapshot implements Parcelable { @Override public void writeToParcel(@NonNull Parcel out, int flags) { - out.writeParcelable(network, flags); - out.writeParcelable(networkCapabilities, flags); - out.writeParcelable(linkProperties, flags); - out.writeString(subscriberId); - out.writeInt(legacyType); + out.writeParcelable(mNetwork, flags); + out.writeParcelable(mNetworkCapabilities, flags); + out.writeParcelable(mLinkProperties, flags); + out.writeString(mSubscriberId); + out.writeInt(mLegacyType); } @NonNull @@ -115,26 +144,27 @@ public final class NetworkStateSnapshot implements Parcelable { if (this == o) return true; if (!(o instanceof NetworkStateSnapshot)) return false; NetworkStateSnapshot that = (NetworkStateSnapshot) o; - return legacyType == that.legacyType - && Objects.equals(network, that.network) - && Objects.equals(networkCapabilities, that.networkCapabilities) - && Objects.equals(linkProperties, that.linkProperties) - && Objects.equals(subscriberId, that.subscriberId); + return mLegacyType == that.mLegacyType + && Objects.equals(mNetwork, that.mNetwork) + && Objects.equals(mNetworkCapabilities, that.mNetworkCapabilities) + && Objects.equals(mLinkProperties, that.mLinkProperties) + && Objects.equals(mSubscriberId, that.mSubscriberId); } @Override public int hashCode() { - return Objects.hash(network, networkCapabilities, linkProperties, subscriberId, legacyType); + return Objects.hash(mNetwork, + mNetworkCapabilities, mLinkProperties, mSubscriberId, mLegacyType); } @Override public String toString() { return "NetworkStateSnapshot{" - + "network=" + network - + ", networkCapabilities=" + networkCapabilities - + ", linkProperties=" + linkProperties - + ", subscriberId='" + NetworkIdentityUtils.scrubSubscriberId(subscriberId) + '\'' - + ", legacyType=" + legacyType + + "network=" + mNetwork + + ", networkCapabilities=" + mNetworkCapabilities + + ", linkProperties=" + mLinkProperties + + ", subscriberId='" + NetworkIdentityUtils.scrubSubscriberId(mSubscriberId) + '\'' + + ", legacyType=" + mLegacyType + '}'; } } diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index d42beae601ed..6ccbab7ed8ef 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -38,6 +38,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Predicate; @@ -1423,11 +1424,11 @@ public final class NetworkStats implements Parcelable { * @hide */ public void migrateTun(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces) { + @NonNull List<String> underlyingIfaces) { // Combined usage by all apps using VPN. final Entry tunIfaceTotal = new Entry(); // Usage by VPN, grouped by its {@code underlyingIfaces}. - final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length]; + final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.size()]; // Usage by VPN, summed across all its {@code underlyingIfaces}. final Entry underlyingIfacesTotal = new Entry(); @@ -1468,7 +1469,7 @@ public final class NetworkStats implements Parcelable { * {@code underlyingIfaces} */ private void tunAdjustmentInit(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal, @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { final Entry recycle = new Entry(); for (int i = 0; i < size; i++) { @@ -1488,8 +1489,8 @@ public final class NetworkStats implements Parcelable { if (recycle.uid == tunUid) { // Add up traffic through tunUid's underlying interfaces. - for (int j = 0; j < underlyingIfaces.length; j++) { - if (Objects.equals(underlyingIfaces[j], recycle.iface)) { + for (int j = 0; j < underlyingIfaces.size(); j++) { + if (Objects.equals(underlyingIfaces.get(j), recycle.iface)) { perInterfaceTotal[j].add(recycle); underlyingIfacesTotal.add(recycle); break; @@ -1515,12 +1516,12 @@ public final class NetworkStats implements Parcelable { * underlyingIfaces} */ private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface, - @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal, @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { // Traffic that should be moved off of each underlying interface for tunUid (see // deductTrafficFromVpnApp below). - final Entry[] moved = new Entry[underlyingIfaces.length]; - for (int i = 0; i < underlyingIfaces.length; i++) { + final Entry[] moved = new Entry[underlyingIfaces.size()]; + for (int i = 0; i < underlyingIfaces.size(); i++) { moved[i] = new Entry(); } @@ -1582,8 +1583,8 @@ public final class NetworkStats implements Parcelable { } // In a second pass, distribute these values across interfaces in the proportion that // each interface represents of the total traffic of the underlying interfaces. - for (int j = 0; j < underlyingIfaces.length; j++) { - tmpEntry.iface = underlyingIfaces[j]; + for (int j = 0; j < underlyingIfaces.size(); j++) { + tmpEntry.iface = underlyingIfaces.get(j); tmpEntry.rxBytes = 0; // Reset 'set' to correct value since it gets updated when adding debug info below. tmpEntry.set = set[i]; @@ -1638,14 +1639,14 @@ public final class NetworkStats implements Parcelable { private void deductTrafficFromVpnApp( int tunUid, - @NonNull String[] underlyingIfaces, + @NonNull List<String> underlyingIfaces, @NonNull Entry[] moved) { - for (int i = 0; i < underlyingIfaces.length; i++) { + for (int i = 0; i < underlyingIfaces.size(); i++) { moved[i].uid = tunUid; // Add debug info moved[i].set = SET_DBG_VPN_OUT; moved[i].tag = TAG_NONE; - moved[i].iface = underlyingIfaces[i]; + moved[i].iface = underlyingIfaces.get(i); moved[i].metered = METERED_ALL; moved[i].roaming = ROAMING_ALL; moved[i].defaultNetwork = DEFAULT_NETWORK_ALL; @@ -1658,7 +1659,7 @@ public final class NetworkStats implements Parcelable { // METERED_NO, which should be the case as it comes directly from the /proc file. // We only blend in the roaming data after applying these adjustments, by checking the // NetworkIdentity of the underlying iface. - final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT, + final int idxVpnBackground = findIndex(underlyingIfaces.get(i), tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); if (idxVpnBackground != -1) { // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed @@ -1666,7 +1667,7 @@ public final class NetworkStats implements Parcelable { tunSubtract(idxVpnBackground, this, moved[i]); } - final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND, + final int idxVpnForeground = findIndex(underlyingIfaces.get(i), tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); if (idxVpnForeground != -1) { tunSubtract(idxVpnForeground, this, moved[i]); diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index c83dd99c2a3b..d3c89574944f 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -82,6 +82,24 @@ public class NetworkTemplate implements Parcelable { public static final int MATCH_WIFI_WILDCARD = 7; public static final int MATCH_BLUETOOTH = 8; public static final int MATCH_PROXY = 9; + public static final int MATCH_CARRIER = 10; + + /** + * Value of the match rule of the subscriberId to match networks with specific subscriberId. + */ + public static final int SUBSCRIBER_ID_MATCH_RULE_EXACT = 0; + /** + * Value of the match rule of the subscriberId to match networks with any subscriberId which + * includes null and non-null. + */ + public static final int SUBSCRIBER_ID_MATCH_RULE_ALL = 1; + + /** + * Wi-Fi Network ID is never supposed to be null (if it is, it is a bug that + * should be fixed), so it's not possible to want to match null vs + * non-null. Therefore it's fine to use null as a sentinel for Network ID. + */ + public static final String WIFI_NETWORKID_ALL = null; /** * Include all network types when filtering. This is meant to merge in with the @@ -125,6 +143,7 @@ public class NetworkTemplate implements Parcelable { case MATCH_WIFI_WILDCARD: case MATCH_BLUETOOTH: case MATCH_PROXY: + case MATCH_CARRIER: return true; default: @@ -168,10 +187,12 @@ public class NetworkTemplate implements Parcelable { @NetworkType int ratType) { if (TextUtils.isEmpty(subscriberId)) { return new NetworkTemplate(MATCH_MOBILE_WILDCARD, null, null, null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); } return new NetworkTemplate(MATCH_MOBILE, subscriberId, new String[]{subscriberId}, null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, ratType, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @@ -189,6 +210,8 @@ public class NetworkTemplate implements Parcelable { */ @UnsupportedAppUsage public static NetworkTemplate buildTemplateWifiWildcard() { + // TODO: Consider replace this with MATCH_WIFI with NETWORK_ID_ALL + // and SUBSCRIBER_ID_MATCH_RULE_ALL. return new NetworkTemplate(MATCH_WIFI_WILDCARD, null, null); } @@ -202,8 +225,27 @@ public class NetworkTemplate implements Parcelable { * Template to match {@link ConnectivityManager#TYPE_WIFI} networks with the * given SSID. */ - public static NetworkTemplate buildTemplateWifi(String networkId) { - return new NetworkTemplate(MATCH_WIFI, null, networkId); + public static NetworkTemplate buildTemplateWifi(@NonNull String networkId) { + Objects.requireNonNull(networkId); + return new NetworkTemplate(MATCH_WIFI, null /* subscriberId */, + new String[] { null } /* matchSubscriberIds */, + networkId, METERED_ALL, ROAMING_ALL, + DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_ALL); + } + + /** + * Template to match all {@link ConnectivityManager#TYPE_WIFI} networks with the given SSID, + * and IMSI. + * + * Call with {@link #WIFI_NETWORKID_ALL} for {@code networkId} to get result regardless of SSID. + */ + public static NetworkTemplate buildTemplateWifi(@Nullable String networkId, + @Nullable String subscriberId) { + return new NetworkTemplate(MATCH_WIFI, subscriberId, new String[] { subscriberId }, + networkId, METERED_ALL, ROAMING_ALL, + DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); } /** @@ -231,6 +273,14 @@ public class NetworkTemplate implements Parcelable { return new NetworkTemplate(MATCH_PROXY, null, null); } + /** + * Template to match all carrier networks with the given IMSI. + */ + public static NetworkTemplate buildTemplateCarrier(@NonNull String subscriberId) { + Objects.requireNonNull(subscriberId); + return new NetworkTemplate(MATCH_CARRIER, subscriberId, null); + } + private final int mMatchRule; private final String mSubscriberId; @@ -251,10 +301,26 @@ public class NetworkTemplate implements Parcelable { private final int mRoaming; private final int mDefaultNetwork; private final int mSubType; + private final int mSubscriberIdMatchRule; // Bitfield containing OEM network properties{@code NetworkIdentity#OEM_*}. private final int mOemManaged; + private void checkValidSubscriberIdMatchRule() { + switch (mMatchRule) { + case MATCH_MOBILE: + case MATCH_CARRIER: + // MOBILE and CARRIER templates must always specify a subscriber ID. + if (mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) { + throw new IllegalArgumentException("Invalid SubscriberIdMatchRule" + + "on match rule: " + getMatchRuleName(mMatchRule)); + } + return; + default: + return; + } + } + @UnsupportedAppUsage public NetworkTemplate(int matchRule, String subscriberId, String networkId) { this(matchRule, subscriberId, new String[] { subscriberId }, networkId); @@ -263,14 +329,25 @@ public class NetworkTemplate implements Parcelable { public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds, String networkId) { this(matchRule, subscriberId, matchSubscriberIds, networkId, METERED_ALL, ROAMING_ALL, - DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL); + DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); } + // TODO: Remove it after updating all of the caller. public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds, String networkId, int metered, int roaming, int defaultNetwork, int subType, int oemManaged) { + this(matchRule, subscriberId, matchSubscriberIds, networkId, metered, roaming, + defaultNetwork, subType, oemManaged, SUBSCRIBER_ID_MATCH_RULE_EXACT); + } + + public NetworkTemplate(int matchRule, String subscriberId, String[] matchSubscriberIds, + String networkId, int metered, int roaming, int defaultNetwork, int subType, + int oemManaged, int subscriberIdMatchRule) { mMatchRule = matchRule; mSubscriberId = subscriberId; + // TODO: Check whether mMatchSubscriberIds = null or mMatchSubscriberIds = {null} when + // mSubscriberId is null mMatchSubscriberIds = matchSubscriberIds; mNetworkId = networkId; mMetered = metered; @@ -278,7 +355,8 @@ public class NetworkTemplate implements Parcelable { mDefaultNetwork = defaultNetwork; mSubType = subType; mOemManaged = oemManaged; - + mSubscriberIdMatchRule = subscriberIdMatchRule; + checkValidSubscriberIdMatchRule(); if (!isKnownMatchRule(matchRule)) { Log.e(TAG, "Unknown network template rule " + matchRule + " will not match any identity."); @@ -295,6 +373,7 @@ public class NetworkTemplate implements Parcelable { mDefaultNetwork = in.readInt(); mSubType = in.readInt(); mOemManaged = in.readInt(); + mSubscriberIdMatchRule = in.readInt(); } @Override @@ -308,6 +387,7 @@ public class NetworkTemplate implements Parcelable { dest.writeInt(mDefaultNetwork); dest.writeInt(mSubType); dest.writeInt(mOemManaged); + dest.writeInt(mSubscriberIdMatchRule); } @Override @@ -346,13 +426,15 @@ public class NetworkTemplate implements Parcelable { if (mOemManaged != OEM_MANAGED_ALL) { builder.append(", oemManaged=").append(mOemManaged); } + builder.append(", subscriberIdMatchRule=") + .append(subscriberIdMatchRuleToString(mSubscriberIdMatchRule)); return builder.toString(); } @Override public int hashCode() { return Objects.hash(mMatchRule, mSubscriberId, mNetworkId, mMetered, mRoaming, - mDefaultNetwork, mSubType, mOemManaged); + mDefaultNetwork, mSubType, mOemManaged, mSubscriberIdMatchRule); } @Override @@ -366,11 +448,23 @@ public class NetworkTemplate implements Parcelable { && mRoaming == other.mRoaming && mDefaultNetwork == other.mDefaultNetwork && mSubType == other.mSubType - && mOemManaged == other.mOemManaged; + && mOemManaged == other.mOemManaged + && mSubscriberIdMatchRule == other.mSubscriberIdMatchRule; } return false; } + private String subscriberIdMatchRuleToString(int rule) { + switch (rule) { + case SUBSCRIBER_ID_MATCH_RULE_EXACT: + return "EXACT_MATCH"; + case SUBSCRIBER_ID_MATCH_RULE_ALL: + return "ALL"; + default: + return "Unknown rule " + rule; + } + } + public boolean isMatchRuleMobile() { switch (mMatchRule) { case MATCH_MOBILE: @@ -386,6 +480,14 @@ public class NetworkTemplate implements Parcelable { case MATCH_MOBILE_WILDCARD: case MATCH_WIFI_WILDCARD: return false; + case MATCH_CARRIER: + return mSubscriberId != null; + case MATCH_WIFI: + if (Objects.equals(mNetworkId, WIFI_NETWORKID_ALL) + && mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL) { + return false; + } + return true; default: return true; } @@ -405,6 +507,10 @@ public class NetworkTemplate implements Parcelable { return mNetworkId; } + public int getSubscriberIdMatchRule() { + return mSubscriberIdMatchRule; + } + /** * Test if given {@link NetworkIdentity} matches this template. */ @@ -429,6 +535,8 @@ public class NetworkTemplate implements Parcelable { return matchesBluetooth(ident); case MATCH_PROXY: return matchesProxy(ident); + case MATCH_CARRIER: + return matchesCarrier(ident); default: // We have no idea what kind of network template we are, so we // just claim not to match anything. @@ -466,8 +574,23 @@ public class NetworkTemplate implements Parcelable { || getCollapsedRatType(mSubType) == getCollapsedRatType(ident.mSubType); } - public boolean matchesSubscriberId(String subscriberId) { - return ArrayUtils.contains(mMatchSubscriberIds, subscriberId); + /** + * Check if this template matches {@code subscriberId}. Returns true if this + * template was created with {@code SUBSCRIBER_ID_MATCH_RULE_ALL}, or with a + * {@code mMatchSubscriberIds} array that contains {@code subscriberId}. + */ + public boolean matchesSubscriberId(@Nullable String subscriberId) { + return mSubscriberIdMatchRule == SUBSCRIBER_ID_MATCH_RULE_ALL + || ArrayUtils.contains(mMatchSubscriberIds, subscriberId); + } + + /** + * Check if network with matching SSID. Returns true when the SSID matches, or when + * {@code mNetworkId} is {@code WIFI_NETWORKID_ALL}. + */ + private boolean matchesWifiNetworkId(@Nullable String networkId) { + return Objects.equals(mNetworkId, WIFI_NETWORKID_ALL) + || Objects.equals(sanitizeSsid(mNetworkId), sanitizeSsid(networkId)); } /** @@ -566,8 +689,8 @@ public class NetworkTemplate implements Parcelable { private boolean matchesWifi(NetworkIdentity ident) { switch (ident.mType) { case TYPE_WIFI: - return Objects.equals( - sanitizeSsid(mNetworkId), sanitizeSsid(ident.mNetworkId)); + return matchesSubscriberId(ident.mSubscriberId) + && matchesWifiNetworkId(ident.mNetworkId); default: return false; } @@ -583,6 +706,15 @@ public class NetworkTemplate implements Parcelable { return false; } + /** + * Check if matches carrier network. The carrier networks means it includes the subscriberId. + */ + private boolean matchesCarrier(NetworkIdentity ident) { + return ident.mSubscriberId != null + && !ArrayUtils.isEmpty(mMatchSubscriberIds) + && ArrayUtils.contains(mMatchSubscriberIds, ident.mSubscriberId); + } + private boolean matchesMobileWildcard(NetworkIdentity ident) { if (ident.mType == TYPE_WIMAX) { return true; @@ -635,6 +767,8 @@ public class NetworkTemplate implements Parcelable { return "BLUETOOTH"; case MATCH_PROXY: return "PROXY"; + case MATCH_CARRIER: + return "CARRIER"; default: return "UNKNOWN(" + matchRule + ")"; } diff --git a/core/java/android/net/TunnelConnectionParams.java b/core/java/android/net/TunnelConnectionParams.java deleted file mode 100644 index f5b35395b0bf..000000000000 --- a/core/java/android/net/TunnelConnectionParams.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.net; - -/** - * TunnelConnectionParams represents a configuration to set up a tunnel connection. - * - * <p>Concrete implementations for a control plane protocol should implement this interface. - * Subclasses should be immutable data classes containing connection, authentication and - * authorization parameters required to establish a tunnel connection. - * - * @see android.net.ipsec.ike.IkeTunnelConnectionParams - */ -// TODO:b/186071626 Remove TunnelConnectionParams when non-updatable API stub can resolve -// IkeTunnelConnectionParams -public interface TunnelConnectionParams {} diff --git a/core/java/android/net/UnderlyingNetworkInfo.java b/core/java/android/net/UnderlyingNetworkInfo.java index 7bf923123910..459fdacef816 100644 --- a/core/java/android/net/UnderlyingNetworkInfo.java +++ b/core/java/android/net/UnderlyingNetworkInfo.java @@ -37,36 +37,56 @@ import java.util.Objects; @SystemApi(client = MODULE_LIBRARIES) public final class UnderlyingNetworkInfo implements Parcelable { /** The owner of this network. */ - public final int ownerUid; + private final int mOwnerUid; + /** The interface name of this network. */ @NonNull - public final String iface; + private final String mIface; + /** The names of the interfaces underlying this network. */ @NonNull - public final List<String> underlyingIfaces; + private final List<String> mUnderlyingIfaces; public UnderlyingNetworkInfo(int ownerUid, @NonNull String iface, @NonNull List<String> underlyingIfaces) { Objects.requireNonNull(iface); Objects.requireNonNull(underlyingIfaces); - this.ownerUid = ownerUid; - this.iface = iface; - this.underlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces)); + mOwnerUid = ownerUid; + mIface = iface; + mUnderlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces)); } private UnderlyingNetworkInfo(@NonNull Parcel in) { - this.ownerUid = in.readInt(); - this.iface = in.readString(); - this.underlyingIfaces = new ArrayList<>(); - in.readList(this.underlyingIfaces, null /*classLoader*/); + mOwnerUid = in.readInt(); + mIface = in.readString(); + List<String> underlyingIfaces = new ArrayList<>(); + in.readList(underlyingIfaces, null /*classLoader*/); + mUnderlyingIfaces = Collections.unmodifiableList(underlyingIfaces); + } + + /** Get the owner of this network. */ + public int getOwnerUid() { + return mOwnerUid; + } + + /** Get the interface name of this network. */ + @NonNull + public String getIface() { + return mIface; + } + + /** Get the names of the interfaces underlying this network. */ + @NonNull + public List<String> getUnderlyingIfaces() { + return mUnderlyingIfaces; } @Override public String toString() { return "UnderlyingNetworkInfo{" - + "ownerUid=" + ownerUid - + ", iface='" + iface + '\'' - + ", underlyingIfaces='" + underlyingIfaces.toString() + '\'' + + "ownerUid=" + mOwnerUid + + ", iface='" + mIface + '\'' + + ", underlyingIfaces='" + mUnderlyingIfaces.toString() + '\'' + '}'; } @@ -77,9 +97,9 @@ public final class UnderlyingNetworkInfo implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(ownerUid); - dest.writeString(iface); - dest.writeList(underlyingIfaces); + dest.writeInt(mOwnerUid); + dest.writeString(mIface); + dest.writeList(mUnderlyingIfaces); } @NonNull @@ -103,13 +123,13 @@ public final class UnderlyingNetworkInfo implements Parcelable { if (this == o) return true; if (!(o instanceof UnderlyingNetworkInfo)) return false; final UnderlyingNetworkInfo that = (UnderlyingNetworkInfo) o; - return ownerUid == that.ownerUid - && Objects.equals(iface, that.iface) - && Objects.equals(underlyingIfaces, that.underlyingIfaces); + return mOwnerUid == that.getOwnerUid() + && Objects.equals(mIface, that.getIface()) + && Objects.equals(mUnderlyingIfaces, that.getUnderlyingIfaces()); } @Override public int hashCode() { - return Objects.hash(ownerUid, iface, underlyingIfaces); + return Objects.hash(mOwnerUid, mIface, mUnderlyingIfaces); } } diff --git a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java index adcbe2542ab6..be308d01d98a 100644 --- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java +++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java @@ -24,7 +24,7 @@ import android.annotation.Nullable; import android.annotation.SuppressLint; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.TunnelConnectionParams; +import android.net.ipsec.ike.IkeTunnelConnectionParams; import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtils; import android.os.PersistableBundle; import android.util.ArraySet; @@ -136,7 +136,7 @@ public final class VcnGatewayConnectionConfig { * <p>To ensure the device is not constantly being woken up, this retry interval MUST be greater * than this value. * - * @see {@link Builder#setRetryIntervalsMs()} + * @see {@link Builder#setRetryIntervalsMillis()} */ private static final long MINIMUM_REPEATING_RETRY_INTERVAL_MS = TimeUnit.MINUTES.toMillis(15); @@ -154,7 +154,7 @@ public final class VcnGatewayConnectionConfig { @NonNull private final String mGatewayConnectionName; private static final String TUNNEL_CONNECTION_PARAMS_KEY = "mTunnelConnectionParams"; - @NonNull private TunnelConnectionParams mTunnelConnectionParams; + @NonNull private IkeTunnelConnectionParams mTunnelConnectionParams; private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities"; @NonNull private final SortedSet<Integer> mExposedCapabilities; @@ -171,7 +171,7 @@ public final class VcnGatewayConnectionConfig { /** Builds a VcnGatewayConnectionConfig with the specified parameters. */ private VcnGatewayConnectionConfig( @NonNull String gatewayConnectionName, - @NonNull TunnelConnectionParams tunnelConnectionParams, + @NonNull IkeTunnelConnectionParams tunnelConnectionParams, @NonNull Set<Integer> exposedCapabilities, @NonNull Set<Integer> underlyingCapabilities, @NonNull long[] retryIntervalsMs, @@ -271,7 +271,7 @@ public final class VcnGatewayConnectionConfig { * @hide */ @NonNull - public TunnelConnectionParams getTunnelConnectionParams() { + public IkeTunnelConnectionParams getTunnelConnectionParams() { return mTunnelConnectionParams; } @@ -337,10 +337,10 @@ public final class VcnGatewayConnectionConfig { /** * Retrieves the configured retry intervals. * - * @see Builder#setRetryIntervalsMs(long[]) + * @see Builder#setRetryIntervalsMillis(long[]) */ @NonNull - public long[] getRetryIntervalsMs() { + public long[] getRetryIntervalsMillis() { return Arrays.copyOf(mRetryIntervalsMs, mRetryIntervalsMs.length); } @@ -414,7 +414,7 @@ public final class VcnGatewayConnectionConfig { */ public static final class Builder { @NonNull private final String mGatewayConnectionName; - @NonNull private final TunnelConnectionParams mTunnelConnectionParams; + @NonNull private final IkeTunnelConnectionParams mTunnelConnectionParams; @NonNull private final Set<Integer> mExposedCapabilities = new ArraySet(); @NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet(); @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS; @@ -432,13 +432,13 @@ public final class VcnGatewayConnectionConfig { * VcnConfig} must be given a unique name. This name is used by the caller to * distinguish between VcnGatewayConnectionConfigs configured on a single {@link * VcnConfig}. This will be used as the identifier in VcnStatusCallback invocations. - * @param tunnelConnectionParams the tunnel connection configuration - * @see TunnelConnectionParams + * @param tunnelConnectionParams the IKE tunnel connection configuration + * @see IkeTunnelConnectionParams * @see VcnManager.VcnStatusCallback#onGatewayConnectionError */ public Builder( @NonNull String gatewayConnectionName, - @NonNull TunnelConnectionParams tunnelConnectionParams) { + @NonNull IkeTunnelConnectionParams tunnelConnectionParams) { Objects.requireNonNull(gatewayConnectionName, "gatewayConnectionName was null"); Objects.requireNonNull(tunnelConnectionParams, "tunnelConnectionParams was null"); @@ -550,7 +550,7 @@ public final class VcnGatewayConnectionConfig { * @see VcnManager for additional discussion on fail-safe mode */ @NonNull - public Builder setRetryIntervalsMs(@NonNull long[] retryIntervalsMs) { + public Builder setRetryIntervalsMillis(@NonNull long[] retryIntervalsMs) { validateRetryInterval(retryIntervalsMs); mRetryIntervalsMs = retryIntervalsMs; diff --git a/core/java/android/net/vcn/VcnTransportInfo.java b/core/java/android/net/vcn/VcnTransportInfo.java index 4d8cf91621ba..0e9ccf144c2e 100644 --- a/core/java/android/net/vcn/VcnTransportInfo.java +++ b/core/java/android/net/vcn/VcnTransportInfo.java @@ -16,14 +16,23 @@ package android.net.vcn; +import static android.net.NetworkCapabilities.REDACT_ALL; +import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; +import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; + +import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; + import android.annotation.NonNull; import android.annotation.Nullable; +import android.net.NetworkCapabilities; import android.net.TransportInfo; import android.net.wifi.WifiInfo; import android.os.Parcel; import android.os.Parcelable; import android.telephony.SubscriptionManager; +import com.android.internal.annotations.VisibleForTesting; + import java.util.Objects; /** @@ -37,28 +46,41 @@ import java.util.Objects; * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. If the underlying Network is Cellular, the WifiInfo * will be {@code null}. * + * <p>Receipt of a VcnTransportInfo requires the NETWORK_SETTINGS permission; else the entire + * VcnTransportInfo instance will be redacted. + * * @hide */ public class VcnTransportInfo implements TransportInfo, Parcelable { @Nullable private final WifiInfo mWifiInfo; private final int mSubId; + /** + * The redaction scheme to use when parcelling. + * + * <p>The TransportInfo/NetworkCapabilities redaction mechanisms rely on redaction being + * performed at parcelling time. This means that the redaction scheme must be stored for later + * use. + * + * <p>Since the redaction scheme itself is not parcelled, this field is listed as a transient. + * + * <p>Defaults to REDACT_ALL when constructed using public constructors, or creating from + * parcels. + */ + private final transient long mRedactions; + public VcnTransportInfo(@NonNull WifiInfo wifiInfo) { - this(wifiInfo, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + this(wifiInfo, INVALID_SUBSCRIPTION_ID, REDACT_ALL); } public VcnTransportInfo(int subId) { - this(null /* wifiInfo */, subId); + this(null /* wifiInfo */, subId, REDACT_ALL); } - private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) { - if (wifiInfo == null && subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - throw new IllegalArgumentException( - "VcnTransportInfo requires either non-null WifiInfo or valid subId"); - } - + private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId, long redactions) { mWifiInfo = wifiInfo; mSubId = subId; + mRedactions = redactions; } /** @@ -86,8 +108,19 @@ public class VcnTransportInfo implements TransportInfo, Parcelable { return mSubId; } + /** + * Gets the redaction scheme + * + * @hide + */ + @VisibleForTesting(visibility = PRIVATE) + public long getRedaction() { + return mRedactions; + } + @Override public int hashCode() { + // mRedactions not hashed, as it is a transient, for control of parcelling return Objects.hash(mWifiInfo, mSubId); } @@ -96,6 +129,7 @@ public class VcnTransportInfo implements TransportInfo, Parcelable { if (!(o instanceof VcnTransportInfo)) return false; final VcnTransportInfo that = (VcnTransportInfo) o; + // mRedactions not compared, as it is a transient, for control of parcelling return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId; } @@ -105,17 +139,59 @@ public class VcnTransportInfo implements TransportInfo, Parcelable { return 0; } + @Override + @NonNull + public TransportInfo makeCopy(long redactions) { + return new VcnTransportInfo( + mWifiInfo == null ? null : mWifiInfo.makeCopy(redactions), mSubId, redactions); + } + + @Override + public long getApplicableRedactions() { + long redactions = REDACT_FOR_NETWORK_SETTINGS; + + // Add additional wifi redactions if necessary + if (mWifiInfo != null) { + redactions |= mWifiInfo.getApplicableRedactions(); + } + + return redactions; + } + + private boolean shouldParcelNetworkSettingsFields() { + return (mRedactions & NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS) == 0; + } + /** {@inheritDoc} */ @Override - public void writeToParcel(@NonNull Parcel dest, int flags) {} + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(shouldParcelNetworkSettingsFields() ? mSubId : INVALID_SUBSCRIPTION_ID); + dest.writeParcelable( + shouldParcelNetworkSettingsFields() ? (Parcelable) mWifiInfo : null, flags); + } + + @Override + public String toString() { + return "VcnTransportInfo { mWifiInfo = " + mWifiInfo + ", mSubId = " + mSubId + " }"; + } /** Implement the Parcelable interface */ public static final @NonNull Creator<VcnTransportInfo> CREATOR = new Creator<VcnTransportInfo>() { public VcnTransportInfo createFromParcel(Parcel in) { - // return null instead of a default VcnTransportInfo to avoid leaking - // information about this being a VCN Network (instead of macro cellular, etc) - return null; + final int subId = in.readInt(); + final WifiInfo wifiInfo = in.readParcelable(null); + + // If all fields are their null values, return null TransportInfo to avoid + // leaking information about this being a VCN Network (instead of macro + // cellular, etc) + if (wifiInfo == null && subId == INVALID_SUBSCRIPTION_ID) { + return null; + } + + // Prevent further forwarding by redacting everything in future parcels from + // this VcnTransportInfo + return new VcnTransportInfo(wifiInfo, subId, REDACT_ALL); } public VcnTransportInfo[] newArray(int size) { diff --git a/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java b/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java index 690e4e76ea5f..4bc5b49aa207 100644 --- a/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java +++ b/core/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtils.java @@ -16,7 +16,6 @@ package android.net.vcn.persistablebundleutils; import android.annotation.NonNull; -import android.net.TunnelConnectionParams; import android.net.ipsec.ike.IkeSessionParams; import android.net.ipsec.ike.IkeTunnelConnectionParams; import android.net.ipsec.ike.TunnelModeChildSessionParams; @@ -25,7 +24,7 @@ import android.os.PersistableBundle; import java.util.Objects; /** - * Utility class to convert TunnelConnectionParams to/from PersistableBundle + * Utility class to convert Tunnel Connection Params to/from PersistableBundle * * @hide */ @@ -34,30 +33,28 @@ public final class TunnelConnectionParamsUtils { private static final String PARAMS_TYPE_IKE = "IKE"; - /** Serializes an TunnelConnectionParams to a PersistableBundle. */ + /** Serializes an IkeTunnelConnectionParams to a PersistableBundle. */ @NonNull - public static PersistableBundle toPersistableBundle(@NonNull TunnelConnectionParams params) { + public static PersistableBundle toPersistableBundle(@NonNull IkeTunnelConnectionParams params) { final PersistableBundle result = new PersistableBundle(); - if (params instanceof IkeTunnelConnectionParams) { - result.putPersistableBundle( - PARAMS_TYPE_IKE, - IkeTunnelConnectionParamsUtils.serializeIkeParams( - (IkeTunnelConnectionParams) params)); - return result; - } else { - throw new UnsupportedOperationException("Invalid TunnelConnectionParams type"); - } + result.putPersistableBundle( + PARAMS_TYPE_IKE, + IkeTunnelConnectionParamsUtils.serializeIkeParams( + (IkeTunnelConnectionParams) params)); + return result; } - /** Constructs an TunnelConnectionParams by deserializing a PersistableBundle. */ + /** Constructs an IkeTunnelConnectionParams by deserializing a PersistableBundle. */ @NonNull - public static TunnelConnectionParams fromPersistableBundle(@NonNull PersistableBundle in) { + public static IkeTunnelConnectionParams fromPersistableBundle(@NonNull PersistableBundle in) { Objects.requireNonNull(in, "PersistableBundle was null"); if (in.keySet().size() != EXPECTED_BUNDLE_KEY_CNT) { throw new IllegalArgumentException( - "Expect PersistableBundle to have one element but found: " + in.keySet()); + String.format( + "Expect PersistableBundle to have %d element but found: %d", + EXPECTED_BUNDLE_KEY_CNT, in.keySet())); } if (in.get(PARAMS_TYPE_IKE) != null) { @@ -66,7 +63,7 @@ public final class TunnelConnectionParamsUtils { } throw new IllegalArgumentException( - "Invalid TunnelConnectionParams type " + in.keySet().iterator().next()); + "Invalid Tunnel Connection Params type " + in.keySet().iterator().next()); } private static final class IkeTunnelConnectionParamsUtils { diff --git a/core/java/android/nfc/NfcControllerAlwaysOnListener.java b/core/java/android/nfc/NfcControllerAlwaysOnListener.java index 96707bb432db..6ae58fd38cbe 100644 --- a/core/java/android/nfc/NfcControllerAlwaysOnListener.java +++ b/core/java/android/nfc/NfcControllerAlwaysOnListener.java @@ -52,6 +52,14 @@ public class NfcControllerAlwaysOnListener extends INfcControllerAlwaysOnListene */ public void register(@NonNull Executor executor, @NonNull ControllerAlwaysOnListener listener) { + try { + if (!mAdapter.isControllerAlwaysOnSupported()) { + return; + } + } catch (RemoteException e) { + Log.w(TAG, "Failed to register"); + return; + } synchronized (this) { if (mListenerMap.containsKey(listener)) { return; @@ -75,6 +83,14 @@ public class NfcControllerAlwaysOnListener extends INfcControllerAlwaysOnListene * @param listener user implementation of the {@link ControllerAlwaysOnListener} */ public void unregister(@NonNull ControllerAlwaysOnListener listener) { + try { + if (!mAdapter.isControllerAlwaysOnSupported()) { + return; + } + } catch (RemoteException e) { + Log.w(TAG, "Failed to unregister"); + return; + } synchronized (this) { if (!mListenerMap.containsKey(listener)) { return; diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 5a89cdf1d340..0b11aeb1ed65 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -66,9 +66,6 @@ public final class KeymasterDefs { public static final int KM_TAG_CALLER_NONCE = Tag.CALLER_NONCE; // KM_BOOL | 7; public static final int KM_TAG_MIN_MAC_LENGTH = Tag.MIN_MAC_LENGTH; // KM_UINT | 8; - public static final int KM_TAG_BLOB_USAGE_REQUIREMENTS = - Tag.BLOB_USAGE_REQUIREMENTS; // KM_ENUM | 705; - public static final int KM_TAG_RSA_PUBLIC_EXPONENT = Tag.RSA_PUBLIC_EXPONENT; // KM_ULONG | 200; public static final int KM_TAG_INCLUDE_UNIQUE_ID = Tag.INCLUDE_UNIQUE_ID; // KM_BOOL | 202; diff --git a/core/java/android/uwb/AdapterStateListener.java b/core/java/android/uwb/AdapterStateListener.java index b9900951591f..91847f740953 100644 --- a/core/java/android/uwb/AdapterStateListener.java +++ b/core/java/android/uwb/AdapterStateListener.java @@ -68,8 +68,7 @@ public class AdapterStateListener extends IUwbAdapterStateCallbacks.Stub { mIsRegistered = true; } catch (RemoteException e) { Log.w(TAG, "Failed to register adapter state callback"); - executor.execute(() -> callback.onStateChanged(mAdapterState, - AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN)); + throw e.rethrowFromSystemServer(); } } else { sendCurrentState(callback); @@ -95,6 +94,7 @@ public class AdapterStateListener extends IUwbAdapterStateCallbacks.Stub { mAdapter.unregisterAdapterStateCallbacks(this); } catch (RemoteException e) { Log.w(TAG, "Failed to unregister AdapterStateCallback with service"); + throw e.rethrowFromSystemServer(); } mIsRegistered = false; } @@ -115,24 +115,24 @@ public class AdapterStateListener extends IUwbAdapterStateCallbacks.Stub { mAdapter.setEnabled(isEnabled); } catch (RemoteException e) { Log.w(TAG, "Failed to set adapter state"); - sendErrorState(); + throw e.rethrowFromSystemServer(); } } } } - private void sendErrorState() { + /** + * Gets the adapter enabled state + * + * @return integer representing adapter enabled state + */ + public int getAdapterState() { synchronized (this) { - for (AdapterStateCallback callback: mCallbackMap.keySet()) { - Executor executor = mCallbackMap.get(callback); - - final long identity = Binder.clearCallingIdentity(); - try { - executor.execute(() -> callback.onStateChanged( - mAdapterState, mAdapterStateChangeReason)); - } finally { - Binder.restoreCallingIdentity(identity); - } + try { + return mAdapter.getAdapterState(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to get adapter state"); + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/uwb/IUwbAdapter.aidl b/core/java/android/uwb/IUwbAdapter.aidl index 5804d04bdba7..e02e5eb25990 100644 --- a/core/java/android/uwb/IUwbAdapter.aidl +++ b/core/java/android/uwb/IUwbAdapter.aidl @@ -158,6 +158,18 @@ interface IUwbAdapter { */ void setEnabled(boolean enabled); + /** + * Returns the current enabled/disabled UWB state. + * + * Possible values are: + * IUwbAdapterState#STATE_DISABLED + * IUwbAdapterState#STATE_ENABLED_ACTIVE + * IUwbAdapterState#STATE_ENABLED_INACTIVE + * + * @return value representing enabled/disabled UWB state. + */ + int getAdapterState(); + /** * The maximum allowed time to open a ranging session. */ diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java index 9116c49d0764..4edecdaad0dd 100644 --- a/core/java/android/uwb/UwbManager.java +++ b/core/java/android/uwb/UwbManager.java @@ -175,7 +175,7 @@ public final class UwbManager { * <p>The provided callback will be invoked by the given {@link Executor}. * * <p>When first registering a callback, the callbacks's - * {@link AdapterStateCallback#onStateChanged(boolean, int)} is immediately invoked to indicate + * {@link AdapterStateCallback#onStateChanged(int, int)} is immediately invoked to indicate * the current state of the underlying UWB adapter with the most recent * {@link AdapterStateCallback.StateChangedReason} that caused the change. * @@ -272,6 +272,21 @@ public final class UwbManager { } /** + * Returns the current enabled/disabled state for UWB. + * + * Possible values are: + * AdapterStateCallback#STATE_DISABLED + * AdapterStateCallback#STATE_ENABLED_INACTIVE + * AdapterStateCallback#STATE_ENABLED_ACTIVE + * + * @return value representing current enabled/disabled state for UWB. + * @hide + */ + public @AdapterStateCallback.State int getAdapterState() { + return mAdapterStateListener.getAdapterState(); + } + + /** * Disables or enables UWB for a user * * @param enabled value representing intent to disable or enable UWB. If true any subsequent diff --git a/core/java/com/android/internal/graphics/OWNERS b/core/java/com/android/internal/graphics/OWNERS new file mode 100644 index 000000000000..5851cbbdf33c --- /dev/null +++ b/core/java/com/android/internal/graphics/OWNERS @@ -0,0 +1 @@ +include /graphics/java/android/graphics/OWNERS
\ No newline at end of file diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h index d86d9340e667..bf2ba772c39d 100644 --- a/core/jni/include/android_runtime/AndroidRuntime.h +++ b/core/jni/include/android_runtime/AndroidRuntime.h @@ -19,7 +19,6 @@ #ifndef _RUNTIME_ANDROID_RUNTIME_H #define _RUNTIME_ANDROID_RUNTIME_H -#include <binder/IBinder.h> #include <jni.h> #include <pthread.h> #include <utils/Errors.h> diff --git a/core/proto/android/providers/OWNERS b/core/proto/android/providers/OWNERS new file mode 100644 index 000000000000..1f5cd9a5c3b8 --- /dev/null +++ b/core/proto/android/providers/OWNERS @@ -0,0 +1 @@ +include /packages/SettingsProvider/OWNERS diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index cc4e2bb59787..357f427b428c 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3792,6 +3792,13 @@ <permission android:name="com.android.permission.USE_INSTALLER_V2" android:protectionLevel="signature|verifier" /> + <!-- @TestApi Allows a testOnly application to get installed. + <p>Not for use by third-party applications. + @hide + --> + <permission android:name="android.permission.INSTALL_TEST_ONLY_PACKAGE" + android:protectionLevel="signature" /> + <!-- @SystemApi @TestApi Allows an application to clear user data. <p>Not for use by third-party applications @hide diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml index d5733e34a8ef..2650d9f69dd7 100644 --- a/core/res/res/xml/sms_short_codes.xml +++ b/core/res/res/xml/sms_short_codes.xml @@ -40,7 +40,7 @@ <shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" /> <!-- Argentina: 5 digits, known short codes listed --> - <shortcode country="ar" pattern="\\d{5}" free="11711|28291" /> + <shortcode country="ar" pattern="\\d{5}" free="11711|28291|44077" /> <!-- Armenia: 3-4 digits, emergency numbers 10[123] --> <shortcode country="am" pattern="\\d{3,4}" premium="11[2456]1|3024" free="10[123]" /> @@ -76,14 +76,14 @@ <shortcode country="ch" pattern="[2-9]\\d{2,4}" premium="543|83111|30118" free="98765|30075|30047" /> <!-- Chile: 4-5 digits (not confirmed), known premium codes listed --> - <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240" /> + <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240|1038" /> <!-- China: premium shortcodes start with "1066", free shortcodes start with "1065": http://clients.txtnation.com/entries/197192-china-premium-sms-short-code-requirements --> <shortcode country="cn" premium="1066.*" free="1065.*" /> <!-- Colombia: 1-6 digits (not confirmed) --> - <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960" /> + <shortcode country="co" pattern="\\d{1,6}" free="890350|908160|892255|898002|898880|899960|899948|87739" /> <!-- Cyprus: 4-6 digits (not confirmed), known premium codes listed, plus EU --> <shortcode country="cy" pattern="\\d{4,6}" premium="7510" free="116\\d{3}" /> @@ -156,7 +156,7 @@ <shortcode country="jp" pattern="\\d{1,5}" free="8083" /> <!-- Kenya: 5 digits, known premium codes listed --> - <shortcode country="ke" pattern="\\d{5}" free="21725" /> + <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520" /> <!-- Kyrgyzstan: 4 digits, known premium codes listed --> <shortcode country="kg" pattern="\\d{4}" premium="415[2367]|444[69]" /> @@ -187,13 +187,13 @@ <shortcode country="mx" pattern="\\d{4,5}" premium="53035|7766" free="26259|46645|50025|50052|5050|76551|88778|9963" /> <!-- Malaysia: 5 digits: http://www.skmm.gov.my/attachment/Consumer_Regulation/Mobile_Content_Services_FAQs.pdf --> - <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288" /> + <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288|66668" /> <!-- The Netherlands, 4 digits, known premium codes listed, plus EU --> <shortcode country="nl" pattern="\\d{4}" premium="4466|5040" free="116\\d{3}|2223|6225|2223|1662" /> <!-- Nigeria --> - <shortcode country="ng" pattern="\\d{1,5}" free="2441" /> + <shortcode country="ng" pattern="\\d{1,5}" free="2441|55019" /> <!-- Norway: 4-5 digits (not confirmed), known premium codes listed --> <shortcode country="no" pattern="\\d{4,5}" premium="2201|222[67]" free="2171" /> @@ -202,7 +202,7 @@ <shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="1737|176|2141|3067|3068|3110|4006|4053|4061|4062|4202|4300|4334|4412|4575|5626|8006|8681" /> <!-- Peru: 4-5 digits (not confirmed), known premium codes listed --> - <shortcode country="pe" pattern="\\d{4,5}" free="9963" /> + <shortcode country="pe" pattern="\\d{4,5}" free="9963|40777" /> <!-- Philippines --> <shortcode country="ph" pattern="\\d{1,5}" free="2147|5495|5496" /> @@ -224,7 +224,7 @@ <shortcode country="re" pattern="\\d{1,5}" free="38600,36300,36303,959" /> <!-- Romania: 4 digits, plus EU: http://www.simplus.ro/en/resources/glossary-of-terms/ --> - <shortcode country="ro" pattern="\\d{4}" premium="12(?:63|66|88)|13(?:14|80)" free="116\\d{3}|3654|8360" /> + <shortcode country="ro" pattern="\\d{4}" premium="12(?:63|66|88)|13(?:14|80)" free="116\\d{3}|3654|8360|3838" /> <!-- Russia: 4 digits, known premium codes listed: http://smscoin.net/info/pricing-russia/ --> <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954|8501" standard="2037|2044"/> @@ -252,7 +252,7 @@ <shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" /> <!-- Turkey --> - <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493" /> + <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493|3193" /> <!-- Ukraine: 4 digits, known premium codes listed --> <shortcode country="ua" pattern="\\d{4}" premium="444[3-9]|70[579]4|7540" /> @@ -268,6 +268,6 @@ <shortcode country="yt" pattern="\\d{1,5}" free="38600,36300,36303,959" /> <!-- South Africa --> - <shortcode country="za" pattern="\d{1,5}" free="44136" /> + <shortcode country="za" pattern="\d{1,5}" free="44136|30791|36056" /> </shortcodes> diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java index 3ebe1039d975..02998325708b 100644 --- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java @@ -91,7 +91,7 @@ public class NetworkStatsBenchmark { public void timeMigrateTun(int reps) { for (int i = 0; i < reps; i++) { NetworkStats stats = mNetworkStats.clone(); - stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces()); + stats.migrateTun(TUN_UID, TUN_IFACE, Arrays.asList(getVpnUnderlyingIfaces())); } } diff --git a/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java b/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java index 43f9b6feea45..48f4288d401e 100644 --- a/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java +++ b/core/tests/nfctests/src/android/nfc/NfcControllerAlwaysOnListenerTest.java @@ -19,6 +19,7 @@ package android.nfc; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -62,7 +63,36 @@ public class NfcControllerAlwaysOnListenerTest { } @Test + public void testRegister_RegisterUnregisterWhenNotSupported() throws RemoteException { + // isControllerAlwaysOnSupported() returns false, not supported. + doReturn(false).when(mNfcAdapter).isControllerAlwaysOnSupported(); + NfcControllerAlwaysOnListener mListener = + new NfcControllerAlwaysOnListener(mNfcAdapter); + ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class); + ControllerAlwaysOnListener mockListener2 = mock(ControllerAlwaysOnListener.class); + + // Verify that the state listener will not registered with the NFC Adapter + mListener.register(getExecutor(), mockListener1); + verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any()); + + // Register a second client and no any call to NFC Adapter + mListener.register(getExecutor(), mockListener2); + verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any()); + + // Unregister first listener, and no any call to NFC Adapter + mListener.unregister(mockListener1); + verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any()); + verify(mNfcAdapter, times(0)).unregisterControllerAlwaysOnListener(any()); + + // Unregister second listener, and no any call to NFC Adapter + mListener.unregister(mockListener2); + verify(mNfcAdapter, times(0)).registerControllerAlwaysOnListener(any()); + verify(mNfcAdapter, times(0)).unregisterControllerAlwaysOnListener(any()); + } + + @Test public void testRegister_RegisterUnregister() throws RemoteException { + doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported(); NfcControllerAlwaysOnListener mListener = new NfcControllerAlwaysOnListener(mNfcAdapter); ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class); @@ -89,6 +119,7 @@ public class NfcControllerAlwaysOnListenerTest { @Test public void testRegister_FirstRegisterFails() throws RemoteException { + doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported(); NfcControllerAlwaysOnListener mListener = new NfcControllerAlwaysOnListener(mNfcAdapter); ControllerAlwaysOnListener mockListener1 = mock(ControllerAlwaysOnListener.class); @@ -116,6 +147,7 @@ public class NfcControllerAlwaysOnListenerTest { @Test public void testRegister_RegisterSameListenerTwice() throws RemoteException { + doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported(); NfcControllerAlwaysOnListener mListener = new NfcControllerAlwaysOnListener(mNfcAdapter); ControllerAlwaysOnListener mockListener = mock(ControllerAlwaysOnListener.class); @@ -132,7 +164,7 @@ public class NfcControllerAlwaysOnListenerTest { @Test public void testNotify_AllListenersNotified() throws RemoteException { - + doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported(); NfcControllerAlwaysOnListener listener = new NfcControllerAlwaysOnListener(mNfcAdapter); List<ControllerAlwaysOnListener> mockListeners = new ArrayList<>(); for (int i = 0; i < 10; i++) { @@ -149,7 +181,8 @@ public class NfcControllerAlwaysOnListenerTest { } @Test - public void testStateChange_CorrectValue() { + public void testStateChange_CorrectValue() throws RemoteException { + doReturn(true).when(mNfcAdapter).isControllerAlwaysOnSupported(); runStateChangeValue(true, true); runStateChangeValue(false, false); diff --git a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java b/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java index bdaf63021503..4cad535a3a51 100644 --- a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java +++ b/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java @@ -19,7 +19,6 @@ package android.uwb; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -114,30 +113,6 @@ public class AdapterStateListenerTest { } @Test - public void testRegister_FirstRegisterFails() throws RemoteException { - AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter); - AdapterStateCallback callback1 = mock(AdapterStateCallback.class); - AdapterStateCallback callback2 = mock(AdapterStateCallback.class); - - // Throw a remote exception whenever first registering - doThrow(mThrowRemoteException).when(mUwbAdapter).registerAdapterStateCallbacks(any()); - - adapterStateListener.register(getExecutor(), callback1); - verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any()); - - // No longer throw an exception, instead succeed - doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any()); - - // Register a different callback - adapterStateListener.register(getExecutor(), callback2); - verify(mUwbAdapter, times(2)).registerAdapterStateCallbacks(any()); - - // Ensure first callback was invoked again - verifyCallbackStateChangedInvoked(callback1, 2); - verifyCallbackStateChangedInvoked(callback2, 1); - } - - @Test public void testRegister_RegisterSameCallbackTwice() throws RemoteException { AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter); AdapterStateCallback callback = mock(AdapterStateCallback.class); @@ -162,13 +137,6 @@ public class AdapterStateListenerTest { runViaExecutor(); } - @Test - public void testCallback_RunViaExecutor_Failure() throws RemoteException { - // Verify that the callbacks are invoked on the executor when there is a remote exception - doThrow(mThrowRemoteException).when(mUwbAdapter).registerAdapterStateCallbacks(any()); - runViaExecutor(); - } - private void runViaExecutor() { AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter); AdapterStateCallback callback = mock(AdapterStateCallback.class); diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java index bd72d45297c1..00219e7f28ac 100644 --- a/keystore/java/android/security/Authorization.java +++ b/keystore/java/android/security/Authorization.java @@ -74,16 +74,19 @@ public class Authorization { * @param locked - whether it is a lock (true) or unlock (false) event * @param syntheticPassword - if it is an unlock event with the password, pass the synthetic * password provided by the LockSettingService + * @param unlockingSids - KeyMint secure user IDs that should be permitted to unlock + * UNLOCKED_DEVICE_REQUIRED keys. * * @return 0 if successful or a {@code ResponseCode}. */ public static int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId, - @Nullable byte[] syntheticPassword) { + @Nullable byte[] syntheticPassword, @Nullable long[] unlockingSids) { try { if (locked) { - getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null); + getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null, unlockingSids); } else { - getService().onLockScreenEvent(LockScreenEvent.UNLOCK, userId, syntheticPassword); + getService().onLockScreenEvent( + LockScreenEvent.UNLOCK, userId, syntheticPassword, unlockingSids); } return 0; } catch (RemoteException | NullPointerException e) { diff --git a/native/android/Android.bp b/native/android/Android.bp index 2a2b08d77e21..dda230d10137 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -115,7 +115,11 @@ cc_library_shared { cc_library_shared { name: "libandroid_net", defaults: ["libandroid_defaults"], - llndk_stubs: "libandroid_net.llndk", + llndk: { + symbol_file: "libandroid_net.map.txt", + unversioned: true, + override_export_include_dirs: ["include"], + }, srcs: ["net.c"], shared_libs: ["libnetd_client"], @@ -123,13 +127,6 @@ cc_library_shared { include_dirs: ["bionic/libc/dns/include"], } -llndk_library { - name: "libandroid_net.llndk", - export_include_dirs: ["include"], - symbol_file: "libandroid_net.map.txt", - unversioned: true, -} - // Aidl library for platform compat. cc_library_shared { name: "lib-platform-compat-native-api", diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt index 8b10fcc62b6d..a8e2517a5e90 100644 --- a/packages/Connectivity/framework/api/module-lib-current.txt +++ b/packages/Connectivity/framework/api/module-lib-current.txt @@ -7,7 +7,7 @@ package android.net { public class ConnectivityManager { method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void factoryReset(); - method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshot(); + method @NonNull @RequiresPermission(anyOf={android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) public java.util.List<android.net.NetworkStateSnapshot> getAllNetworkStateSnapshots(); method @Nullable public android.net.ProxyInfo getGlobalProxy(); method @NonNull public static android.util.Range<java.lang.Integer> getIpSecNetIdRange(); method @NonNull public static String getPrivateDnsMode(@NonNull android.content.Context); diff --git a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java index 4636abb8aeda..3e2fbeaee702 100644 --- a/packages/Connectivity/framework/src/android/net/ConnectivityManager.java +++ b/packages/Connectivity/framework/src/android/net/ConnectivityManager.java @@ -1435,9 +1435,9 @@ public class ConnectivityManager { android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS}) @NonNull - public List<NetworkStateSnapshot> getAllNetworkStateSnapshot() { + public List<NetworkStateSnapshot> getAllNetworkStateSnapshots() { try { - return mService.getAllNetworkStateSnapshot(); + return mService.getAllNetworkStateSnapshots(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl b/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl index 0826922e2165..a7cb618f9790 100644 --- a/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl +++ b/packages/Connectivity/framework/src/android/net/IConnectivityManager.aidl @@ -81,7 +81,7 @@ interface IConnectivityManager @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) NetworkState[] getAllNetworkState(); - List<NetworkStateSnapshot> getAllNetworkStateSnapshot(); + List<NetworkStateSnapshot> getAllNetworkStateSnapshots(); boolean isActiveNetworkMetered(); diff --git a/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm index 2a95cfe6f8b1..44d5a0c376f7 100644 --- a/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm +++ b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm @@ -85,14 +85,14 @@ key 8 { key 9 { label: '9' base: '\u0669' - shift: '(' + shift: ')' capslock: '9' } key 0 { label: '0' base: '\u0660' - shift: ')' + shift: '(' capslock: '0' } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index a6e2af9b1674..9cd7083a2a11 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -24,6 +24,7 @@ import android.app.backup.FullBackupDataOutput; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.pm.PackageManager; import android.database.Cursor; import android.net.NetworkPolicy; import android.net.NetworkPolicyManager; @@ -212,7 +213,6 @@ public class SettingsBackupAgent extends BackupAgentHelper { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { - byte[] systemSettingsData = getSystemSettings(); byte[] secureSettingsData = getSecureSettings(); byte[] globalSettingsData = getGlobalSettings(); @@ -1204,17 +1204,25 @@ public class SettingsBackupAgent extends BackupAgentHelper { } private byte[] getSimSpecificSettingsData() { - SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); - byte[] simSpecificData = subManager.getAllSimSpecificSettingsForBackup(); - Log.i(TAG, "sim specific data of length + " + simSpecificData.length + byte[] simSpecificData = new byte[0]; + PackageManager packageManager = getBaseContext().getPackageManager(); + if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { + SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); + simSpecificData = subManager.getAllSimSpecificSettingsForBackup(); + Log.i(TAG, "sim specific data of length + " + simSpecificData.length + " successfully retrieved"); + } return simSpecificData; } private void restoreSimSpecificSettings(byte[] data) { - SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); - subManager.restoreAllSimSpecificSettingsFromBackup(data); + PackageManager packageManager = getBaseContext().getPackageManager(); + boolean hasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); + if (hasTelephony) { + SubscriptionManager subManager = SubscriptionManager.from(getBaseContext()); + subManager.restoreAllSimSpecificSettingsFromBackup(data); + } } private void updateWindowManagerIfNeeded(Integer previousDensity) { diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 4a64d6b2ff95..27df92f0832b 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -155,6 +155,7 @@ <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <!-- TODO(b/152310230): remove once APIs are confirmed to be sufficient --> <uses-permission android:name="com.android.permission.USE_INSTALLER_V2" /> + <uses-permission android:name="android.permission.INSTALL_TEST_ONLY_PACKAGE" /> <uses-permission android:name="android.permission.MOVE_PACKAGE" /> <uses-permission android:name="android.permission.KEEP_UNINSTALLED_PACKAGES" /> <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" /> diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS index 8765c9a64b77..947466f3baaf 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS +++ b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS @@ -1,7 +1,3 @@ set noparent -kchyn@google.com -jaggies@google.com -curtislb@google.com -ilyamaty@google.com -joshmccloskey@google.com +include /services/core/java/com/android/server/biometrics/OWNERS diff --git a/services/Android.bp b/services/Android.bp index 0a01c955a612..57a7bc52c057 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -146,68 +146,12 @@ stubs_defaults { " --hide-package com.google.android.startop.iorap" + " --hide DeprecationMismatch" + " --hide HiddenTypedefConstant", - visibility: ["//visibility:private"], + visibility: ["//frameworks/base:__subpackages__"], filter_packages: ["com.android."], } droidstubs { - name: "services-stubs.sources", - srcs: [":services-all-sources"], - defaults: ["services-stubs-default"], - check_api: { - current: { - api_file: "api/current.txt", - removed_api_file: "api/removed.txt", - }, - last_released: { - api_file: ":android.api.system-server.latest", - removed_api_file: ":removed.api.system-server.latest", - baseline_file: ":android-incompatibilities.api.system-server.latest", - }, - api_lint: { - enabled: true, - new_since: ":android.api.system-server.latest", - baseline_file: "api/lint-baseline.txt", - }, - }, - dists: [ - { - targets: [ - "sdk", - "win_sdk", - ], - dir: "apistubs/android/system-server/api", - dest: "android.txt", - tag: ".api.txt", - }, - { - targets: [ - "sdk", - "win_sdk", - ], - dir: "apistubs/android/system-server/api", - dest: "removed.txt", - tag: ".removed-api.txt", - }, - ], -} - -java_library { - name: "android_system_server_stubs_current", - defaults: ["android_stubs_dists_default"], - srcs: [":services-stubs.sources"], - installable: false, - static_libs: ["android_module_lib_stubs_current"], - sdk_version: "none", - system_modules: "none", - java_version: "1.8", - dist: { - dir: "apistubs/android/system-server", - }, -} - -droidstubs { - name: "services-non-updatable-stubs.sources", + name: "services-non-updatable-stubs", srcs: [":services-non-updatable-sources"], defaults: ["services-stubs-default"], check_api: { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 9494c4c1861b..a81860d43cc9 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2176,14 +2176,14 @@ public class ConnectivityService extends IConnectivityManager.Stub PermissionUtils.enforceNetworkStackPermission(mContext); final ArrayList<NetworkState> result = new ArrayList<>(); - for (NetworkStateSnapshot snapshot : getAllNetworkStateSnapshot()) { + for (NetworkStateSnapshot snapshot : getAllNetworkStateSnapshots()) { // NetworkStateSnapshot doesn't contain NetworkInfo, so need to fetch it from the // NetworkAgentInfo. - final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(snapshot.network); + final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(snapshot.getNetwork()); if (nai != null && nai.networkInfo.isConnected()) { result.add(new NetworkState(new NetworkInfo(nai.networkInfo), - snapshot.linkProperties, snapshot.networkCapabilities, snapshot.network, - snapshot.subscriberId)); + snapshot.getLinkProperties(), snapshot.getNetworkCapabilities(), + snapshot.getNetwork(), snapshot.getSubscriberId())); } } return result.toArray(new NetworkState[result.size()]); @@ -2191,7 +2191,7 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override @NonNull - public List<NetworkStateSnapshot> getAllNetworkStateSnapshot() { + public List<NetworkStateSnapshot> getAllNetworkStateSnapshots() { // This contains IMSI details, so make sure the caller is privileged. PermissionUtils.enforceNetworkStackPermission(mContext); @@ -9593,7 +9593,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // request. final ArrayList<NetworkRequest> nrs = new ArrayList<>(); nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities)); - nrs.add(createDefaultRequest()); + nrs.add(createDefaultInternetRequestForTransport( + TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT)); setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids())); final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs); result.add(nri); @@ -9898,7 +9899,8 @@ public class ConnectivityService extends IConnectivityManager.Stub case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID: requests.add(createUnmeteredNetworkRequest()); requests.add(createOemPaidNetworkRequest()); - requests.add(createDefaultRequest()); + requests.add(createDefaultInternetRequestForTransport( + TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT)); break; case OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK: requests.add(createUnmeteredNetworkRequest()); diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java index d756c1ffd00f..26ecee8f21ab 100644 --- a/services/core/java/com/android/server/VpnManagerService.java +++ b/services/core/java/com/android/server/VpnManagerService.java @@ -605,7 +605,7 @@ public class VpnManagerService extends IVpnManager.Stub { return null; } else { final UnderlyingNetworkInfo info = vpn.getUnderlyingNetworkInfo(); - return (info == null || info.ownerUid != uid) ? null : vpn; + return (info == null || info.getOwnerUid() != uid) ? null : vpn; } } diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 131267924179..8fd8b5c2cded 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -289,7 +289,7 @@ public class AuthService extends SystemService { } @Override - public long[] getAuthenticatorIds() throws RemoteException { + public long[] getAuthenticatorIds(int userId) throws RemoteException { // In this method, we're not checking whether the caller is permitted to use face // API because current authenticator ID is leaked (in a more contrived way) via Android // Keystore (android.security.keystore package): the user of that API can create a key @@ -307,9 +307,13 @@ public class AuthService extends SystemService { // method from inside app processes. final int callingUserId = UserHandle.getCallingUserId(); + if (userId != callingUserId) { + getContext().enforceCallingOrSelfPermission(USE_BIOMETRIC_INTERNAL, + "Must have " + USE_BIOMETRIC_INTERNAL + " permission."); + } final long identity = Binder.clearCallingIdentity(); try { - return mBiometricService.getAuthenticatorIds(callingUserId); + return mBiometricService.getAuthenticatorIds(userId); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java index 4ecc7594a79c..091e6c4adf4d 100644 --- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java +++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java @@ -27,6 +27,7 @@ import static android.net.NetworkPolicy.LIMIT_DISABLED; import static android.net.NetworkPolicy.WARNING_DISABLED; import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; import static android.net.NetworkTemplate.OEM_MANAGED_ALL; +import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; @@ -227,7 +228,8 @@ public class MultipathPolicyTracker { mNetworkTemplate = new NetworkTemplate( NetworkTemplate.MATCH_MOBILE, subscriberId, new String[] { subscriberId }, null, NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL, - NetworkStats.DEFAULT_NETWORK_NO, NETWORK_TYPE_ALL, OEM_MANAGED_ALL); + NetworkStats.DEFAULT_NETWORK_NO, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); mUsageCallback = new UsageCallback() { @Override public void onThresholdReached(int networkType, String subscriberId) { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 117c85bfdf77..ea1c68d1116e 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -1266,7 +1266,7 @@ public class LockSettingsService extends ILockSettings.Stub { private void unlockKeystore(byte[] password, int userHandle) { if (DEBUG) Slog.v(TAG, "Unlock keystore for user: " + userHandle); - Authorization.onLockScreenEvent(false, userHandle, password); + Authorization.onLockScreenEvent(false, userHandle, password, null); } @VisibleForTesting /** Note: this method is overridden in unit tests */ diff --git a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java index 90694d0a5f64..3f2b8fffcc54 100644 --- a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java +++ b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java @@ -31,6 +31,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.content.Context; +import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.os.Handler; import android.os.SystemClock; @@ -224,6 +225,12 @@ class RebootEscrowManager { } public boolean serverBasedResumeOnReboot() { + // Always use the server based RoR if the HAL isn't installed on device. + if (!mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_REBOOT_ESCROW)) { + return true; + } + return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_OTA, "server_based_ror_enabled", false); } @@ -374,6 +381,7 @@ class RebootEscrowManager { try { escrowKey = getAndClearRebootEscrowKey(kk); } catch (IOException e) { + Slog.i(TAG, "Failed to load escrow key, scheduling retry.", e); scheduleLoadRebootEscrowDataOrFail(retryHandler, attemptNumber + 1, users, rebootEscrowUsers); return; diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 1f44d250c216..d0da91207a47 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1921,7 +1921,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * Collect all ifaces from a {@link NetworkStateSnapshot} into the given set. */ private static void collectIfaces(ArraySet<String> ifaces, NetworkStateSnapshot snapshot) { - ifaces.addAll(snapshot.linkProperties.getAllInterfaceNames()); + ifaces.addAll(snapshot.getLinkProperties().getAllInterfaceNames()); } /** @@ -1995,14 +1995,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (LOGV) Slog.v(TAG, "updateNetworkRulesNL()"); Trace.traceBegin(TRACE_TAG_NETWORK, "updateNetworkRulesNL"); - final List<NetworkStateSnapshot> snapshots = mConnManager.getAllNetworkStateSnapshot(); + final List<NetworkStateSnapshot> snapshots = mConnManager.getAllNetworkStateSnapshots(); // First, generate identities of all connected networks so we can // quickly compare them against all defined policies below. mNetIdToSubId.clear(); final ArrayMap<NetworkStateSnapshot, NetworkIdentity> identified = new ArrayMap<>(); for (final NetworkStateSnapshot snapshot : snapshots) { - mNetIdToSubId.put(snapshot.network.getNetId(), parseSubId(snapshot)); + mNetIdToSubId.put(snapshot.getNetwork().getNetId(), parseSubId(snapshot)); // Policies matched by NPMS only match by subscriber ID or by ssid. Thus subtype // in the object created here is never used and its value doesn't matter, so use @@ -2090,7 +2090,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // One final pass to catch any metered ifaces that don't have explicitly // defined policies; typically Wi-Fi networks. for (final NetworkStateSnapshot snapshot : snapshots) { - if (!snapshot.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)) { + if (!snapshot.getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)) { matchingIfaces.clear(); collectIfaces(matchingIfaces, snapshot); for (int j = matchingIfaces.size() - 1; j >= 0; j--) { @@ -2126,14 +2126,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mSubscriptionOpportunisticQuota.clear(); for (final NetworkStateSnapshot snapshot : snapshots) { if (!quotaEnabled) continue; - if (snapshot.network == null) continue; - final int subId = getSubIdLocked(snapshot.network); + if (snapshot.getNetwork() == null) continue; + final int subId = getSubIdLocked(snapshot.getNetwork()); final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId); if (plan == null) continue; final long quotaBytes; final long limitBytes = plan.getDataLimitBytes(); - if (!snapshot.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING)) { + if (!snapshot.getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_ROAMING)) { // Clamp to 0 when roaming quotaBytes = 0; } else if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) { @@ -2151,7 +2151,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { .truncatedTo(ChronoUnit.DAYS) .toInstant().toEpochMilli(); final long totalBytes = getTotalBytes( - NetworkTemplate.buildTemplateMobileAll(snapshot.subscriberId), + NetworkTemplate.buildTemplateMobileAll(snapshot.getSubscriberId()), start, startOfDay); final long remainingBytes = limitBytes - totalBytes; // Number of remaining days including current day @@ -5770,8 +5770,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private int parseSubId(@NonNull NetworkStateSnapshot snapshot) { int subId = INVALID_SUBSCRIPTION_ID; - if (snapshot.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) { - NetworkSpecifier spec = snapshot.networkCapabilities.getNetworkSpecifier(); + if (snapshot.getNetworkCapabilities().hasTransport(TRANSPORT_CELLULAR)) { + NetworkSpecifier spec = snapshot.getNetworkCapabilities().getNetworkSpecifier(); if (spec instanceof TelephonyNetworkSpecifier) { subId = ((TelephonyNetworkSpecifier) spec).getSubscriptionId(); } diff --git a/services/core/java/com/android/server/net/NetworkStatsFactory.java b/services/core/java/com/android/server/net/NetworkStatsFactory.java index d042b882fee1..e7c0a50163da 100644 --- a/services/core/java/com/android/server/net/NetworkStatsFactory.java +++ b/services/core/java/com/android/server/net/NetworkStatsFactory.java @@ -382,8 +382,8 @@ public class NetworkStatsFactory { // Migrate data usage over a VPN to the TUN network. for (UnderlyingNetworkInfo info : vpnArray) { - delta.migrateTun(info.ownerUid, info.iface, - info.underlyingIfaces.toArray(new String[0])); + delta.migrateTun(info.getOwnerUid(), info.getIface(), + info.getUnderlyingIfaces()); // Filter out debug entries as that may lead to over counting. delta.filterDebugEntries(); } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 19f5e3cd5dfa..3c14440c6467 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -24,7 +24,6 @@ import static android.content.Intent.ACTION_UID_REMOVED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.Intent.EXTRA_UID; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkIdentity.SUBTYPE_COMBINED; import static android.net.NetworkStack.checkNetworkStackPermission; import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; @@ -97,12 +96,12 @@ import android.net.INetworkStatsSession; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkIdentity; +import android.net.NetworkSpecifier; import android.net.NetworkStack; import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStatsHistory; -import android.net.NetworkSpecifier; import android.net.NetworkTemplate; import android.net.TelephonyNetworkSpecifier; import android.net.TrafficStats; @@ -1296,9 +1295,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final ArraySet<String> mobileIfaces = new ArraySet<>(); for (NetworkStateSnapshot snapshot : snapshots) { final int displayTransport = - getDisplayTransport(snapshot.networkCapabilities.getTransportTypes()); + getDisplayTransport(snapshot.getNetworkCapabilities().getTransportTypes()); final boolean isMobile = (NetworkCapabilities.TRANSPORT_CELLULAR == displayTransport); - final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.network); + final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.getNetwork()); final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED : getSubTypeForStateSnapshot(snapshot); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot, @@ -1306,7 +1305,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // Traffic occurring on the base interface is always counted for // both total usage and UID details. - final String baseIface = snapshot.linkProperties.getInterfaceName(); + final String baseIface = snapshot.getLinkProperties().getInterfaceName(); if (baseIface != null) { findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident); findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident); @@ -1316,7 +1315,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // If IMS is metered, then the IMS network usage has already included VT usage. // VT is considered always metered in framework's layer. If VT is not metered // per carrier's policy, modem will report 0 usage for VT calls. - if (snapshot.networkCapabilities.hasCapability( + if (snapshot.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.getMetered()) { // Copy the identify from IMS one but mark it as metered. @@ -1364,7 +1363,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // accounting is explicitly bypassed for traffic from the clat uid. // // TODO: This code might be combined to above code. - for (String iface : snapshot.linkProperties.getAllInterfaceNames()) { + for (String iface : snapshot.getLinkProperties().getAllInterfaceNames()) { // baseIface has been handled, so ignore it. if (TextUtils.equals(baseIface, iface)) continue; if (iface != null) { @@ -1383,11 +1382,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } private static int getSubIdForMobile(@NonNull NetworkStateSnapshot state) { - if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + if (!state.getNetworkCapabilities().hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { throw new IllegalArgumentException("Mobile state need capability TRANSPORT_CELLULAR"); } - final NetworkSpecifier spec = state.networkCapabilities.getNetworkSpecifier(); + final NetworkSpecifier spec = state.getNetworkCapabilities().getNetworkSpecifier(); if (spec instanceof TelephonyNetworkSpecifier) { return ((TelephonyNetworkSpecifier) spec).getSubscriptionId(); } else { @@ -1402,11 +1401,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { * transport types do not actually fill this value. */ private int getSubTypeForStateSnapshot(@NonNull NetworkStateSnapshot state) { - if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + if (!state.getNetworkCapabilities().hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { return 0; } - return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.subscriberId); + return mNetworkStatsSubscriptionsMonitor.getRatTypeForSubscriberId(state.getSubscriberId()); } private static <K> NetworkIdentitySet findOrCreateNetworkIdentitySet( diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java index 531136976c81..64ca85e3f09a 100644 --- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java +++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java @@ -286,6 +286,9 @@ public class TestHarnessModeService extends SystemService { private class TestHarnessModeShellCommand extends ShellCommand { @Override public int onCommand(String cmd) { + if (cmd == null) { + return handleDefaultCommands(cmd); + } switch (cmd) { case "enable": case "restore": diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index ff763fccd5ff..90b095bbbebe 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -39,6 +39,7 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.database.ContentObserver; import android.graphics.drawable.Drawable; +import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; import android.net.Uri; import android.os.Binder; @@ -185,8 +186,6 @@ public class TrustManagerService extends SystemService { private boolean mTrustAgentsCanRun = false; private int mCurrentUser = UserHandle.USER_SYSTEM; - private Authorization mAuthorizationService; - public TrustManagerService(Context context) { super(context); mContext = context; @@ -196,7 +195,6 @@ public class TrustManagerService extends SystemService { mStrongAuthTracker = new StrongAuthTracker(context); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mSettingsObserver = new SettingsObserver(mHandler); - mAuthorizationService = new Authorization(); } @Override @@ -698,13 +696,14 @@ public class TrustManagerService extends SystemService { } if (changed) { dispatchDeviceLocked(userId, locked); - - Authorization.onLockScreenEvent(locked, userId, null); + Authorization.onLockScreenEvent(locked, userId, null, + getBiometricSids(userId)); // Also update the user's profiles who have unified challenge, since they // share the same unlocked state (see {@link #isDeviceLocked(int)}) for (int profileHandle : mUserManager.getEnabledProfileIds(userId)) { if (mLockPatternUtils.isManagedProfileWithUnifiedChallenge(profileHandle)) { - mAuthorizationService.onLockScreenEvent(locked, profileHandle, null); + Authorization.onLockScreenEvent(locked, profileHandle, null, + getBiometricSids(profileHandle)); } } } @@ -1044,6 +1043,14 @@ public class TrustManagerService extends SystemService { } } + private long[] getBiometricSids(int userId) { + BiometricManager biometricManager = mContext.getSystemService(BiometricManager.class); + if (biometricManager == null) { + return null; + } + return biometricManager.getAuthenticatorIds(userId); + } + // User lifecycle @Override @@ -1255,7 +1262,8 @@ public class TrustManagerService extends SystemService { mDeviceLockedForUser.put(userId, locked); } - Authorization.onLockScreenEvent(locked, userId, null); + Authorization.onLockScreenEvent(locked, userId, null, + getBiometricSids(userId)); if (locked) { try { diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java index 6ca3c4b66024..65b947c1fcdd 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -52,7 +52,6 @@ import android.net.NetworkProvider; import android.net.NetworkScore; import android.net.RouteInfo; import android.net.TelephonyNetworkSpecifier; -import android.net.TunnelConnectionParams; import android.net.Uri; import android.net.annotations.PolicyDirection; import android.net.ipsec.ike.ChildSessionCallback; @@ -1559,8 +1558,22 @@ public class VcnGatewayConnection extends StateMachine { teardownAsynchronously(); } /* networkUnwantedCallback */, (status) -> { - if (status == NetworkAgent.VALIDATION_STATUS_VALID) { - clearFailedAttemptCounterAndSafeModeAlarm(); + switch (status) { + case NetworkAgent.VALIDATION_STATUS_VALID: + clearFailedAttemptCounterAndSafeModeAlarm(); + break; + case NetworkAgent.VALIDATION_STATUS_NOT_VALID: + // Will only set a new alarm if no safe mode alarm is + // currently scheduled. + setSafeModeAlarm(); + break; + default: + Slog.wtf( + TAG, + "Unknown validation status " + + status + + "; ignoring"); + break; } } /* validationStatusCallback */); @@ -1838,7 +1851,7 @@ public class VcnGatewayConnection extends StateMachine { private long getNextRetryIntervalsMs() { final int retryDelayIndex = mFailedAttempts - 1; - final long[] retryIntervalsMs = mConnectionConfig.getRetryIntervalsMs(); + final long[] retryIntervalsMs = mConnectionConfig.getRetryIntervalsMillis(); // Repeatedly use last item in retry timeout list. if (retryDelayIndex >= retryIntervalsMs.length) { @@ -1924,14 +1937,8 @@ public class VcnGatewayConnection extends StateMachine { @NonNull IpSecTunnelInterface tunnelIface, @NonNull VcnChildSessionConfiguration childConfig, @Nullable UnderlyingNetworkRecord underlying) { - final TunnelConnectionParams tunnelParams = + final IkeTunnelConnectionParams ikeTunnelParams = gatewayConnectionConfig.getTunnelConnectionParams(); - if (!(tunnelParams instanceof IkeTunnelConnectionParams)) { - throw new IllegalStateException( - "TunnelConnectionParams is not IkeTunnelConnectionParams"); - } - - final IkeTunnelConnectionParams ikeTunnelParams = (IkeTunnelConnectionParams) tunnelParams; final LinkProperties lp = new LinkProperties(); lp.setInterfaceName(tunnelIface.getInterfaceName()); @@ -2138,32 +2145,16 @@ public class VcnGatewayConnection extends StateMachine { } private IkeSessionParams buildIkeParams(@NonNull Network network) { - final TunnelConnectionParams tunnelConnectionParams = + final IkeTunnelConnectionParams ikeTunnelConnectionParams = mConnectionConfig.getTunnelConnectionParams(); - - if (tunnelConnectionParams instanceof IkeTunnelConnectionParams) { - final IkeTunnelConnectionParams ikeTunnelConnectionParams = - (IkeTunnelConnectionParams) tunnelConnectionParams; - final IkeSessionParams.Builder builder = - new IkeSessionParams.Builder(ikeTunnelConnectionParams.getIkeSessionParams()); - builder.setNetwork(network); - - return builder.build(); - } - - throw new IllegalStateException("TunnelConnectionParams is not IkeTunnelConnectionParams"); + final IkeSessionParams.Builder builder = + new IkeSessionParams.Builder(ikeTunnelConnectionParams.getIkeSessionParams()); + builder.setNetwork(network); + return builder.build(); } private ChildSessionParams buildChildParams() { - final TunnelConnectionParams tunnelConnectionParams = - mConnectionConfig.getTunnelConnectionParams(); - - if (tunnelConnectionParams instanceof IkeTunnelConnectionParams) { - return ((IkeTunnelConnectionParams) tunnelConnectionParams) - .getTunnelModeChildSessionParams(); - } - - throw new IllegalStateException("TunnelConnectionParams is not IkeTunnelConnectionParams"); + return mConnectionConfig.getTunnelConnectionParams().getTunnelModeChildSessionParams(); } @VisibleForTesting(visibility = Visibility.PRIVATE) diff --git a/services/core/jni/OWNERS b/services/core/jni/OWNERS index bbcc2c1e581b..e8050fa00aa6 100644 --- a/services/core/jni/OWNERS +++ b/services/core/jni/OWNERS @@ -29,3 +29,4 @@ per-file com_android_server_se_* = file:/core/java/android/se/OWNERS per-file com_android_server_security_* = file:/core/java/android/security/OWNERS per-file com_android_server_tv_* = file:/media/java/android/media/tv/OWNERS per-file com_android_server_vibrator_* = file:/services/core/java/com/android/server/vibrator/OWNERS +per-file com_android_server_am_CachedAppOptimizer.cpp = timmurray@google.com, edgararriaga@google.com, dualli@google.com, carmenjackson@google.com, philipcuadra@google.com
\ No newline at end of file diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java index 1208eccc69eb..9706d7f5f78d 100644 --- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java +++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java @@ -23,11 +23,13 @@ import android.app.job.JobService; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ResolveInfo; import android.os.Handler; import android.os.IBinder.DeathRecipient; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; import android.os.UpdateEngine; import android.os.UpdateEngineCallback; import android.os.UserHandle; @@ -42,6 +44,9 @@ import com.android.server.wm.ActivityMetricsLaunchObserver; import com.android.server.wm.ActivityMetricsLaunchObserverRegistry; import com.android.server.wm.ActivityTaskManagerInternal; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; @@ -75,7 +80,7 @@ public final class ProfcollectForwardingService extends SystemService { */ public static boolean enabled() { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, "enabled", - false); + false) || SystemProperties.getBoolean("persist.profcollectd.enabled_override", false); } @Override @@ -297,24 +302,20 @@ public final class ProfcollectForwardingService extends SystemService { return; } - final boolean uploadReport = - DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, - "upload_report", false); - new Thread(() -> { try { String reportUuid = mIProfcollect.report(); - if (!uploadReport) { + final int profileId = getBBProfileId(); + String reportDir = "/data/user/" + profileId + + "/com.google.android.apps.internal.betterbug/cache/"; + String reportPath = reportDir + reportUuid + ".zip"; + + if (!Files.exists(Paths.get(reportDir))) { + Log.i(LOG_TAG, "Destination directory does not exist, abort upload."); return; } - final int profileId = getBBProfileId(); - mIProfcollect.copy_report_to_bb(profileId, reportUuid); - String reportPath = - "/data/user/" + profileId - + "/com.google.android.apps.internal.betterbug/cache/" - + reportUuid + ".zip"; Intent uploadIntent = new Intent("com.google.android.apps.betterbug.intent.action.UPLOAD_PROFILE") .setPackage("com.google.android.apps.internal.betterbug") @@ -323,9 +324,15 @@ public final class ProfcollectForwardingService extends SystemService { .putExtra("EXTRA_PROFILE_PATH", reportPath) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); Context context = getContext(); - if (context.getPackageManager().queryBroadcastReceivers(uploadIntent, 0) != null) { - context.sendBroadcast(uploadIntent); + + List<ResolveInfo> receivers = + context.getPackageManager().queryBroadcastReceivers(uploadIntent, 0); + if (receivers == null || receivers.isEmpty()) { + Log.i(LOG_TAG, "No one to receive upload intent, abort upload."); + return; } + mIProfcollect.copy_report_to_bb(profileId, reportUuid); + context.sendBroadcast(uploadIntent); mIProfcollect.delete_report(reportUuid); } catch (RemoteException e) { Log.e(LOG_TAG, e.getMessage()); diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index e9e24866f35c..a02a039c3beb 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -1091,7 +1091,7 @@ public class NetworkPolicyManagerServiceTest { // first, pretend that wifi network comes online. no policy active, // which means we shouldn't push limit to interface. snapshots = List.of(buildWifi()); - when(mConnManager.getAllNetworkStateSnapshot()).thenReturn(snapshots); + when(mConnManager.getAllNetworkStateSnapshots()).thenReturn(snapshots); mPolicyListener.expect().onMeteredIfacesChanged(any()); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); @@ -1099,7 +1099,7 @@ public class NetworkPolicyManagerServiceTest { // now change cycle to be on 15th, and test in early march, to verify we // pick cycle day in previous month. - when(mConnManager.getAllNetworkStateSnapshot()).thenReturn(snapshots); + when(mConnManager.getAllNetworkStateSnapshots()).thenReturn(snapshots); // pretend that 512 bytes total have happened stats = new NetworkStats(getElapsedRealtime(), 1) @@ -1360,7 +1360,7 @@ public class NetworkPolicyManagerServiceTest { .insertEntry(TEST_IFACE, 0L, 0L, 0L, 0L); { - when(mConnManager.getAllNetworkStateSnapshot()).thenReturn(snapshots); + when(mConnManager.getAllNetworkStateSnapshots()).thenReturn(snapshots); when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())).thenReturn(stats.getTotalBytes()); @@ -1483,7 +1483,7 @@ public class NetworkPolicyManagerServiceTest { } private PersistableBundle setupUpdateMobilePolicyCycleTests() throws RemoteException { - when(mConnManager.getAllNetworkStateSnapshot()) + when(mConnManager.getAllNetworkStateSnapshots()) .thenReturn(new ArrayList<NetworkStateSnapshot>()); setupTelephonySubscriptionManagers(FAKE_SUB_ID, FAKE_SUBSCRIBER_ID); @@ -1496,7 +1496,7 @@ public class NetworkPolicyManagerServiceTest { @Test public void testUpdateMobilePolicyCycleWithNullConfig() throws RemoteException { - when(mConnManager.getAllNetworkStateSnapshot()) + when(mConnManager.getAllNetworkStateSnapshots()) .thenReturn(new ArrayList<NetworkStateSnapshot>()); setupTelephonySubscriptionManagers(FAKE_SUB_ID, FAKE_SUBSCRIBER_ID); @@ -2089,7 +2089,7 @@ public class NetworkPolicyManagerServiceTest { new Network(TEST_NET_ID), buildNetworkCapabilities(TEST_SUB_ID, roaming), buildLinkProperties(TEST_IFACE), TEST_IMSI, TYPE_MOBILE)); - when(mConnManager.getAllNetworkStateSnapshot()).thenReturn(snapshots); + when(mConnManager.getAllNetworkStateSnapshots()).thenReturn(snapshots); } private void expectDefaultCarrierConfig() throws Exception { diff --git a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java index 179248dd2cf9..33b0bbd23086 100644 --- a/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java +++ b/telephony/common/com/android/internal/telephony/SipMessageParsingUtils.java @@ -81,6 +81,15 @@ public class SipMessageParsingUtils { } /** + * @return true if the SIP message start line is considered a response. + */ + public static boolean isSipResponse(String startLine) { + String[] splitLine = splitStartLineAndVerify(startLine); + if (splitLine == null) return false; + return verifySipResponse(splitLine); + } + + /** * Return the via branch parameter, which is used to identify the transaction ID (request and * response pair) in a SIP transaction. * @param headerString The string containing the headers of the SIP message. @@ -140,7 +149,12 @@ public class SipMessageParsingUtils { return !headers.isEmpty() ? headers.get(0).second : null; } - private static String[] splitStartLineAndVerify(String startLine) { + /** + * Validate that the start line is correct and split into its three segments. + * @param startLine The start line to verify and split. + * @return The split start line, which will always have three segments. + */ + public static String[] splitStartLineAndVerify(String startLine) { String[] splitLine = startLine.split(" "); if (isStartLineMalformed(splitLine)) return null; return splitLine; @@ -184,7 +198,7 @@ public class SipMessageParsingUtils { * (This is internally an equalsIgnoreMatch comparison). * @return the matched header keys and values. */ - private static List<Pair<String, String>> parseHeaders(String headerString, + public static List<Pair<String, String>> parseHeaders(String headerString, boolean stopAtFirstMatch, String... matchingHeaderKeys) { // Ensure there is no leading whitespace headerString = removeLeadingWhitespace(headerString); diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java index 1c9cd94b245d..8a4bb4642887 100644 --- a/telephony/java/android/telephony/PhysicalChannelConfig.java +++ b/telephony/java/android/telephony/PhysicalChannelConfig.java @@ -182,16 +182,6 @@ public final class PhysicalChannelConfig implements Parcelable { } /** - * @return the absolute radio frequency channel number for this physical channel, - * {@link #CHANNEL_NUMBER_UNKNOWN} if unknown. - * @deprecated Use {@link #getDownlinkChannelNumber()} to get the channel number. - */ - @Deprecated - public int getChannelNumber() { - return getDownlinkChannelNumber(); - } - - /** * @return the rough frequency range for this physical channel, * {@link ServiceState#FREQUENCY_RANGE_UNKNOWN} if unknown. * @see {@link ServiceState#FREQUENCY_RANGE_LOW} diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1cfb1d43eacc..ae6a3e846950 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -11205,26 +11205,26 @@ public class TelephonyManager { } /** - * Return a list of certs in hex string from loaded carrier privileges access rules. + * Return a list of certs as hex strings from loaded carrier privileges access rules. * - * @return a list of certificate in hex string. return {@code null} if there is no certs - * or privilege rules are not loaded yet. - * - * <p>Requires Permission: - * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} + * @return a list of certificates as hex strings, or an empty list if there are no certs or + * privilege rules are not loaded yet. * @hide */ + @TestApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @NonNull public List<String> getCertsFromCarrierPrivilegeAccessRules() { + List<String> certs = null; try { ITelephony service = getITelephony(); if (service != null) { - return service.getCertsFromCarrierPrivilegeAccessRules(getSubId()); + certs = service.getCertsFromCarrierPrivilegeAccessRules(getSubId()); } } catch (RemoteException ex) { // This could happen if binder process crashes. } - return null; + return certs == null ? Collections.emptyList() : certs; } /** diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java index ee7302a753cc..9258e4445d88 100644 --- a/telephony/java/android/telephony/ims/SipDelegateManager.java +++ b/telephony/java/android/telephony/ims/SipDelegateManager.java @@ -33,6 +33,7 @@ import android.telephony.ims.aidl.SipDelegateConnectionAidlWrapper; import android.telephony.ims.stub.DelegateConnectionMessageCallback; import android.telephony.ims.stub.DelegateConnectionStateCallback; import android.telephony.ims.stub.SipDelegate; +import android.util.ArrayMap; import com.android.internal.annotations.VisibleForTesting; @@ -79,13 +80,18 @@ public class SipDelegateManager { public static final int MESSAGE_FAILURE_REASON_DELEGATE_CLOSED = 2; /** - * The SIP message has an invalid start line and the message can not be sent. + * The SIP message has an invalid start line and the message can not be sent or the start line + * failed validation due to the request containing a restricted SIP request method. + * {@link SipDelegateConnection}s can not send SIP requests for the methods: REGISTER, PUBLISH, + * or OPTIONS. */ public static final int MESSAGE_FAILURE_REASON_INVALID_START_LINE = 3; /** * One or more of the header fields in the header section of the outgoing SIP message is invalid - * and the SIP message can not be sent. + * or contains a restricted header value and the SIP message can not be sent. + * {@link SipDelegateConnection}s can not send SIP SUBSCRIBE requests for the "Event" header + * value of "presence". */ public static final int MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS = 4; @@ -162,6 +168,35 @@ public class SipDelegateManager { }) public @interface MessageFailureReason {} + /**@hide*/ + public static final ArrayMap<Integer, String> MESSAGE_FAILURE_REASON_STRING_MAP = + new ArrayMap<>(11); + static { + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_UNKNOWN, + "MESSAGE_FAILURE_REASON_UNKNOWN"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_DELEGATE_DEAD, + "MESSAGE_FAILURE_REASON_DELEGATE_DEAD"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_DELEGATE_CLOSED, + "MESSAGE_FAILURE_REASON_DELEGATE_CLOSED"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS, + "MESSAGE_FAILURE_REASON_INVALID_HEADER_FIELDS"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT, + "MESSAGE_FAILURE_REASON_INVALID_BODY_CONTENT"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG, + "MESSAGE_FAILURE_REASON_INVALID_FEATURE_TAG"); + MESSAGE_FAILURE_REASON_STRING_MAP.append( + MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE, + "MESSAGE_FAILURE_REASON_TAG_NOT_ENABLED_FOR_DELEGATE"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE, + "MESSAGE_FAILURE_REASON_NETWORK_NOT_AVAILABLE"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_NOT_REGISTERED, + "MESSAGE_FAILURE_REASON_NOT_REGISTERED"); + MESSAGE_FAILURE_REASON_STRING_MAP.append(MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION, + "MESSAGE_FAILURE_REASON_STALE_IMS_CONFIGURATION"); + MESSAGE_FAILURE_REASON_STRING_MAP.append( + MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION, + "MESSAGE_FAILURE_REASON_INTERNAL_DELEGATE_STATE_TRANSITION"); + } /** * Access to use this feature tag has been denied for an unknown reason. diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.mk b/tests/DynamicCodeLoggerIntegrationTests/Android.mk index bfb5b076237a..dab83046c28f 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/Android.mk +++ b/tests/DynamicCodeLoggerIntegrationTests/Android.mk @@ -89,4 +89,7 @@ LOCAL_JAVA_RESOURCE_FILES := \ $(dynamiccodeloggertest_jar) \ $(dynamiccodeloggertest_executable) \ +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE include $(BUILD_PACKAGE) diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java index 735fa7cf3751..23d5a7e5d5f8 100644 --- a/tests/net/java/android/net/NetworkStatsTest.java +++ b/tests/net/java/android/net/NetworkStatsTest.java @@ -50,6 +50,7 @@ import com.google.android.collect.Sets; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Arrays; import java.util.HashSet; @RunWith(AndroidJUnit4.class) @@ -616,7 +617,7 @@ public class NetworkStatsTest { .insertEntry(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L); - delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); + delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface)); assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. @@ -697,7 +698,7 @@ public class NetworkStatsTest { .insertEntry(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L); - delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); + delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface)); assertEquals(9, delta.size()); // tunIface entries should not be changed. diff --git a/tests/net/java/android/net/NetworkTemplateTest.kt b/tests/net/java/android/net/NetworkTemplateTest.kt index 64b774cc4340..ab6b2f409867 100644 --- a/tests/net/java/android/net/NetworkTemplateTest.kt +++ b/tests/net/java/android/net/NetworkTemplateTest.kt @@ -31,11 +31,16 @@ import android.net.NetworkTemplate.MATCH_MOBILE import android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD import android.net.NetworkTemplate.MATCH_WIFI import android.net.NetworkTemplate.MATCH_WIFI_WILDCARD +import android.net.NetworkTemplate.WIFI_NETWORKID_ALL import android.net.NetworkTemplate.NETWORK_TYPE_5G_NSA import android.net.NetworkTemplate.NETWORK_TYPE_ALL import android.net.NetworkTemplate.OEM_MANAGED_ALL import android.net.NetworkTemplate.OEM_MANAGED_NO import android.net.NetworkTemplate.OEM_MANAGED_YES +import android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT +import android.net.NetworkTemplate.buildTemplateWifi +import android.net.NetworkTemplate.buildTemplateWifiWildcard +import android.net.NetworkTemplate.buildTemplateCarrier import android.net.NetworkTemplate.buildTemplateMobileWithRatType import android.telephony.TelephonyManager import com.android.testutils.assertParcelSane @@ -53,6 +58,7 @@ import kotlin.test.assertTrue private const val TEST_IMSI1 = "imsi1" private const val TEST_IMSI2 = "imsi2" private const val TEST_SSID1 = "ssid1" +private const val TEST_SSID2 = "ssid2" @RunWith(JUnit4::class) class NetworkTemplateTest { @@ -60,8 +66,8 @@ class NetworkTemplateTest { private fun buildMobileNetworkState(subscriberId: String): NetworkStateSnapshot = buildNetworkState(TYPE_MOBILE, subscriberId = subscriberId) - private fun buildWifiNetworkState(ssid: String): NetworkStateSnapshot = - buildNetworkState(TYPE_WIFI, ssid = ssid) + private fun buildWifiNetworkState(subscriberId: String?, ssid: String?): NetworkStateSnapshot = + buildNetworkState(TYPE_WIFI, subscriberId = subscriberId, ssid = ssid) private fun buildNetworkState( type: Int, @@ -94,6 +100,95 @@ class NetworkTemplateTest { } @Test + fun testWifiWildcardMatches() { + val templateWifiWildcard = buildTemplateWifiWildcard() + + val identMobileImsi1 = buildNetworkIdentity(mockContext, + buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiImsiNullSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identWifiImsi1Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + + templateWifiWildcard.assertDoesNotMatch(identMobileImsi1) + templateWifiWildcard.assertMatches(identWifiImsiNullSsid1) + templateWifiWildcard.assertMatches(identWifiImsi1Ssid1) + } + + @Test + fun testWifiMatches() { + val templateWifiSsid1 = buildTemplateWifi(TEST_SSID1) + val templateWifiSsid1ImsiNull = buildTemplateWifi(TEST_SSID1, null) + val templateWifiSsid1Imsi1 = buildTemplateWifi(TEST_SSID1, TEST_IMSI1) + val templateWifiSsidAllImsi1 = buildTemplateWifi(WIFI_NETWORKID_ALL, TEST_IMSI1) + + val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiImsiNullSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identWifiImsi1Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + val identWifiImsi2Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0) + val identWifiImsi1Ssid2 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID2), true, 0) + + // Verify that template with SSID only matches any subscriberId and specific SSID. + templateWifiSsid1.assertDoesNotMatch(identMobile1) + templateWifiSsid1.assertMatches(identWifiImsiNullSsid1) + templateWifiSsid1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsid1.assertMatches(identWifiImsi2Ssid1) + templateWifiSsid1.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID1 and null imsi matches any network with + // SSID1 and null imsi. + templateWifiSsid1ImsiNull.assertDoesNotMatch(identMobile1) + templateWifiSsid1ImsiNull.assertMatches(identWifiImsiNullSsid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID1 and imsi1 matches any network with + // SSID1 and imsi1. + templateWifiSsid1Imsi1.assertDoesNotMatch(identMobile1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsiNullSsid1) + templateWifiSsid1Imsi1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID all and imsi1 matches any network with + // any SSID and imsi1. + templateWifiSsidAllImsi1.assertDoesNotMatch(identMobile1) + templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsiNullSsid1) + templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid2) + } + + @Test + fun testCarrierMatches() { + val templateCarrierImsi1 = buildTemplateCarrier(TEST_IMSI1) + + val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identMobile2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identCarrierWifiImsi1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + val identCarrierWifiImsi2 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0) + + templateCarrierImsi1.assertMatches(identCarrierWifiImsi1) + templateCarrierImsi1.assertDoesNotMatch(identCarrierWifiImsi2) + templateCarrierImsi1.assertDoesNotMatch(identWifiSsid1) + templateCarrierImsi1.assertMatches(identMobile1) + templateCarrierImsi1.assertDoesNotMatch(identMobile2) + } + + @Test fun testRatTypeGroupMatches() { val stateMobile = buildMobileNetworkState(TEST_IMSI1) // Build UMTS template that matches mobile identities with RAT in the same @@ -117,7 +212,7 @@ class NetworkTemplateTest { val identImsi2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2), false, TelephonyManager.NETWORK_TYPE_UMTS) val identWifi = buildNetworkIdentity( - mockContext, buildWifiNetworkState(TEST_SSID1), true, 0) + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) // Assert that identity with the same RAT matches. templateUmts.assertMatches(identUmts) @@ -151,14 +246,16 @@ class NetworkTemplateTest { fun testParcelUnparcel() { val templateMobile = NetworkTemplate(MATCH_MOBILE, TEST_IMSI1, null, null, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, TelephonyManager.NETWORK_TYPE_LTE, - OEM_MANAGED_ALL) + OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateWifi = NetworkTemplate(MATCH_WIFI, null, null, TEST_SSID1, METERED_ALL, - ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL) + ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateOem = NetworkTemplate(MATCH_MOBILE, null, null, null, METERED_ALL, - ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES) - assertParcelSane(templateMobile, 9) - assertParcelSane(templateWifi, 9) - assertParcelSane(templateOem, 9) + ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES, + SUBSCRIBER_ID_MATCH_RULE_EXACT) + assertParcelSane(templateMobile, 10) + assertParcelSane(templateWifi, 10) + assertParcelSane(templateOem, 10) } // Verify NETWORK_TYPE_* constants in NetworkTemplate do not conflict with @@ -207,15 +304,14 @@ class NetworkTemplateTest { identSsid: String? = null ) { val oemManagedStates = arrayOf(OEM_NONE, OEM_PAID, OEM_PRIVATE, OEM_PAID or OEM_PRIVATE) - // A null subscriberId needs a null matchSubscriberIds argument as well. - val matchSubscriberIds = if (subscriberId == null) null else arrayOf(subscriberId) + val matchSubscriberIds = arrayOf(subscriberId) val templateOemYes = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_MANAGED_YES) + OEM_MANAGED_YES, SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateOemAll = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_MANAGED_ALL) + OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) for (identityOemManagedState in oemManagedStates) { val ident = buildNetworkIdentity(mockContext, buildNetworkState(networkType, @@ -226,7 +322,7 @@ class NetworkTemplateTest { for (templateOemManagedState in oemManagedStates) { val template = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, - NETWORK_TYPE_ALL, templateOemManagedState) + NETWORK_TYPE_ALL, templateOemManagedState, SUBSCRIBER_ID_MATCH_RULE_EXACT) if (identityOemManagedState == templateOemManagedState) { template.assertMatches(ident) } else { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 20d9b946743d..bc06a6e43fff 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1804,7 +1804,7 @@ public class ConnectivityServiceTest { assertNull(mCm.getActiveNetworkForUid(Process.myUid())); // Test getAllNetworks() assertEmpty(mCm.getAllNetworks()); - assertEmpty(mCm.getAllNetworkStateSnapshot()); + assertEmpty(mCm.getAllNetworkStateSnapshots()); } /** @@ -5819,10 +5819,10 @@ public class ConnectivityServiceTest { if (vpnUid != null) { assertEquals("Should have exactly one VPN:", 1, infos.length); UnderlyingNetworkInfo info = infos[0]; - assertEquals("Unexpected VPN owner:", (int) vpnUid, info.ownerUid); - assertEquals("Unexpected VPN interface:", vpnIfname, info.iface); + assertEquals("Unexpected VPN owner:", (int) vpnUid, info.getOwnerUid()); + assertEquals("Unexpected VPN interface:", vpnIfname, info.getIface()); assertSameElementsNoDuplicates(underlyingIfaces, - info.underlyingIfaces.toArray(new String[0])); + info.getUnderlyingIfaces().toArray(new String[0])); } else { assertEquals(0, infos.length); return; @@ -5966,8 +5966,8 @@ public class ConnectivityServiceTest { // network for the VPN... verify(mStatsManager, never()).notifyNetworkStatus(any(List.class), any(List.class), any() /* anyString() doesn't match null */, - argThat(infos -> infos.get(0).underlyingIfaces.size() == 1 - && WIFI_IFNAME.equals(infos.get(0).underlyingIfaces.get(0)))); + argThat(infos -> infos.get(0).getUnderlyingIfaces().size() == 1 + && WIFI_IFNAME.equals(infos.get(0).getUnderlyingIfaces().get(0)))); verifyNoMoreInteractions(mStatsManager); reset(mStatsManager); @@ -5980,8 +5980,8 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mStatsManager).notifyNetworkStatus(any(List.class), any(List.class), any() /* anyString() doesn't match null */, - argThat(vpnInfos -> vpnInfos.get(0).underlyingIfaces.size() == 1 - && WIFI_IFNAME.equals(vpnInfos.get(0).underlyingIfaces.get(0)))); + argThat(vpnInfos -> vpnInfos.get(0).getUnderlyingIfaces().size() == 1 + && WIFI_IFNAME.equals(vpnInfos.get(0).getUnderlyingIfaces().get(0)))); mEthernetNetworkAgent.disconnect(); waitForIdle(); reset(mStatsManager); @@ -10323,7 +10323,7 @@ public class ConnectivityServiceTest { assertTrue(mRequests.get(0).hasCapability(NET_CAPABILITY_VALIDATED)); assertTrue(mRequests.get(1).isRequest()); assertTrue(mRequests.get(1).hasCapability(NET_CAPABILITY_OEM_PAID)); - assertTrue(mRequests.get(2).isRequest()); + assertEquals(NetworkRequest.Type.TRACK_DEFAULT, mRequests.get(2).type); assertTrue(mService.getDefaultRequest().networkCapabilities.equalsNetCapabilities( mRequests.get(2).networkCapabilities)); } @@ -11742,7 +11742,7 @@ public class ConnectivityServiceTest { } @Test - public void testGetAllNetworkStateSnapshot() throws Exception { + public void testGetAllNetworkStateSnapshots() throws Exception { verifyNoNetwork(); // Setup test cellular network with specified LinkProperties and NetworkCapabilities, @@ -11766,7 +11766,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp, cellNcTemplate); mCellNetworkAgent.connect(true); cellCb.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); - List<NetworkStateSnapshot> snapshots = mCm.getAllNetworkStateSnapshot(); + List<NetworkStateSnapshot> snapshots = mCm.getAllNetworkStateSnapshots(); assertLength(1, snapshots); // Compose the expected cellular snapshot for verification. @@ -11788,7 +11788,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.getNetwork(), wifiNc, new LinkProperties(), null, ConnectivityManager.TYPE_WIFI); - snapshots = mCm.getAllNetworkStateSnapshot(); + snapshots = mCm.getAllNetworkStateSnapshots(); assertLength(2, snapshots); assertContainsAll(snapshots, cellSnapshot, wifiSnapshot); @@ -11797,20 +11797,20 @@ public class ConnectivityServiceTest { // temporary shortage of connectivity of a connected network. mCellNetworkAgent.suspend(); waitForIdle(); - snapshots = mCm.getAllNetworkStateSnapshot(); + snapshots = mCm.getAllNetworkStateSnapshots(); assertLength(1, snapshots); assertEquals(wifiSnapshot, snapshots.get(0)); // Disconnect wifi, verify the snapshots contain nothing. mWiFiNetworkAgent.disconnect(); waitForIdle(); - snapshots = mCm.getAllNetworkStateSnapshot(); + snapshots = mCm.getAllNetworkStateSnapshots(); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertLength(0, snapshots); mCellNetworkAgent.resume(); waitForIdle(); - snapshots = mCm.getAllNetworkStateSnapshot(); + snapshots = mCm.getAllNetworkStateSnapshots(); assertLength(1, snapshots); assertEquals(cellSnapshot, snapshots.get(0)); diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index 0ab4d2be4df1..fd374bc9e68f 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -45,6 +45,7 @@ import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD; import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; import static android.net.NetworkTemplate.OEM_MANAGED_NO; import static android.net.NetworkTemplate.OEM_MANAGED_YES; +import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.NetworkTemplate.buildTemplateMobileWithRatType; import static android.net.NetworkTemplate.buildTemplateWifi; @@ -669,24 +670,28 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { public void testMobileStatsOemManaged() throws Exception { final NetworkTemplate templateOemPaid = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemPrivate = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemAll = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_PAID | OEM_PRIVATE); + OEM_PAID | OEM_PRIVATE, SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemYes = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemNone = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO, + SUBSCRIBER_ID_MATCH_RULE_EXACT); // OEM_PAID network comes online. NetworkStateSnapshot[] states = new NetworkStateSnapshot[]{ @@ -889,7 +894,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { final LinkProperties stackedProp = new LinkProperties(); stackedProp.setInterfaceName(stackedIface); final NetworkStateSnapshot wifiState = buildWifiState(); - wifiState.linkProperties.addStackedLink(stackedProp); + wifiState.getLinkProperties().addStackedLink(stackedProp); NetworkStateSnapshot[] states = new NetworkStateSnapshot[] {wifiState}; expectNetworkStatsSummary(buildEmptyStats()); @@ -1580,10 +1585,10 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { } private String getActiveIface(NetworkStateSnapshot... states) throws Exception { - if (states == null || states.length == 0 || states[0].linkProperties == null) { + if (states == null || states.length == 0 || states[0].getLinkProperties() == null) { return null; } - return states[0].linkProperties.getInterfaceName(); + return states[0].getLinkProperties().getInterfaceName(); } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java index 0d3fd3fef49c..9410886c3549 100644 --- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java +++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java @@ -22,7 +22,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.net.NetworkCapabilities; -import android.net.TunnelConnectionParams; +import android.net.ipsec.ike.IkeTunnelConnectionParams; import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtilsTest; import androidx.test.filters.SmallTest; @@ -60,7 +60,7 @@ public class VcnGatewayConnectionConfigTest { }; public static final int MAX_MTU = 1360; - public static final TunnelConnectionParams TUNNEL_CONNECTION_PARAMS = + public static final IkeTunnelConnectionParams TUNNEL_CONNECTION_PARAMS = TunnelConnectionParamsUtilsTest.buildTestParams(); public static final String GATEWAY_CONNECTION_NAME_PREFIX = "gatewayConnectionName-"; @@ -82,7 +82,7 @@ public class VcnGatewayConnectionConfigTest { // Public for use in VcnGatewayConnectionTest public static VcnGatewayConnectionConfig buildTestConfigWithExposedCaps(int... exposedCaps) { final VcnGatewayConnectionConfig.Builder builder = - newBuilder().setRetryIntervalsMs(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU); + newBuilder().setRetryIntervalsMillis(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU); for (int caps : exposedCaps) { builder.addExposedCapability(caps); @@ -134,7 +134,7 @@ public class VcnGatewayConnectionConfigTest { @Test public void testBuilderRequiresNonNullRetryInterval() { try { - newBuilder().setRetryIntervalsMs(null); + newBuilder().setRetryIntervalsMillis(null); fail("Expected exception due to invalid retryIntervalMs"); } catch (IllegalArgumentException e) { } @@ -143,7 +143,7 @@ public class VcnGatewayConnectionConfigTest { @Test public void testBuilderRequiresNonEmptyRetryInterval() { try { - newBuilder().setRetryIntervalsMs(new long[0]); + newBuilder().setRetryIntervalsMillis(new long[0]); fail("Expected exception due to invalid retryIntervalMs"); } catch (IllegalArgumentException e) { } @@ -174,7 +174,7 @@ public class VcnGatewayConnectionConfigTest { assertEquals(TUNNEL_CONNECTION_PARAMS, config.getTunnelConnectionParams()); - assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs()); + assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMillis()); assertEquals(MAX_MTU, config.getMaxMtu()); } diff --git a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java index 31561901be9e..582275d0547d 100644 --- a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java +++ b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java @@ -16,6 +16,8 @@ package android.net.vcn; +import static android.net.NetworkCapabilities.REDACT_ALL; +import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static org.junit.Assert.assertEquals; @@ -37,6 +39,12 @@ public class VcnTransportInfoTest { private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO); @Test + public void testRedactionDefaults() { + assertEquals(REDACT_ALL, CELL_UNDERLYING_INFO.getRedaction()); + assertEquals(REDACT_ALL, WIFI_UNDERLYING_INFO.getRedaction()); + } + + @Test public void testGetWifiInfo() { assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo()); @@ -51,6 +59,18 @@ public class VcnTransportInfoTest { } @Test + public void testMakeCopySetsRedactions() { + assertEquals( + REDACT_FOR_NETWORK_SETTINGS, + ((VcnTransportInfo) CELL_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS)) + .getRedaction()); + assertEquals( + REDACT_FOR_NETWORK_SETTINGS, + ((VcnTransportInfo) WIFI_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS)) + .getRedaction()); + } + + @Test public void testEquals() { assertEquals(CELL_UNDERLYING_INFO, CELL_UNDERLYING_INFO); assertEquals(WIFI_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); @@ -64,8 +84,29 @@ public class VcnTransportInfoTest { } private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) { + // Verify redacted by default Parcel parcel = Parcel.obtain(); vcnTransportInfo.writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel)); } + + @Test + public void testParcelUnparcelNotRedactedForSysUi() { + verifyParcelingForSysUi(CELL_UNDERLYING_INFO); + verifyParcelingForSysUi(WIFI_UNDERLYING_INFO); + } + + private void verifyParcelingForSysUi(VcnTransportInfo vcnTransportInfo) { + // Allow fully unredacted; SysUI will have all the relevant permissions. + final VcnTransportInfo unRedacted = (VcnTransportInfo) vcnTransportInfo.makeCopy(0); + final Parcel parcel = Parcel.obtain(); + unRedacted.writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + + final VcnTransportInfo unparceled = VcnTransportInfo.CREATOR.createFromParcel(parcel); + assertEquals(vcnTransportInfo, unparceled); + assertEquals(REDACT_ALL, unparceled.getRedaction()); + } } diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index 530e63699e9f..eedaac48293c 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -51,7 +51,6 @@ import android.net.LinkProperties; import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.net.ipsec.ike.ChildSaProposal; -import android.net.ipsec.ike.IkeTunnelConnectionParams; import android.net.ipsec.ike.exceptions.IkeException; import android.net.ipsec.ike.exceptions.IkeInternalException; import android.net.ipsec.ike.exceptions.IkeProtocolException; @@ -181,7 +180,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState()); final List<ChildSaProposal> saProposals = - ((IkeTunnelConnectionParams) mConfig.getTunnelConnectionParams()) + mConfig.getTunnelConnectionParams() .getTunnelModeChildSessionParams() .getSaProposals(); final int expectedMtu = @@ -344,6 +343,31 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection assertFalse(mGatewayConnection.isInSafeMode()); } + @Test + public void testSubsequentFailedValidationTriggersSafeMode() throws Exception { + triggerChildOpened(); + mTestLooper.dispatchAll(); + + triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID); + assertFalse(mGatewayConnection.isInSafeMode()); + + // Trigger a failed validation, and the subsequent safemode timeout. + triggerValidation(NetworkAgent.VALIDATION_STATUS_NOT_VALID); + mTestLooper.dispatchAll(); + + final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class); + verify(mDeps, times(2)) + .newWakeupMessage( + eq(mVcnContext), + any(), + eq(VcnGatewayConnection.SAFEMODE_TIMEOUT_ALARM), + runnableCaptor.capture()); + runnableCaptor.getValue().run(); + mTestLooper.dispatchAll(); + + assertTrue(mGatewayConnection.isInSafeMode()); + } + private Consumer<VcnNetworkAgent> setupNetworkAndGetUnwantedCallback() { triggerChildOpened(); mTestLooper.dispatchAll(); diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java index 044bef5b002f..a88f112f4502 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java @@ -38,7 +38,7 @@ public class VcnGatewayConnectionRetryTimeoutStateTest extends VcnGatewayConnect public void setUp() throws Exception { super.setUp(); - mFirstRetryInterval = mConfig.getRetryIntervalsMs()[0]; + mFirstRetryInterval = mConfig.getRetryIntervalsMillis()[0]; mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1); mGatewayConnection.transitionTo(mGatewayConnection.mRetryTimeoutState); |