diff options
198 files changed, 1993 insertions, 277 deletions
diff --git a/Android.mk b/Android.mk index 95c3340cd530..2517f6b76319 100644 --- a/Android.mk +++ b/Android.mk @@ -151,7 +151,6 @@ framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES := \ bouncycastle \ okhttp \ ext \ - icu4j \ framework \ voip-common \ android.test.mock \ diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk index 200f92fb590c..63867c923c42 100644 --- a/apct-tests/perftests/core/Android.mk +++ b/apct-tests/perftests/core/Android.mk @@ -12,6 +12,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ legacy-android-test LOCAL_PACKAGE_NAME := CorePerfTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JNI_SHARED_LIBRARIES := libperftestscore_jni diff --git a/apct-tests/perftests/multiuser/Android.mk b/apct-tests/perftests/multiuser/Android.mk index e3f7775383bd..4617af87a15a 100644 --- a/apct-tests/perftests/multiuser/Android.mk +++ b/apct-tests/perftests/multiuser/Android.mk @@ -23,6 +23,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test LOCAL_PACKAGE_NAME := MultiUserPerfTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/api/current.txt b/api/current.txt index f911f4ffa1bb..2c3ed4853d4b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -40235,9 +40235,9 @@ package android.telephony { method public int getCid(); method public int getLac(); method public deprecated int getMcc(); - method public java.lang.String getMccStr(); + method public java.lang.String getMccString(); method public deprecated int getMnc(); - method public java.lang.String getMncStr(); + method public java.lang.String getMncString(); method public java.lang.String getMobileNetworkOperator(); method public java.lang.CharSequence getOperatorAlphaLong(); method public java.lang.CharSequence getOperatorAlphaShort(); @@ -40251,9 +40251,9 @@ package android.telephony { method public int getCi(); method public int getEarfcn(); method public deprecated int getMcc(); - method public java.lang.String getMccStr(); + method public java.lang.String getMccString(); method public deprecated int getMnc(); - method public java.lang.String getMncStr(); + method public java.lang.String getMncString(); method public java.lang.String getMobileNetworkOperator(); method public java.lang.CharSequence getOperatorAlphaLong(); method public java.lang.CharSequence getOperatorAlphaShort(); @@ -40267,8 +40267,8 @@ package android.telephony { method public int getCid(); method public int getCpid(); method public int getLac(); - method public java.lang.String getMccStr(); - method public java.lang.String getMncStr(); + method public java.lang.String getMccString(); + method public java.lang.String getMncString(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityTdscdma> CREATOR; } @@ -40277,9 +40277,9 @@ package android.telephony { method public int getCid(); method public int getLac(); method public deprecated int getMcc(); - method public java.lang.String getMccStr(); + method public java.lang.String getMccString(); method public deprecated int getMnc(); - method public java.lang.String getMncStr(); + method public java.lang.String getMncString(); method public java.lang.String getMobileNetworkOperator(); method public java.lang.CharSequence getOperatorAlphaLong(); method public java.lang.CharSequence getOperatorAlphaShort(); diff --git a/api/system-current.txt b/api/system-current.txt index e3336db34aa8..d66c1538475c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3532,6 +3532,7 @@ package android.provider { method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean); method public static void resetToDefaults(android.content.ContentResolver, java.lang.String); field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus"; + field public static final java.lang.String EUICC_PROVISIONED = "euicc_provisioned"; field public static final java.lang.String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update"; field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on"; field public static final java.lang.String WEBVIEW_MULTIPROCESS = "webview_multiprocess"; @@ -4504,6 +4505,7 @@ package android.telephony.euicc { field public static final int RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES = 2; // 0x2 field public static final int RESET_OPTION_DELETE_OPERATIONAL_PROFILES = 1; // 0x1 field public static final int RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS = 4; // 0x4 + field public static final int RESULT_EUICC_NOT_FOUND = -2; // 0xfffffffe field public static final int RESULT_OK = 0; // 0x0 field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff } @@ -5103,7 +5105,6 @@ package android.telephony.ims.feature { method public void setUiTtyMode(int, android.os.Message); method public int shouldProcessCall(java.lang.String[]); field public static final int PROCESS_CALL_CSFB = 1; // 0x1 - field public static final int PROCESS_CALL_EMERGENCY_CSFB = 2; // 0x2 field public static final int PROCESS_CALL_IMS = 0; // 0x0 } @@ -5250,7 +5251,9 @@ package android.telephony.ims.stub { method public final void onSmsReceived(int, java.lang.String, byte[]) throws java.lang.RuntimeException; method public final void onSmsStatusReportReceived(int, int, java.lang.String, byte[]) throws java.lang.RuntimeException; method public void sendSms(int, int, java.lang.String, java.lang.String, boolean, byte[]); - field public static final int DELIVER_STATUS_ERROR = 2; // 0x2 + field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2 + field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3 + field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4 field public static final int DELIVER_STATUS_OK = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4 diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 6526123aba13..78a2d4a69c15 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -29,11 +29,11 @@ #include <signal.h> #include <time.h> +#include <cutils/atomic.h> #include <cutils/properties.h> #include <androidfw/AssetManager.h> #include <binder/IPCThreadState.h> -#include <utils/Atomic.h> #include <utils/Errors.h> #include <utils/Log.h> #include <utils/SystemClock.h> diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java index b255a43cbe30..419eda3a85e3 100644 --- a/core/java/android/bluetooth/BluetoothA2dp.java +++ b/core/java/android/bluetooth/BluetoothA2dp.java @@ -25,7 +25,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.media.AudioManager; import android.os.Binder; import android.os.IBinder; import android.os.ParcelUuid; @@ -599,34 +598,6 @@ public final class BluetoothA2dp implements BluetoothProfile { } /** - * Tells remote device to adjust volume. Only if absolute volume is - * supported. Uses the following values: - * <ul> - * <li>{@link AudioManager#ADJUST_LOWER}</li> - * <li>{@link AudioManager#ADJUST_RAISE}</li> - * <li>{@link AudioManager#ADJUST_MUTE}</li> - * <li>{@link AudioManager#ADJUST_UNMUTE}</li> - * </ul> - * - * @param direction One of the supported adjust values. - * @hide - */ - public void adjustAvrcpAbsoluteVolume(int direction) { - if (DBG) Log.d(TAG, "adjustAvrcpAbsoluteVolume"); - try { - mServiceLock.readLock().lock(); - if (mService != null && isEnabled()) { - mService.adjustAvrcpAbsoluteVolume(direction); - } - if (mService == null) Log.w(TAG, "Proxy not attached to service"); - } catch (RemoteException e) { - Log.e(TAG, "Error talking to BT service in adjustAvrcpAbsoluteVolume()", e); - } finally { - mServiceLock.readLock().unlock(); - } - } - - /** * Tells remote device to set an absolute volume. Only if absolute volume is supported * * @param volume Absolute volume to be set on AVRCP side diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java index 0a0d21498032..605dbd21993f 100644 --- a/core/java/android/bluetooth/BluetoothUuid.java +++ b/core/java/android/bluetooth/BluetoothUuid.java @@ -79,9 +79,8 @@ public final class BluetoothUuid { ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB"); public static final ParcelUuid SAP = ParcelUuid.fromString("0000112D-0000-1000-8000-00805F9B34FB"); - /* TODO: b/69623109 update this value. It will change to 16bit UUID!! */ public static final ParcelUuid HearingAid = - ParcelUuid.fromString("7312C48F-22CC-497F-85FD-A0616A3B9E05"); + ParcelUuid.fromString("0000FDF0-0000-1000-8000-00805f9b34fb"); public static final ParcelUuid BASE_UUID = ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB"); diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index a3e3354ee087..0e74d9ec2c50 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3304,7 +3304,7 @@ public class PackageParser { && (perm.info.protectionLevel&PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) == 0 && (perm.info.protectionLevel&PermissionInfo.PROTECTION_MASK_BASE) != PermissionInfo.PROTECTION_SIGNATURE) { - outError[0] = "<permission> protectionLevel specifies a non-instnat flag but is " + outError[0] = "<permission> protectionLevel specifies a non-instant flag but is " + "not based on signature type"; mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index 6e2654e3ce7c..4631c565962f 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -25,6 +25,7 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; +import java.util.Comparator; /** * This class represents an IP prefix, i.e., a contiguous block of IP addresses aligned on a @@ -187,6 +188,20 @@ public final class IpPrefix implements Parcelable { } /** + * Returns whether the specified prefix is entirely contained in this prefix. + * + * Note this is mathematical inclusion, so a prefix is always contained within itself. + * @param otherPrefix the prefix to test + * @hide + */ + public boolean containsPrefix(IpPrefix otherPrefix) { + if (otherPrefix.getPrefixLength() < prefixLength) return false; + final byte[] otherAddress = otherPrefix.getRawAddress(); + NetworkUtils.maskRawAddress(otherAddress, prefixLength); + return Arrays.equals(otherAddress, address); + } + + /** * @hide */ public boolean isIPv6() { @@ -230,6 +245,38 @@ public final class IpPrefix implements Parcelable { } /** + * Returns a comparator ordering IpPrefixes by length, shorter to longer. + * Contents of the address will break ties. + * @hide + */ + public static Comparator<IpPrefix> lengthComparator() { + return new Comparator<IpPrefix>() { + @Override + public int compare(IpPrefix prefix1, IpPrefix prefix2) { + if (prefix1.isIPv4()) { + if (prefix2.isIPv6()) return -1; + } else { + if (prefix2.isIPv4()) return 1; + } + final int p1len = prefix1.getPrefixLength(); + final int p2len = prefix2.getPrefixLength(); + if (p1len < p2len) return -1; + if (p2len < p1len) return 1; + final byte[] a1 = prefix1.address; + final byte[] a2 = prefix2.address; + final int len = a1.length < a2.length ? a1.length : a2.length; + for (int i = 0; i < len; ++i) { + if (a1[i] < a2[i]) return -1; + if (a1[i] > a2[i]) return 1; + } + if (a2.length < len) return 1; + if (a1.length < len) return -1; + return 0; + } + }; + } + + /** * Implement the Parcelable interface. */ public static final Creator<IpPrefix> CREATOR = diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index c94ae93a6f3b..4be01d0abd94 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -17,6 +17,7 @@ package android.net; import android.annotation.IntDef; +import android.annotation.SystemApi; import android.net.ConnectivityManager.NetworkCallback; import android.os.Parcel; import android.os.Parcelable; @@ -68,6 +69,7 @@ public final class NetworkCapabilities implements Parcelable { mSignalStrength = nc.mSignalStrength; mUids = nc.mUids; mEstablishingVpnAppUid = nc.mEstablishingVpnAppUid; + mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities; } } @@ -77,7 +79,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public void clearAll() { - mNetworkCapabilities = mTransportTypes = 0; + mNetworkCapabilities = mTransportTypes = mUnwantedNetworkCapabilities = 0; mLinkUpBandwidthKbps = mLinkDownBandwidthKbps = LINK_BANDWIDTH_UNSPECIFIED; mNetworkSpecifier = null; mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED; @@ -91,6 +93,11 @@ public final class NetworkCapabilities implements Parcelable { */ private long mNetworkCapabilities; + /** + * If any capabilities specified here they must not exist in the matching Network. + */ + private long mUnwantedNetworkCapabilities; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "NET_CAPABILITY_" }, value = { @@ -116,6 +123,7 @@ public final class NetworkCapabilities implements Parcelable { NET_CAPABILITY_FOREGROUND, NET_CAPABILITY_NOT_CONGESTED, NET_CAPABILITY_NOT_SUSPENDED, + NET_CAPABILITY_OEM_PAID, }) public @interface NetCapability { } @@ -263,8 +271,15 @@ public final class NetworkCapabilities implements Parcelable { */ public static final int NET_CAPABILITY_NOT_SUSPENDED = 21; + /** + * Indicates that traffic that goes through this network is paid by oem. For example, + * this network can be used by system apps to upload telemetry data. + * @hide + */ + public static final int NET_CAPABILITY_OEM_PAID = 22; + private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; - private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_NOT_SUSPENDED; + private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_OEM_PAID; /** * Network capabilities that are expected to be mutable, i.e., can change while a particular @@ -312,7 +327,8 @@ public final class NetworkCapabilities implements Parcelable { (1 << NET_CAPABILITY_IA) | (1 << NET_CAPABILITY_IMS) | (1 << NET_CAPABILITY_RCS) | - (1 << NET_CAPABILITY_XCAP); + (1 << NET_CAPABILITY_XCAP) | + (1 << NET_CAPABILITY_OEM_PAID); /** * Capabilities that suggest that a network is unrestricted. @@ -329,31 +345,55 @@ public final class NetworkCapabilities implements Parcelable { * Adds the given capability to this {@code NetworkCapability} instance. * Multiple capabilities may be applied sequentially. Note that when searching * for a network to satisfy a request, all capabilities requested must be satisfied. + * <p> + * If the given capability was previously added to the list of unwanted capabilities + * then the capability will also be removed from the list of unwanted capabilities. * * @param capability the capability to be added. * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ public NetworkCapabilities addCapability(@NetCapability int capability) { - if (capability < MIN_NET_CAPABILITY || capability > MAX_NET_CAPABILITY) { - throw new IllegalArgumentException("NetworkCapability out of range"); - } + checkValidCapability(capability); mNetworkCapabilities |= 1 << capability; + mUnwantedNetworkCapabilities &= ~(1 << capability); // remove from unwanted capability list return this; } /** + * Adds the given capability to the list of unwanted capabilities of this + * {@code NetworkCapability} instance. Multiple unwanted capabilities may be applied + * sequentially. Note that when searching for a network to satisfy a request, the network + * must not contain any capability from unwanted capability list. + * <p> + * If the capability was previously added to the list of required capabilities (for + * example, it was there by default or added using {@link #addCapability(int)} method), then + * it will be removed from the list of required capabilities as well. + * + * @see #addCapability(int) + * @hide + */ + public void addUnwantedCapability(@NetCapability int capability) { + checkValidCapability(capability); + mUnwantedNetworkCapabilities |= 1 << capability; + mNetworkCapabilities &= ~(1 << capability); // remove from requested capabilities + } + + /** * Removes (if found) the given capability from this {@code NetworkCapability} instance. + * <p> + * Note that this method removes capabilities that was added via {@link #addCapability(int)}, + * {@link #addUnwantedCapability(int)} or {@link #setCapabilities(int[], int[])} . * * @param capability the capability to be removed. * @return This NetworkCapabilities instance, to facilitate chaining. * @hide */ public NetworkCapabilities removeCapability(@NetCapability int capability) { - if (capability < MIN_NET_CAPABILITY || capability > MAX_NET_CAPABILITY) { - throw new IllegalArgumentException("NetworkCapability out of range"); - } - mNetworkCapabilities &= ~(1 << capability); + checkValidCapability(capability); + final long mask = ~(1 << capability); + mNetworkCapabilities &= mask; + mUnwantedNetworkCapabilities &= mask; return this; } @@ -383,30 +423,57 @@ public final class NetworkCapabilities implements Parcelable { } /** + * Gets all the unwanted capabilities set on this {@code NetworkCapability} instance. + * + * @return an array of unwanted capability values for this instance. + * @hide + */ + public @NetCapability int[] getUnwantedCapabilities() { + return BitUtils.unpackBits(mUnwantedNetworkCapabilities); + } + + + /** * Sets all the capabilities set on this {@code NetworkCapability} instance. * This overwrites any existing capabilities. * * @hide */ - public void setCapabilities(@NetCapability int[] capabilities) { + public void setCapabilities(@NetCapability int[] capabilities, + @NetCapability int[] unwantedCapabilities) { mNetworkCapabilities = BitUtils.packBits(capabilities); + mUnwantedNetworkCapabilities = BitUtils.packBits(unwantedCapabilities); } /** - * Tests for the presence of a capabilitity on this instance. + * @deprecated use {@link #setCapabilities(int[], int[])} + * @hide + */ + @Deprecated + public void setCapabilities(@NetCapability int[] capabilities) { + setCapabilities(capabilities, new int[] {}); + } + + /** + * Tests for the presence of a capability on this instance. * * @param capability the capabilities to be tested for. * @return {@code true} if set on this instance. */ public boolean hasCapability(@NetCapability int capability) { - if (capability < MIN_NET_CAPABILITY || capability > MAX_NET_CAPABILITY) { - return false; - } - return ((mNetworkCapabilities & (1 << capability)) != 0); + return isValidCapability(capability) + && ((mNetworkCapabilities & (1 << capability)) != 0); + } + + /** @hide */ + public boolean hasUnwantedCapability(@NetCapability int capability) { + return isValidCapability(capability) + && ((mUnwantedNetworkCapabilities & (1 << capability)) != 0); } private void combineNetCapabilities(NetworkCapabilities nc) { this.mNetworkCapabilities |= nc.mNetworkCapabilities; + this.mUnwantedNetworkCapabilities |= nc.mUnwantedNetworkCapabilities; } /** @@ -417,7 +484,9 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public String describeFirstNonRequestableCapability() { - final long nonRequestable = (mNetworkCapabilities & NON_REQUESTABLE_CAPABILITIES); + final long nonRequestable = (mNetworkCapabilities | mUnwantedNetworkCapabilities) + & NON_REQUESTABLE_CAPABILITIES; + if (nonRequestable != 0) { return capabilityNameOf(BitUtils.unpackBits(nonRequestable)[0]); } @@ -427,21 +496,29 @@ public final class NetworkCapabilities implements Parcelable { } private boolean satisfiedByNetCapabilities(NetworkCapabilities nc, boolean onlyImmutable) { - long networkCapabilities = this.mNetworkCapabilities; + long requestedCapabilities = mNetworkCapabilities; + long requestedUnwantedCapabilities = mUnwantedNetworkCapabilities; + long providedCapabilities = nc.mNetworkCapabilities; + if (onlyImmutable) { - networkCapabilities = networkCapabilities & ~MUTABLE_CAPABILITIES; + requestedCapabilities &= ~MUTABLE_CAPABILITIES; + requestedUnwantedCapabilities &= ~MUTABLE_CAPABILITIES; } - return ((nc.mNetworkCapabilities & networkCapabilities) == networkCapabilities); + return ((providedCapabilities & requestedCapabilities) == requestedCapabilities) + && ((requestedUnwantedCapabilities & providedCapabilities) == 0); } /** @hide */ public boolean equalsNetCapabilities(NetworkCapabilities nc) { - return (nc.mNetworkCapabilities == this.mNetworkCapabilities); + return (nc.mNetworkCapabilities == this.mNetworkCapabilities) + && (nc.mUnwantedNetworkCapabilities == this.mUnwantedNetworkCapabilities); } private boolean equalsNetCapabilitiesRequestable(NetworkCapabilities that) { return ((this.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == - (that.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)); + (that.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)) + && ((this.mUnwantedNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == + (that.mUnwantedNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)); } /** @@ -881,7 +958,16 @@ public final class NetworkCapabilities implements Parcelable { /** * List of UIDs this network applies to. No restriction if null. * <p> - * This is typically (and at this time, only) used by VPN. This network is only available to + * For networks, mUids represent the list of network this applies to, and null means this + * network applies to all UIDs. + * For requests, mUids is the list of UIDs this network MUST apply to to match ; ALL UIDs + * must be included in a network so that they match. As an exception to the general rule, + * a null mUids field for requests mean "no requirements" rather than what the general rule + * would suggest ("must apply to all UIDs") : this is because this has shown to be what users + * of this API expect in practice. A network that must match all UIDs can still be + * expressed with a set ranging the entire set of possible UIDs. + * <p> + * mUids is typically (and at this time, only) used by VPN. This network is only available to * the UIDs in this list, and it is their default network. Apps in this list that wish to * bypass the VPN can do so iff the VPN app allows them to or if they are privileged. If this * member is null, then the network is not restricted by app UID. If it's an empty list, then @@ -1003,8 +1089,7 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public boolean satisfiedByUids(NetworkCapabilities nc) { - if (null == nc.mUids) return true; // The network satisfies everything. - if (null == mUids) return false; // Not everything allowed but requires everything + if (null == nc.mUids || null == mUids) return true; // The network satisfies everything. for (UidRange requiredRange : mUids) { if (requiredRange.contains(nc.mEstablishingVpnAppUid)) return true; if (!nc.appliesToUidRange(requiredRange)) { @@ -1169,15 +1254,17 @@ public final class NetworkCapabilities implements Parcelable { @Override public int hashCode() { - return ((int) (mNetworkCapabilities & 0xFFFFFFFF) + return (int) (mNetworkCapabilities & 0xFFFFFFFF) + ((int) (mNetworkCapabilities >> 32) * 3) - + ((int) (mTransportTypes & 0xFFFFFFFF) * 5) - + ((int) (mTransportTypes >> 32) * 7) - + (mLinkUpBandwidthKbps * 11) - + (mLinkDownBandwidthKbps * 13) - + Objects.hashCode(mNetworkSpecifier) * 17 - + (mSignalStrength * 19) - + Objects.hashCode(mUids) * 23); + + ((int) (mUnwantedNetworkCapabilities & 0xFFFFFFFF) * 5) + + ((int) (mUnwantedNetworkCapabilities >> 32) * 7) + + ((int) (mTransportTypes & 0xFFFFFFFF) * 11) + + ((int) (mTransportTypes >> 32) * 13) + + (mLinkUpBandwidthKbps * 17) + + (mLinkDownBandwidthKbps * 19) + + Objects.hashCode(mNetworkSpecifier) * 23 + + (mSignalStrength * 29) + + Objects.hashCode(mUids) * 31; } @Override @@ -1187,6 +1274,7 @@ public final class NetworkCapabilities implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(mNetworkCapabilities); + dest.writeLong(mUnwantedNetworkCapabilities); dest.writeLong(mTransportTypes); dest.writeInt(mLinkUpBandwidthKbps); dest.writeInt(mLinkDownBandwidthKbps); @@ -1202,6 +1290,7 @@ public final class NetworkCapabilities implements Parcelable { NetworkCapabilities netCap = new NetworkCapabilities(); netCap.mNetworkCapabilities = in.readLong(); + netCap.mUnwantedNetworkCapabilities = in.readLong(); netCap.mTransportTypes = in.readLong(); netCap.mLinkUpBandwidthKbps = in.readInt(); netCap.mLinkDownBandwidthKbps = in.readInt(); @@ -1219,34 +1308,73 @@ public final class NetworkCapabilities implements Parcelable { @Override public String toString() { - // TODO: enumerate bits for transports and capabilities instead of creating arrays. - // TODO: use a StringBuilder instead of string concatenation. - int[] types = getTransportTypes(); - String transports = (types.length > 0) ? " Transports: " + transportNamesOf(types) : ""; - - types = getCapabilities(); - String capabilities = (types.length > 0 ? " Capabilities: " : ""); - for (int i = 0; i < types.length; ) { - capabilities += capabilityNameOf(types[i]); - if (++i < types.length) capabilities += "&"; + final StringBuilder sb = new StringBuilder("["); + if (0 != mTransportTypes) { + sb.append(" Transports: "); + appendStringRepresentationOfBitMaskToStringBuilder(sb, mTransportTypes, + NetworkCapabilities::transportNameOf, "|"); + } + if (0 != mNetworkCapabilities) { + sb.append(" Capabilities: "); + appendStringRepresentationOfBitMaskToStringBuilder(sb, mNetworkCapabilities, + NetworkCapabilities::capabilityNameOf, "&"); + } + if (0 != mNetworkCapabilities) { + sb.append(" Unwanted: "); + appendStringRepresentationOfBitMaskToStringBuilder(sb, mUnwantedNetworkCapabilities, + NetworkCapabilities::capabilityNameOf, "&"); + } + if (mLinkUpBandwidthKbps > 0) { + sb.append(" LinkUpBandwidth>=").append(mLinkUpBandwidthKbps).append("Kbps"); + } + if (mLinkDownBandwidthKbps > 0) { + sb.append(" LinkDnBandwidth>=").append(mLinkDownBandwidthKbps).append("Kbps"); + } + if (mNetworkSpecifier != null) { + sb.append(" Specifier: <").append(mNetworkSpecifier).append(">"); + } + if (hasSignalStrength()) { + sb.append(" SignalStrength: ").append(mSignalStrength); } - String upBand = ((mLinkUpBandwidthKbps > 0) ? " LinkUpBandwidth>=" + - mLinkUpBandwidthKbps + "Kbps" : ""); - String dnBand = ((mLinkDownBandwidthKbps > 0) ? " LinkDnBandwidth>=" + - mLinkDownBandwidthKbps + "Kbps" : ""); - - String specifier = (mNetworkSpecifier == null ? - "" : " Specifier: <" + mNetworkSpecifier + ">"); - - String signalStrength = (hasSignalStrength() ? " SignalStrength: " + mSignalStrength : ""); + if (null != mUids) { + if ((1 == mUids.size()) && (mUids.valueAt(0).count() == 1)) { + sb.append(" Uid: ").append(mUids.valueAt(0).start); + } else { + sb.append(" Uids: <").append(mUids).append(">"); + } + } + if (mEstablishingVpnAppUid != INVALID_UID) { + sb.append(" EstablishingAppUid: ").append(mEstablishingVpnAppUid); + } - String uids = (null != mUids ? " Uids: <" + mUids + ">" : ""); + sb.append("]"); + return sb.toString(); + } - String establishingAppUid = " EstablishingAppUid: " + mEstablishingVpnAppUid; - return "[" + transports + capabilities + upBand + dnBand + specifier + signalStrength - + uids + establishingAppUid + "]"; + private interface NameOf { + String nameOf(int value); + } + /** + * @hide + */ + public static void appendStringRepresentationOfBitMaskToStringBuilder(StringBuilder sb, + long bitMask, NameOf nameFetcher, String separator) { + int bitPos = 0; + boolean firstElementAdded = false; + while (bitMask != 0) { + if ((bitMask & 1) != 0) { + if (firstElementAdded) { + sb.append(separator); + } else { + firstElementAdded = true; + } + sb.append(nameFetcher.nameOf(bitPos)); + } + bitMask >>= 1; + ++bitPos; + } } /** @@ -1289,6 +1417,7 @@ public final class NetworkCapabilities implements Parcelable { case NET_CAPABILITY_FOREGROUND: return "FOREGROUND"; case NET_CAPABILITY_NOT_CONGESTED: return "NOT_CONGESTED"; case NET_CAPABILITY_NOT_SUSPENDED: return "NOT_SUSPENDED"; + case NET_CAPABILITY_OEM_PAID: return "OEM_PAID"; default: return Integer.toString(capability); } } @@ -1320,4 +1449,13 @@ public final class NetworkCapabilities implements Parcelable { Preconditions.checkArgument( isValidTransport(transport), "Invalid TransportType " + transport); } + + private static boolean isValidCapability(@NetworkCapabilities.NetCapability int capability) { + return capability >= MIN_NET_CAPABILITY && capability <= MAX_NET_CAPABILITY; + } + + private static void checkValidCapability(@NetworkCapabilities.NetCapability int capability) { + Preconditions.checkArgument(isValidCapability(capability), + "NetworkCapability " + capability + "out of range"); + } } diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index 97ded2d73b60..96826f800066 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -19,6 +19,7 @@ package android.net; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; +import android.os.Process; import android.text.TextUtils; import java.util.Objects; @@ -131,12 +132,18 @@ public class NetworkRequest implements Parcelable { * needed in terms of {@link NetworkCapabilities} features */ public static class Builder { - private final NetworkCapabilities mNetworkCapabilities = new NetworkCapabilities(); + private final NetworkCapabilities mNetworkCapabilities; /** * Default constructor for Builder. */ - public Builder() {} + public Builder() { + // By default, restrict this request to networks available to this app. + // Apps can rescind this restriction, but ConnectivityService will enforce + // it for apps that do not have the NETWORK_SETTINGS permission. + mNetworkCapabilities = new NetworkCapabilities(); + mNetworkCapabilities.setSingleUid(Process.myUid()); + } /** * Build {@link NetworkRequest} give the current set of capabilities. @@ -157,6 +164,9 @@ public class NetworkRequest implements Parcelable { * the requested network's required capabilities. Note that when searching * for a network to satisfy a request, all capabilities requested must be * satisfied. + * <p> + * If the given capability was previously added to the list of unwanted capabilities + * then the capability will also be removed from the list of unwanted capabilities. * * @param capability The capability to add. * @return The builder to facilitate chaining @@ -168,7 +178,8 @@ public class NetworkRequest implements Parcelable { } /** - * Removes (if found) the given capability from this builder instance. + * Removes (if found) the given capability from this builder instance from both required + * and unwanted capabilities lists. * * @param capability The capability to remove. * @return The builder to facilitate chaining. @@ -193,6 +204,24 @@ public class NetworkRequest implements Parcelable { } /** + * Add a capability that must not exist in the requested network. + * <p> + * If the capability was previously added to the list of required capabilities (for + * example, it was there by default or added using {@link #addCapability(int)} method), then + * it will be removed from the list of required capabilities as well. + * + * @see #addCapability(int) + * + * @param capability The capability to add to unwanted capability list. + * @return The builder to facilitate chaining. + * @hide + */ + public Builder addUnwantedCapability(@NetworkCapabilities.NetCapability int capability) { + mNetworkCapabilities.addUnwantedCapability(capability); + return this; + } + + /** * Completely clears all the {@code NetworkCapabilities} from this builder instance, * removing even the capabilities that are set by default when the object is constructed. * diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index fe9563d6d325..9a5d502673f3 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -16,19 +16,20 @@ package android.net; +import android.os.Parcel; +import android.util.Log; +import android.util.Pair; + import java.io.FileDescriptor; -import java.net.InetAddress; +import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; +import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Collection; import java.util.Locale; - -import android.os.Parcel; -import android.util.Log; -import android.util.Pair; - +import java.util.TreeSet; /** * Native methods for managing network interfaces. @@ -385,4 +386,72 @@ public class NetworkUtils { result = builder.toString(); return result; } + + /** + * Returns a prefix set without overlaps. + * + * This expects the src set to be sorted from shorter to longer. Results are undefined + * failing this condition. The returned prefix set is sorted in the same order as the + * passed set, with the same comparator. + */ + private static TreeSet<IpPrefix> deduplicatePrefixSet(final TreeSet<IpPrefix> src) { + final TreeSet<IpPrefix> dst = new TreeSet<>(src.comparator()); + // Prefixes match addresses that share their upper part up to their length, therefore + // the only kind of possible overlap in two prefixes is strict inclusion of the longer + // (more restrictive) in the shorter (including equivalence if they have the same + // length). + // Because prefixes in the src set are sorted from shorter to longer, deduplicating + // is done by simply iterating in order, and not adding any longer prefix that is + // already covered by a shorter one. + newPrefixes: + for (IpPrefix newPrefix : src) { + for (IpPrefix existingPrefix : dst) { + if (existingPrefix.containsPrefix(newPrefix)) { + continue newPrefixes; + } + } + dst.add(newPrefix); + } + return dst; + } + + /** + * Returns how many IPv4 addresses match any of the prefixes in the passed ordered set. + * + * Obviously this returns an integral value between 0 and 2**32. + * The behavior is undefined if any of the prefixes is not an IPv4 prefix or if the + * set is not ordered smallest prefix to longer prefix. + * + * @param prefixes the set of prefixes, ordered by length + */ + public static long routedIPv4AddressCount(final TreeSet<IpPrefix> prefixes) { + long routedIPCount = 0; + for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) { + if (!prefix.isIPv4()) { + Log.wtf(TAG, "Non-IPv4 prefix in routedIPv4AddressCount"); + } + int rank = 32 - prefix.getPrefixLength(); + routedIPCount += 1L << rank; + } + return routedIPCount; + } + + /** + * Returns how many IPv6 addresses match any of the prefixes in the passed ordered set. + * + * This returns a BigInteger between 0 and 2**128. + * The behavior is undefined if any of the prefixes is not an IPv6 prefix or if the + * set is not ordered smallest prefix to longer prefix. + */ + public static BigInteger routedIPv6AddressCount(final TreeSet<IpPrefix> prefixes) { + BigInteger routedIPCount = BigInteger.ZERO; + for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) { + if (!prefix.isIPv6()) { + Log.wtf(TAG, "Non-IPv6 prefix in routedIPv6AddressCount"); + } + int rank = 128 - prefix.getPrefixLength(); + routedIPCount = routedIPCount.add(BigInteger.ONE.shiftLeft(rank)); + } + return routedIPCount; + } } diff --git a/core/java/android/net/UidRange.java b/core/java/android/net/UidRange.java index fd465d95a9ca..3164929943c4 100644 --- a/core/java/android/net/UidRange.java +++ b/core/java/android/net/UidRange.java @@ -21,8 +21,6 @@ import static android.os.UserHandle.PER_USER_RANGE; import android.os.Parcel; import android.os.Parcelable; -import java.lang.IllegalArgumentException; - /** * An inclusive range of UIDs. * @@ -53,6 +51,13 @@ public final class UidRange implements Parcelable { } /** + * Returns the count of UIDs in this range. + */ + public int count() { + return 1 + stop - start; + } + + /** * @return {@code true} if this range contains every UID contained by the {@param other} range. */ public boolean containsRange(UidRange other) { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 36dcca69970c..ca3f5e9a31e5 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7863,6 +7863,7 @@ public final class Settings { * (0 = false, 1 = true) * @hide */ + @SystemApi public static final String EUICC_PROVISIONED = "euicc_provisioned"; /** diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index b5a8acaf674f..285a5f057c52 100755 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -158,9 +158,9 @@ public class DateFormat { private static Locale sIs24HourLocale; private static boolean sIs24Hour; - /** - * Returns true if user preference is set to 24-hour format. + * Returns true if times should be formatted as 24 hour times, false if times should be + * formatted as 12 hour (AM/PM) times. Based on the user's chosen locale and other preferences. * @param context the context to use for the content resolver * @return true if 24 hour time format is selected, false otherwise. */ @@ -169,7 +169,8 @@ public class DateFormat { } /** - * Returns true if user preference with the given user handle is set to 24-hour format. + * Returns true if times should be formatted as 24 hour times, false if times should be + * formatted as 12 hour (AM/PM) times. Based on the user's chosen locale and other preferences. * @param context the context to use for the content resolver * @param userHandle the user handle of the user to query. * @return true if 24 hour time format is selected, false otherwise. diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java index d2923c4b8d12..ca3a227eaa11 100644 --- a/core/java/android/webkit/WebViewZygote.java +++ b/core/java/android/webkit/WebViewZygote.java @@ -93,13 +93,11 @@ public class WebViewZygote { synchronized (sLock) { sMultiprocessEnabled = enabled; - // When toggling between multi-process being on/off, start or stop the - // zygote. If it is enabled and the zygote is not yet started, launch it. - // Otherwise, kill it. The name may be null if the package information has - // not yet been resolved. - if (enabled) { - connectToZygoteIfNeededLocked(); - } else { + // When multi-process is disabled, kill the zygote. When it is enabled, + // the zygote is not explicitly started here to avoid waiting on the + // zygote launch at boot. Instead, the zygote will be started when it is + // first needed in getProcess(). + if (!enabled) { stopZygoteLocked(); } } diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index f0ac79acd7de..a5a3986e7cfd 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -28,9 +28,9 @@ #include <sys/types.h> #include <unistd.h> -#include <utils/Atomic.h> #include <binder/IInterface.h> #include <binder/IPCThreadState.h> +#include <cutils/atomic.h> #include <utils/Log.h> #include <utils/SystemClock.h> #include <utils/List.h> diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 93abc6359b57..a04094099cc2 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -34,8 +34,8 @@ #include <binder/IPCThreadState.h> #include <binder/Parcel.h> #include <binder/ProcessState.h> +#include <cutils/atomic.h> #include <log/log.h> -#include <utils/Atomic.h> #include <utils/KeyedVector.h> #include <utils/List.h> #include <utils/Log.h> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 42efc21a5d6e..23159f7b2fdc 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1578,6 +1578,9 @@ <!-- Operating volatage for bluetooth controller. 0 by default--> <integer translatable="false" name="config_bluetooth_operating_voltage_mv">0</integer> + <!-- Max number of connected audio devices supported by Bluetooth stack --> + <integer name="config_bluetooth_max_connected_audio_devices">1</integer> + <!-- Whether supported profiles should be reloaded upon enabling bluetooth --> <bool name="config_bluetooth_reload_supported_profiles_when_enabled">false</bool> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 0a36ba747520..dc14b2345e04 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3462,6 +3462,13 @@ <string name="tethered_notification_title">Tethering or hotspot active</string> <string name="tethered_notification_message">Tap to set up.</string> + <!-- Strings for tether disabling notification --> + <!-- This notification is shown when tethering has been disabled on a user's device. + The device is managed by the user's employer. Tethering can't be turned on unless the + IT administrator allows it. The noun "admin" is another reference for "IT administrator." --> + <string name="disable_tether_notification_title">Tethering is disabled</string> + <string name="disable_tether_notification_message">Contact your admin for details</string> + <!-- Strings for possible PreferenceActivity Back/Next buttons --> <string name="back_button_label">Back</string> <string name="next_button_label">Next</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ba9b8fe109f1..ad5af95d462e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -395,6 +395,7 @@ <java-symbol type="integer" name="config_wifi_framework_current_network_boost" /> <java-symbol type="integer" name="config_bluetooth_max_advertisers" /> <java-symbol type="integer" name="config_bluetooth_max_scan_filters" /> + <java-symbol type="integer" name="config_bluetooth_max_connected_audio_devices" /> <java-symbol type="integer" name="config_burnInProtectionMinHorizontalOffset" /> <java-symbol type="integer" name="config_burnInProtectionMaxHorizontalOffset" /> <java-symbol type="integer" name="config_burnInProtectionMinVerticalOffset" /> @@ -1966,6 +1967,8 @@ <java-symbol type="string" name="smv_process" /> <java-symbol type="string" name="tethered_notification_message" /> <java-symbol type="string" name="tethered_notification_title" /> + <java-symbol type="string" name="disable_tether_notification_message" /> + <java-symbol type="string" name="disable_tether_notification_title" /> <java-symbol type="string" name="adb_debugging_notification_channel_tv" /> <java-symbol type="string" name="usb_accessory_notification_title" /> <java-symbol type="string" name="usb_mtp_notification_title" /> diff --git a/core/tests/BTtraffic/Android.mk b/core/tests/BTtraffic/Android.mk index 7d8352717a34..f826ae9d79a1 100644 --- a/core/tests/BTtraffic/Android.mk +++ b/core/tests/BTtraffic/Android.mk @@ -9,6 +9,7 @@ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := bttraffic +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/core/tests/ConnectivityManagerTest/Android.mk b/core/tests/ConnectivityManagerTest/Android.mk index 39cf4a49ffbf..93c53d2f1492 100644 --- a/core/tests/ConnectivityManagerTest/Android.mk +++ b/core/tests/ConnectivityManagerTest/Android.mk @@ -25,6 +25,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ConnectivityManagerTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/core/tests/SvcMonitor/Android.mk b/core/tests/SvcMonitor/Android.mk index 2b8045506f02..94ddccbb71c0 100644 --- a/core/tests/SvcMonitor/Android.mk +++ b/core/tests/SvcMonitor/Android.mk @@ -9,6 +9,7 @@ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := svcmonitor +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/core/tests/bandwidthtests/Android.mk b/core/tests/bandwidthtests/Android.mk index 2af92dfe6104..56526bc38e99 100644 --- a/core/tests/bandwidthtests/Android.mk +++ b/core/tests/bandwidthtests/Android.mk @@ -25,6 +25,7 @@ LOCAL_SRC_FILES := \ LOCAL_JAVA_LIBRARIES := android.test.runner org.apache.http.legacy LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := BandwidthTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/core/tests/bluetoothtests/Android.mk b/core/tests/bluetoothtests/Android.mk index f53419ab53cd..41582deb7fe5 100644 --- a/core/tests/bluetoothtests/Android.mk +++ b/core/tests/bluetoothtests/Android.mk @@ -11,6 +11,7 @@ LOCAL_SRC_FILES := \ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := BluetoothTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index dbc9e5d55e37..a802e75b5227 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -40,6 +40,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_JAVA_LIBRARIES := android.test.runner conscrypt telephony-common org.apache.http.legacy LOCAL_PACKAGE_NAME := FrameworksCoreTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_CERTIFICATE := platform diff --git a/core/tests/coretests/DisabledTestApp/Android.mk b/core/tests/coretests/DisabledTestApp/Android.mk index a5daedf06b8d..e4304f7cef73 100644 --- a/core/tests/coretests/DisabledTestApp/Android.mk +++ b/core/tests/coretests/DisabledTestApp/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := DisabledTestApp +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/core/tests/coretests/EnabledTestApp/Android.mk b/core/tests/coretests/EnabledTestApp/Android.mk index 4b986d39b209..cd37f0883c63 100644 --- a/core/tests/coretests/EnabledTestApp/Android.mk +++ b/core/tests/coretests/EnabledTestApp/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := EnabledTestApp +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/core/tests/coretests/apks/FrameworkCoreTests_apk.mk b/core/tests/coretests/apks/FrameworkCoreTests_apk.mk index 1e032703e8b2..8a7d72a5200b 100644 --- a/core/tests/coretests/apks/FrameworkCoreTests_apk.mk +++ b/core/tests/coretests/apks/FrameworkCoreTests_apk.mk @@ -6,6 +6,7 @@ LOCAL_DEX_PREOPT := false # Make sure every package name gets the FrameworkCoreTests_ prefix. LOCAL_PACKAGE_NAME := FrameworkCoreTests_$(LOCAL_PACKAGE_NAME) +LOCAL_SDK_VERSION := current # Every package should have a native library LOCAL_JNI_SHARED_LIBRARIES := libframeworks_coretests_jni diff --git a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk index 47ee2cfe6e90..3261a1a6dbd6 100644 --- a/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk +++ b/core/tests/hosttests/test-apps/DownloadManagerTestApp/Android.mk @@ -24,6 +24,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-common mockwebserver junit legacy-android LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := DownloadManagerTestApp +LOCAL_PRIVATE_PLATFORM_APIS := true ifneq ($(TARGET_BUILD_VARIANT),user) # Need to run as system app to get access to Settings. This test won't work for user builds. diff --git a/core/tests/notificationtests/Android.mk b/core/tests/notificationtests/Android.mk index 0551eb6b75ad..910d5aaaabb7 100644 --- a/core/tests/notificationtests/Android.mk +++ b/core/tests/notificationtests/Android.mk @@ -10,6 +10,9 @@ LOCAL_SRC_FILES := \ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := NotificationStressTests +# Could build against SDK if it wasn't for the @RepetitiveTest annotation. +LOCAL_PRIVATE_PLATFORM_APIS := true + LOCAL_STATIC_JAVA_LIBRARIES := \ junit \ diff --git a/core/tests/packagemanagertests/Android.mk b/core/tests/packagemanagertests/Android.mk index 5bfde78c424a..f95231f1d397 100644 --- a/core/tests/packagemanagertests/Android.mk +++ b/core/tests/packagemanagertests/Android.mk @@ -15,6 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := FrameworksCorePackageManagerTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/core/tests/systemproperties/Android.mk b/core/tests/systemproperties/Android.mk index 4c2e2247a113..d58ed54a4c89 100644 --- a/core/tests/systemproperties/Android.mk +++ b/core/tests/systemproperties/Android.mk @@ -12,6 +12,7 @@ LOCAL_DX_FLAGS := --core-library LOCAL_STATIC_JAVA_LIBRARIES := android-common frameworks-core-util-lib LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := FrameworksCoreSystemPropertiesTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk index 233d070f9507..b142af0d9b62 100644 --- a/core/tests/utiltests/Android.mk +++ b/core/tests/utiltests/Android.mk @@ -22,6 +22,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := FrameworksUtilTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp index 247458d3f4fd..c512a6b06ed1 100644 --- a/libs/androidfw/Asset.cpp +++ b/libs/androidfw/Asset.cpp @@ -26,7 +26,7 @@ #include <androidfw/Util.h> #include <androidfw/ZipFileRO.h> #include <androidfw/ZipUtils.h> -#include <utils/Atomic.h> +#include <cutils/atomic.h> #include <utils/FileMap.h> #include <utils/Log.h> #include <utils/threads.h> diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 5603508eaf09..b4ccae758347 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -28,7 +28,7 @@ #include <androidfw/misc.h> #include <androidfw/ResourceTypes.h> #include <androidfw/ZipFileRO.h> -#include <utils/Atomic.h> +#include <cutils/atomic.h> #include <utils/Log.h> #include <utils/String8.h> #include <utils/String8.h> diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 7a0ef2b770ce..b184d12b674d 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -32,7 +32,7 @@ #include <androidfw/ByteBucketArray.h> #include <androidfw/ResourceTypes.h> #include <androidfw/TypeWrappers.h> -#include <utils/Atomic.h> +#include <cutils/atomic.h> #include <utils/ByteOrder.h> #include <utils/Debug.h> #include <utils/Log.h> diff --git a/location/tests/locationtests/Android.mk b/location/tests/locationtests/Android.mk index 902cd96067e9..c65f596da46c 100644 --- a/location/tests/locationtests/Android.mk +++ b/location/tests/locationtests/Android.mk @@ -9,6 +9,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := FrameworksLocationTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/lowpan/tests/Android.mk b/lowpan/tests/Android.mk index bb0a944b5e7d..9043672374d4 100644 --- a/lowpan/tests/Android.mk +++ b/lowpan/tests/Android.mk @@ -58,6 +58,7 @@ LOCAL_JAVA_LIBRARIES := \ android.test.runner \ LOCAL_PACKAGE_NAME := FrameworksLowpanApiTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_CERTIFICATE := platform diff --git a/media/mca/samples/CameraEffectsRecordingSample/Android.mk b/media/mca/samples/CameraEffectsRecordingSample/Android.mk index d3c43364d16e..c81f2fc57dc3 100644 --- a/media/mca/samples/CameraEffectsRecordingSample/Android.mk +++ b/media/mca/samples/CameraEffectsRecordingSample/Android.mk @@ -23,6 +23,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := CameraEffectsRecordingSample +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled diff --git a/media/mca/tests/Android.mk b/media/mca/tests/Android.mk index eb451f72e49e..5da07c6dfffd 100644 --- a/media/mca/tests/Android.mk +++ b/media/mca/tests/Android.mk @@ -11,6 +11,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := CameraEffectsTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := CameraEffectsRecordingSample diff --git a/media/packages/BluetoothMidiService/Android.mk b/media/packages/BluetoothMidiService/Android.mk index 05659251f7aa..6f262bf6007a 100644 --- a/media/packages/BluetoothMidiService/Android.mk +++ b/media/packages/BluetoothMidiService/Android.mk @@ -7,6 +7,7 @@ LOCAL_SRC_FILES += \ $(call all-java-files-under,src) LOCAL_PACKAGE_NAME := BluetoothMidiService +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/media/tests/EffectsTest/Android.mk b/media/tests/EffectsTest/Android.mk index 25b4fe495914..a066950985a9 100644 --- a/media/tests/EffectsTest/Android.mk +++ b/media/tests/EffectsTest/Android.mk @@ -6,5 +6,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := EffectsTest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/media/tests/MediaFrameworkTest/Android.mk b/media/tests/MediaFrameworkTest/Android.mk index 0d9f42b93007..3c6119e3bd20 100644 --- a/media/tests/MediaFrameworkTest/Android.mk +++ b/media/tests/MediaFrameworkTest/Android.mk @@ -14,5 +14,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ legacy-android-test LOCAL_PACKAGE_NAME := mediaframeworktest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/media/tests/NativeMidiDemo/Android.mk b/media/tests/NativeMidiDemo/Android.mk index 6b08f6bba3f4..316858f667fd 100644 --- a/media/tests/NativeMidiDemo/Android.mk +++ b/media/tests/NativeMidiDemo/Android.mk @@ -19,6 +19,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := NativeMidiDemo #LOCAL_SDK_VERSION := current +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled LOCAL_SRC_FILES := $(call all-java-files-under, java) diff --git a/media/tests/ScoAudioTest/Android.mk b/media/tests/ScoAudioTest/Android.mk index ab12865bc950..2ad91a4c36a2 100644 --- a/media/tests/ScoAudioTest/Android.mk +++ b/media/tests/ScoAudioTest/Android.mk @@ -2,6 +2,7 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) #LOCAL_SDK_VERSION := current +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/media/tests/SoundPoolTest/Android.mk b/media/tests/SoundPoolTest/Android.mk index 7f947c0dfbc6..9ca33c8c2ef2 100644 --- a/media/tests/SoundPoolTest/Android.mk +++ b/media/tests/SoundPoolTest/Android.mk @@ -6,5 +6,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := SoundPoolTest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/native/android/storage_manager.cpp b/native/android/storage_manager.cpp index 137b72cf14e3..bf15b8d075e7 100644 --- a/native/android/storage_manager.cpp +++ b/native/android/storage_manager.cpp @@ -21,7 +21,7 @@ #include <binder/Binder.h> #include <binder/IServiceManager.h> -#include <utils/Atomic.h> +#include <cutils/atomic.h> #include <utils/Log.h> #include <utils/RefBase.h> #include <utils/String8.h> diff --git a/packages/BackupRestoreConfirmation/Android.mk b/packages/BackupRestoreConfirmation/Android.mk index b84c07f359f4..532d272f70f3 100644 --- a/packages/BackupRestoreConfirmation/Android.mk +++ b/packages/BackupRestoreConfirmation/Android.mk @@ -22,6 +22,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := BackupRestoreConfirmation +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/CompanionDeviceManager/Android.mk b/packages/CompanionDeviceManager/Android.mk index f730356e6947..7ec6e1146060 100644 --- a/packages/CompanionDeviceManager/Android.mk +++ b/packages/CompanionDeviceManager/Android.mk @@ -21,6 +21,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := CompanionDeviceManager +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/packages/DefaultContainerService/Android.mk b/packages/DefaultContainerService/Android.mk index 0de2c1fe4a6a..01c8768d349a 100644 --- a/packages/DefaultContainerService/Android.mk +++ b/packages/DefaultContainerService/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := DefaultContainerService +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JNI_SHARED_LIBRARIES := libdefcontainer_jni diff --git a/packages/EasterEgg/Android.mk b/packages/EasterEgg/Android.mk index d4c1e7094b99..dac3ed658afe 100644 --- a/packages/EasterEgg/Android.mk +++ b/packages/EasterEgg/Android.mk @@ -15,6 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := EasterEgg +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/packages/ExtServices/Android.mk b/packages/ExtServices/Android.mk index d0c2b9f4e0a5..467d7ed202cd 100644 --- a/packages/ExtServices/Android.mk +++ b/packages/ExtServices/Android.mk @@ -21,6 +21,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ExtServices +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform diff --git a/packages/ExtServices/tests/Android.mk b/packages/ExtServices/tests/Android.mk index cb3c352a6742..f18904ddc4c7 100644 --- a/packages/ExtServices/tests/Android.mk +++ b/packages/ExtServices/tests/Android.mk @@ -18,6 +18,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ExtServicesUnitTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := ExtServices diff --git a/packages/ExtShared/Android.mk b/packages/ExtShared/Android.mk index d8052df8a8e8..7dbf79fd1eac 100644 --- a/packages/ExtShared/Android.mk +++ b/packages/ExtShared/Android.mk @@ -21,6 +21,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ExtShared +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform diff --git a/packages/ExternalStorageProvider/Android.mk b/packages/ExternalStorageProvider/Android.mk index db825ff49b4c..9e99313cd03a 100644 --- a/packages/ExternalStorageProvider/Android.mk +++ b/packages/ExternalStorageProvider/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := ExternalStorageProvider +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/FakeOemFeatures/Android.mk b/packages/FakeOemFeatures/Android.mk index d96bb3d7d278..43de8e5315cc 100644 --- a/packages/FakeOemFeatures/Android.mk +++ b/packages/FakeOemFeatures/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := FakeOemFeatures +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_ENABLED := disabled diff --git a/packages/FusedLocation/Android.mk b/packages/FusedLocation/Android.mk index 7406eaf4e131..d795870251db 100644 --- a/packages/FusedLocation/Android.mk +++ b/packages/FusedLocation/Android.mk @@ -22,6 +22,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_JAVA_LIBRARIES := com.android.location.provider LOCAL_PACKAGE_NAME := FusedLocation +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/InputDevices/Android.mk b/packages/InputDevices/Android.mk index e7190dc90843..6de1f1d43f72 100644 --- a/packages/InputDevices/Android.mk +++ b/packages/InputDevices/Android.mk @@ -22,6 +22,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_JAVA_LIBRARIES := LOCAL_PACKAGE_NAME := InputDevices +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/MtpDocumentsProvider/Android.mk b/packages/MtpDocumentsProvider/Android.mk index a9e9b2e1a621..2d62a07566bf 100644 --- a/packages/MtpDocumentsProvider/Android.mk +++ b/packages/MtpDocumentsProvider/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := MtpDocumentsProvider +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := media LOCAL_PRIVILEGED_MODULE := true LOCAL_PROGUARD_FLAG_FILES := proguard.flags diff --git a/packages/MtpDocumentsProvider/perf_tests/Android.mk b/packages/MtpDocumentsProvider/perf_tests/Android.mk index f0d4878fd5e3..6504af12db23 100644 --- a/packages/MtpDocumentsProvider/perf_tests/Android.mk +++ b/packages/MtpDocumentsProvider/perf_tests/Android.mk @@ -5,6 +5,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_LIBRARIES := android-support-test LOCAL_PACKAGE_NAME := MtpDocumentsProviderPerfTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := MtpDocumentsProvider LOCAL_CERTIFICATE := media diff --git a/packages/MtpDocumentsProvider/tests/Android.mk b/packages/MtpDocumentsProvider/tests/Android.mk index 148cd0d930ab..25b585fd3262 100644 --- a/packages/MtpDocumentsProvider/tests/Android.mk +++ b/packages/MtpDocumentsProvider/tests/Android.mk @@ -6,6 +6,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := MtpDocumentsProviderTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := MtpDocumentsProvider LOCAL_CERTIFICATE := media LOCAL_COMPATIBILITY_SUITE := device-tests diff --git a/packages/Osu/Android.mk b/packages/Osu/Android.mk index 1d45aa9bfe66..63c7578b0163 100644 --- a/packages/Osu/Android.mk +++ b/packages/Osu/Android.mk @@ -14,6 +14,7 @@ LOCAL_SRC_FILES += \ LOCAL_JAVA_LIBRARIES := telephony-common ims-common bouncycastle conscrypt LOCAL_PACKAGE_NAME := Osu +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/Osu2/Android.mk b/packages/Osu2/Android.mk index 05586f014ce7..063ac7ec00f4 100644 --- a/packages/Osu2/Android.mk +++ b/packages/Osu2/Android.mk @@ -9,6 +9,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := Osu2 +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/Osu2/tests/Android.mk b/packages/Osu2/tests/Android.mk index 4b6e0e60652b..8d5a39956bee 100644 --- a/packages/Osu2/tests/Android.mk +++ b/packages/Osu2/tests/Android.mk @@ -25,6 +25,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_JACK_FLAGS := --multi-dex native LOCAL_PACKAGE_NAME := OsuTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_INSTRUMENTATION_FOR := Osu2 diff --git a/packages/PrintRecommendationService/Android.mk b/packages/PrintRecommendationService/Android.mk index 66cb0573aef0..fa1eb0db73ac 100644 --- a/packages/PrintRecommendationService/Android.mk +++ b/packages/PrintRecommendationService/Android.mk @@ -22,8 +22,8 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := PrintRecommendationService -include $(BUILD_PACKAGE) +LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_SDK_VERSION := system_current +include $(BUILD_PACKAGE) include $(call all-makefiles-under, $(LOCAL_PATH)) diff --git a/packages/PrintSpooler/Android.mk b/packages/PrintSpooler/Android.mk index 19e44e36447d..67ef6b4851c6 100644 --- a/packages/PrintSpooler/Android.mk +++ b/packages/PrintSpooler/Android.mk @@ -26,6 +26,7 @@ LOCAL_SRC_FILES += \ src/com/android/printspooler/renderer/IPdfEditor.aidl LOCAL_PACKAGE_NAME := PrintSpooler +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JNI_SHARED_LIBRARIES := libprintspooler_jni LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v7-recyclerview diff --git a/packages/PrintSpooler/tests/outofprocess/Android.mk b/packages/PrintSpooler/tests/outofprocess/Android.mk index 3c02453c78a1..56afd8993788 100644 --- a/packages/PrintSpooler/tests/outofprocess/Android.mk +++ b/packages/PrintSpooler/tests/outofprocess/Android.mk @@ -24,6 +24,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 LOCAL_PACKAGE_NAME := PrintSpoolerOutOfProcessTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests include $(BUILD_PACKAGE) diff --git a/packages/SettingsProvider/Android.mk b/packages/SettingsProvider/Android.mk index 069e83a8d2d6..74ce9196c043 100644 --- a/packages/SettingsProvider/Android.mk +++ b/packages/SettingsProvider/Android.mk @@ -10,6 +10,7 @@ LOCAL_JAVA_LIBRARIES := telephony-common ims-common LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := SettingsProvider +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/SettingsProvider/test/Android.mk b/packages/SettingsProvider/test/Android.mk index a9707d4ae69b..091ba90efd73 100644 --- a/packages/SettingsProvider/test/Android.mk +++ b/packages/SettingsProvider/test/Android.mk @@ -15,6 +15,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-support-test LOCAL_JAVA_LIBRARIES := legacy-android-test LOCAL_PACKAGE_NAME := SettingsProviderTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/packages/SharedStorageBackup/Android.mk b/packages/SharedStorageBackup/Android.mk index a213965f085b..2e07ab18d71a 100644 --- a/packages/SharedStorageBackup/Android.mk +++ b/packages/SharedStorageBackup/Android.mk @@ -24,6 +24,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PACKAGE_NAME := SharedStorageBackup +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/Shell/Android.mk b/packages/Shell/Android.mk index 935d09b20fe6..5713dc679341 100644 --- a/packages/Shell/Android.mk +++ b/packages/Shell/Android.mk @@ -15,6 +15,7 @@ LOCAL_AIDL_INCLUDES = frameworks/native/cmds/dumpstate/binder LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_PACKAGE_NAME := Shell +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/Shell/tests/Android.mk b/packages/Shell/tests/Android.mk index 48b757c30cd1..cf60fb4b7daf 100644 --- a/packages/Shell/tests/Android.mk +++ b/packages/Shell/tests/Android.mk @@ -16,6 +16,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ legacy-android-test \ LOCAL_PACKAGE_NAME := ShellTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_INSTRUMENTATION_FOR := Shell diff --git a/packages/StatementService/Android.mk b/packages/StatementService/Android.mk index 470d824a1868..b9b29e752193 100644 --- a/packages/StatementService/Android.mk +++ b/packages/StatementService/Android.mk @@ -22,6 +22,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PACKAGE_NAME := StatementService +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PRIVILEGED_MODULE := true LOCAL_JAVA_LIBRARIES += org.apache.http.legacy diff --git a/packages/VpnDialogs/Android.mk b/packages/VpnDialogs/Android.mk index 4c80a26d186c..850764645644 100644 --- a/packages/VpnDialogs/Android.mk +++ b/packages/VpnDialogs/Android.mk @@ -27,5 +27,6 @@ LOCAL_PRIVILEGED_MODULE := true LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := VpnDialogs +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/packages/WAPPushManager/Android.mk b/packages/WAPPushManager/Android.mk index 60f093f7ac41..91526dd19ce0 100644 --- a/packages/WAPPushManager/Android.mk +++ b/packages/WAPPushManager/Android.mk @@ -9,6 +9,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := WAPPushManager +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JAVA_LIBRARIES += telephony-common LOCAL_STATIC_JAVA_LIBRARIES += android-common diff --git a/packages/WAPPushManager/tests/Android.mk b/packages/WAPPushManager/tests/Android.mk index 1dea798e83b2..8ad0018b780e 100644 --- a/packages/WAPPushManager/tests/Android.mk +++ b/packages/WAPPushManager/tests/Android.mk @@ -32,6 +32,7 @@ LOCAL_SRC_FILES += \ # automatically get all of its classes loaded into our environment. LOCAL_PACKAGE_NAME := WAPPushManagerTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := WAPPushManager diff --git a/packages/WallpaperBackup/Android.mk b/packages/WallpaperBackup/Android.mk index cf0424966c10..a6426a6ce217 100644 --- a/packages/WallpaperBackup/Android.mk +++ b/packages/WallpaperBackup/Android.mk @@ -24,6 +24,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PROGUARD_FLAG_FILES := proguard.flags LOCAL_PACKAGE_NAME := WallpaperBackup +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := false diff --git a/packages/WallpaperCropper/Android.mk b/packages/WallpaperCropper/Android.mk index 0254673be593..e0a0ef415cb4 100644 --- a/packages/WallpaperCropper/Android.mk +++ b/packages/WallpaperCropper/Android.mk @@ -8,6 +8,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := telephony-common LOCAL_PACKAGE_NAME := WallpaperCropper +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/packages/overlays/SysuiDarkThemeOverlay/Android.mk b/packages/overlays/SysuiDarkThemeOverlay/Android.mk index 4b83058ab481..7b277bcf0351 100644 --- a/packages/overlays/SysuiDarkThemeOverlay/Android.mk +++ b/packages/overlays/SysuiDarkThemeOverlay/Android.mk @@ -9,5 +9,6 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := SysuiDarkThemeOverlay +LOCAL_SDK_VERSION := current include $(BUILD_RRO_PACKAGE) diff --git a/packages/services/PacProcessor/Android.mk b/packages/services/PacProcessor/Android.mk index 3c4e951f9e73..5be90c0bf3d5 100644 --- a/packages/services/PacProcessor/Android.mk +++ b/packages/services/PacProcessor/Android.mk @@ -23,6 +23,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := PacProcessor +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor diff --git a/packages/services/Proxy/Android.mk b/packages/services/Proxy/Android.mk index d5546b27bf44..ce1715f08be5 100644 --- a/packages/services/Proxy/Android.mk +++ b/packages/services/Proxy/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ProxyHandler +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true diff --git a/sax/tests/saxtests/Android.mk b/sax/tests/saxtests/Android.mk index d3fbd0569e78..f02949893e00 100644 --- a/sax/tests/saxtests/Android.mk +++ b/sax/tests/saxtests/Android.mk @@ -10,6 +10,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := FrameworksSaxTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index af55807ff1f0..93df50747723 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -342,7 +342,8 @@ final class RemoteFillService implements DeathRecipient { @Override public void onServiceConnected(ComponentName name, IBinder service) { if (mDestroyed || !mBinding) { - mContext.unbindService(mServiceConnection); + // This is abnormal. Unbinding the connection has been requested already. + Slog.wtf(LOG_TAG, "onServiceConnected was dispatched after unbindService."); return; } mBinding = false; diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index fd2ef18d624a..3021e6a539f7 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -17,6 +17,7 @@ package com.android.server; import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.NETID_UNSET; import static android.net.ConnectivityManager.TYPE_ETHERNET; @@ -1329,9 +1330,8 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) { synchronized (nai) { if (nai.networkCapabilities != null) { - // TODO : don't remove the UIDs when communicating with processes - // that have the NETWORK_SETTINGS permission. - return networkCapabilitiesWithoutUids(nai.networkCapabilities); + return networkCapabilitiesWithoutUidsUnlessAllowed(nai.networkCapabilities, + Binder.getCallingPid(), Binder.getCallingUid()); } } } @@ -1344,10 +1344,18 @@ public class ConnectivityService extends IConnectivityManager.Stub return getNetworkCapabilitiesInternal(getNetworkAgentInfoForNetwork(network)); } - private NetworkCapabilities networkCapabilitiesWithoutUids(NetworkCapabilities nc) { + private NetworkCapabilities networkCapabilitiesWithoutUidsUnlessAllowed( + NetworkCapabilities nc, int callerPid, int callerUid) { + if (checkSettingsPermission(callerPid, callerUid)) return new NetworkCapabilities(nc); return new NetworkCapabilities(nc).setUids(null); } + private void restrictRequestUidsForCaller(NetworkCapabilities nc) { + if (!checkSettingsPermission()) { + nc.setSingleUid(Binder.getCallingUid()); + } + } + @Override public NetworkState[] getAllNetworkState() { // Require internal since we're handing out IMSI details @@ -1546,6 +1554,16 @@ public class ConnectivityService extends IConnectivityManager.Stub "ConnectivityService"); } + private boolean checkSettingsPermission() { + return PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( + android.Manifest.permission.NETWORK_SETTINGS); + } + + private boolean checkSettingsPermission(int pid, int uid) { + return PERMISSION_GRANTED == mContext.checkPermission( + android.Manifest.permission.NETWORK_SETTINGS, pid, uid); + } + private void enforceTetherAccessPermission() { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_NETWORK_STATE, @@ -4213,13 +4231,12 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceMeteredApnPolicy(networkCapabilities); } ensureRequestableCapabilities(networkCapabilities); - // Set the UID range for this request to the single UID of the requester. + // Set the UID range for this request to the single UID of the requester, or to an empty + // set of UIDs if the caller has the appropriate permission and UIDs have not been set. // This will overwrite any allowed UIDs in the requested capabilities. Though there // are no visible methods to set the UIDs, an app could use reflection to try and get // networks for other apps so it's essential that the UIDs are overwritten. - // TODO : don't forcefully set the UID when communicating with processes - // that have the NETWORK_SETTINGS permission. - networkCapabilities.setSingleUid(Binder.getCallingUid()); + restrictRequestUidsForCaller(networkCapabilities); if (timeoutMs < 0) { throw new IllegalArgumentException("Bad timeout specified"); @@ -4293,9 +4310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceMeteredApnPolicy(networkCapabilities); ensureRequestableCapabilities(networkCapabilities); ensureValidNetworkSpecifier(networkCapabilities); - // TODO : don't forcefully set the UID when communicating with processes - // that have the NETWORK_SETTINGS permission. - networkCapabilities.setSingleUid(Binder.getCallingUid()); + restrictRequestUidsForCaller(networkCapabilities); NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.REQUEST); @@ -4349,9 +4364,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); - // TODO : don't forcefully set the UIDs when communicating with processes - // that have the NETWORK_SETTINGS permission. - nc.setSingleUid(Binder.getCallingUid()); + restrictRequestUidsForCaller(nc); if (!ConnectivityManager.checkChangePermission(mContext)) { // Apps without the CHANGE_NETWORK_STATE permission can't use background networks, so // make all their listens include NET_CAPABILITY_FOREGROUND. That way, they will get @@ -4381,9 +4394,7 @@ public class ConnectivityService extends IConnectivityManager.Stub ensureValidNetworkSpecifier(networkCapabilities); final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); - // TODO : don't forcefully set the UIDs when communicating with processes - // that have the NETWORK_SETTINGS permission. - nc.setSingleUid(Binder.getCallingUid()); + restrictRequestUidsForCaller(nc); NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest.Type.LISTEN); @@ -4947,8 +4958,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } case ConnectivityManager.CALLBACK_CAP_CHANGED: { // networkAgent can't be null as it has been accessed a few lines above. - final NetworkCapabilities nc = - networkCapabilitiesWithoutUids(networkAgent.networkCapabilities); + final NetworkCapabilities nc = networkCapabilitiesWithoutUidsUnlessAllowed( + networkAgent.networkCapabilities, nri.mPid, nri.mUid); putParcelable(bundle, nc); break; } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 8b5176e2c858..e202618df575 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -37,6 +37,7 @@ import android.telephony.CellLocation; import android.telephony.DisconnectCause; import android.telephony.LocationAccessPolicy; import android.telephony.PhoneStateListener; +import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; import android.telephony.PreciseDisconnectCause; @@ -179,6 +180,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private ArrayList<List<CellInfo>> mCellInfo = null; + private ArrayList<List<PhysicalChannelConfig>> mPhysicalChannelConfigs; + private VoLteServiceState mVoLteServiceState = new VoLteServiceState(); private int mDefaultSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; @@ -335,6 +338,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mDataConnectionLinkProperties = new LinkProperties[numPhones]; mDataConnectionNetworkCapabilities = new NetworkCapabilities[numPhones]; mCellInfo = new ArrayList<List<CellInfo>>(); + mPhysicalChannelConfigs = new ArrayList<List<PhysicalChannelConfig>>(); for (int i = 0; i < numPhones; i++) { mCallState[i] = TelephonyManager.CALL_STATE_IDLE; mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE; @@ -349,6 +353,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCallForwarding[i] = false; mCellLocation[i] = new Bundle(); mCellInfo.add(i, null); + mPhysicalChannelConfigs.add(i, null); mConnectedApns[i] = new ArrayList<String>(); } @@ -659,6 +664,14 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if ((events & PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) != 0) { + try { + r.callback.onPhysicalChannelConfigurationChanged( + mPhysicalChannelConfigs.get(phoneId)); + } catch (RemoteException ex) { + remove(r.binder); + } + } } } } else { @@ -1020,6 +1033,45 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyPhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) { + notifyPhysicalChannelConfigurationForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, + configs); + } + + public void notifyPhysicalChannelConfigurationForSubscriber(int subId, + List<PhysicalChannelConfig> configs) { + if (!checkNotifyPermission("notifyPhysicalChannelConfiguration()")) { + return; + } + + if (VDBG) { + log("notifyPhysicalChannelConfiguration: subId=" + subId + " configs=" + configs); + } + + synchronized (mRecords) { + int phoneId = SubscriptionManager.getPhoneId(subId); + if (validatePhoneId(phoneId)) { + mPhysicalChannelConfigs.set(phoneId, configs); + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) + && idMatch(r.subId, subId, phoneId)) { + try { + if (DBG_LOC) { + log("notifyPhysicalChannelConfiguration: mPhysicalChannelConfigs=" + + configs + " r=" + r); + } + r.callback.onPhysicalChannelConfigurationChanged(configs); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + } + handleRemoveListLocked(); + } + } + @Override public void notifyMessageWaitingChangedForPhoneId(int phoneId, int subId, boolean mwi) { if (!checkNotifyPermission("notifyMessageWaitingChanged()")) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 503dfe9a41cb..cb96bacac914 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1494,17 +1494,6 @@ public class AudioService extends IAudioService.Stub if (adjustVolume && (direction != AudioManager.ADJUST_SAME)) { mAudioHandler.removeMessages(MSG_UNMUTE_STREAM); - // Check if volume update should be send to AVRCP - if (streamTypeAlias == AudioSystem.STREAM_MUSIC && - (device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && - (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { - synchronized (mA2dpAvrcpLock) { - if (mA2dp != null && mAvrcpAbsVolSupported) { - mA2dp.adjustAvrcpAbsoluteVolume(direction); - } - } - } - if (isMuteAdjust) { boolean state; if (direction == AudioManager.ADJUST_TOGGLE_MUTE) { @@ -1553,8 +1542,20 @@ public class AudioService extends IAudioService.Stub 0); } - // Check if volume update should be sent to Hdmi system audio. int newIndex = mStreamStates[streamType].getIndex(device); + + // Check if volume update should be send to AVRCP + if (streamTypeAlias == AudioSystem.STREAM_MUSIC && + (device & AudioSystem.DEVICE_OUT_ALL_A2DP) != 0 && + (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { + synchronized (mA2dpAvrcpLock) { + if (mA2dp != null && mAvrcpAbsVolSupported) { + mA2dp.setAvrcpAbsoluteVolume(newIndex / 10); + } + } + } + + // Check if volume update should be sent to Hdmi system audio. if (streamTypeAlias == AudioSystem.STREAM_MUSIC) { setSystemAudioVolume(oldIndex, newIndex, getStreamMaxVolume(streamType), flags); } diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 1767a21f576b..cffa8346859c 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -71,6 +71,9 @@ import android.os.PersistableBundle; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.UserHandle; +import android.os.UserManager; +import android.os.UserManagerInternal; +import android.os.UserManagerInternal.UserRestrictionsListener; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.text.TextUtils; @@ -87,6 +90,7 @@ import com.android.internal.util.MessageUtils; import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.server.LocalServices; import com.android.server.connectivity.tethering.IControlsTethering; import com.android.server.connectivity.tethering.IPv6TetheringCoordinator; import com.android.server.connectivity.tethering.OffloadController; @@ -246,6 +250,13 @@ public class Tethering extends BaseNetworkObserver { filter.addDataScheme("file"); mContext.registerReceiver(mStateReceiver, filter, null, smHandler); + UserManagerInternal userManager = LocalServices.getService(UserManagerInternal.class); + + // this check is useful only for some unit tests; example: ConnectivityServiceTest + if (userManager != null) { + userManager.addUserRestrictionsListener(new TetheringUserRestrictionListener(this)); + } + // load device config info updateConfiguration(); } @@ -733,6 +744,11 @@ public class Tethering extends BaseNetworkObserver { } private void showTetheredNotification(int id) { + showTetheredNotification(id, true); + } + + @VisibleForTesting + protected void showTetheredNotification(int id, boolean tetheringOn) { NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); if (notificationManager == null) { @@ -769,9 +785,16 @@ public class Tethering extends BaseNetworkObserver { null, UserHandle.CURRENT); Resources r = Resources.getSystem(); - CharSequence title = r.getText(com.android.internal.R.string.tethered_notification_title); - CharSequence message = r.getText(com.android.internal.R.string. - tethered_notification_message); + final CharSequence title; + final CharSequence message; + + if (tetheringOn) { + title = r.getText(com.android.internal.R.string.tethered_notification_title); + message = r.getText(com.android.internal.R.string.tethered_notification_message); + } else { + title = r.getText(com.android.internal.R.string.disable_tether_notification_title); + message = r.getText(com.android.internal.R.string.disable_tether_notification_message); + } if (mTetheredNotificationBuilder == null) { mTetheredNotificationBuilder = @@ -793,7 +816,8 @@ public class Tethering extends BaseNetworkObserver { mTetheredNotificationBuilder.buildInto(new Notification()), UserHandle.ALL); } - private void clearTetheredNotification() { + @VisibleForTesting + protected void clearTetheredNotification() { NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); if (notificationManager != null && mLastNotificationId != 0) { @@ -896,6 +920,38 @@ public class Tethering extends BaseNetworkObserver { } } + @VisibleForTesting + protected static class TetheringUserRestrictionListener implements UserRestrictionsListener { + private final Tethering mWrapper; + + public TetheringUserRestrictionListener(Tethering wrapper) { + mWrapper = wrapper; + } + + public void onUserRestrictionsChanged(int userId, + Bundle newRestrictions, + Bundle prevRestrictions) { + final boolean newlyDisallowed = + newRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING); + final boolean previouslyDisallowed = + prevRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING); + final boolean tetheringDisallowedChanged = (newlyDisallowed != previouslyDisallowed); + + if (!tetheringDisallowedChanged) { + return; + } + + mWrapper.clearTetheredNotification(); + final boolean isTetheringActiveOnDevice = (mWrapper.getTetheredIfaces().length != 0); + + if (newlyDisallowed && isTetheringActiveOnDevice) { + mWrapper.showTetheredNotification( + com.android.internal.R.drawable.stat_sys_tether_general, false); + mWrapper.untetherAll(); + } + } + } + private void disableWifiIpServingLocked(String ifname, int apState) { mLog.log("Canceling WiFi tethering request - AP_STATE=" + apState); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index bb46d5e23696..c9bdcf1a73b5 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -57,6 +57,7 @@ import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; +import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.UidRange; import android.net.Uri; @@ -105,6 +106,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -113,6 +115,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.SortedSet; @@ -131,6 +134,24 @@ public class Vpn { // the device idle whitelist during service launch and VPN bootstrap. private static final long VPN_LAUNCH_IDLE_WHITELIST_DURATION_MS = 60 * 1000; + // Settings for how much of the address space should be routed so that Vpn considers + // "most" of the address space is routed. This is used to determine whether this Vpn + // should be marked with the INTERNET capability. + private static final long MOST_IPV4_ADDRESSES_COUNT; + private static final BigInteger MOST_IPV6_ADDRESSES_COUNT; + static { + // 85% of the address space must be routed for Vpn to consider this VPN to provide + // INTERNET access. + final int howManyPercentIsMost = 85; + + final long twoPower32 = 1L << 32; + MOST_IPV4_ADDRESSES_COUNT = twoPower32 * howManyPercentIsMost / 100; + final BigInteger twoPower128 = BigInteger.ONE.shiftLeft(128); + MOST_IPV6_ADDRESSES_COUNT = twoPower128 + .multiply(BigInteger.valueOf(howManyPercentIsMost)) + .divide(BigInteger.valueOf(100)); + } + // TODO: create separate trackers for each unique VPN to support // automated reconnection @@ -830,10 +851,39 @@ public class Vpn { return lp; } + /** + * Analyzes the passed LinkedProperties to figure out whether it routes to most of the IP space. + * + * This returns true if the passed LinkedProperties contains routes to either most of the IPv4 + * space or to most of the IPv6 address space, where "most" is defined by the value of the + * MOST_IPV{4,6}_ADDRESSES_COUNT constants : if more than this number of addresses are matched + * by any of the routes, then it's decided that most of the space is routed. + * @hide + */ + @VisibleForTesting + static boolean providesRoutesToMostDestinations(LinkProperties lp) { + final Comparator<IpPrefix> prefixLengthComparator = IpPrefix.lengthComparator(); + TreeSet<IpPrefix> ipv4Prefixes = new TreeSet<>(prefixLengthComparator); + TreeSet<IpPrefix> ipv6Prefixes = new TreeSet<>(prefixLengthComparator); + for (final RouteInfo route : lp.getAllRoutes()) { + IpPrefix destination = route.getDestination(); + if (destination.isIPv4()) { + ipv4Prefixes.add(destination); + } else { + ipv6Prefixes.add(destination); + } + } + if (NetworkUtils.routedIPv4AddressCount(ipv4Prefixes) > MOST_IPV4_ADDRESSES_COUNT) { + return true; + } + return NetworkUtils.routedIPv6AddressCount(ipv6Prefixes) + .compareTo(MOST_IPV6_ADDRESSES_COUNT) >= 0; + } + private void agentConnect() { LinkProperties lp = makeLinkProperties(); - if (lp.hasIPv4DefaultRoute() || lp.hasIPv6DefaultRoute()) { + if (providesRoutesToMostDestinations(lp)) { mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } else { mNetworkCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index 423201a5251f..3814ef348c87 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -144,6 +144,12 @@ public class BackgroundDexOptService extends JobService { Intent intent = registerReceiver(null, filter); int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + boolean present = intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true); + + if (!present) { + // No battery, treat as if 100%, no possibility of draining battery. + return 100; + } if (level < 0 || scale <= 0) { // Battery data unavailable. This should never happen, so assume the worst. diff --git a/services/tests/notification/Android.mk b/services/tests/notification/Android.mk index 597a5849a1a0..1ccb872e65bd 100644 --- a/services/tests/notification/Android.mk +++ b/services/tests/notification/Android.mk @@ -31,6 +31,7 @@ LOCAL_JACK_FLAGS := --multi-dex native LOCAL_DX_FLAGS := --multi-dex LOCAL_PACKAGE_NAME := FrameworksNotificationTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_CERTIFICATE := platform diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index 19396d43e15e..9af0978c1497 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -35,6 +35,7 @@ LOCAL_SRC_FILES += aidl/com/android/servicestests/aidl/INetworkStateObserver.aid LOCAL_JAVA_LIBRARIES := android.test.mock legacy-android-test LOCAL_PACKAGE_NAME := FrameworksServicesTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_CERTIFICATE := platform diff --git a/services/tests/servicestests/test-apps/ConnTestApp/Android.mk b/services/tests/servicestests/test-apps/ConnTestApp/Android.mk index fbfa28a9e93b..18b8c2d63313 100644 --- a/services/tests/servicestests/test-apps/ConnTestApp/Android.mk +++ b/services/tests/servicestests/test-apps/ConnTestApp/Android.mk @@ -24,6 +24,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := servicestests-aidl LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := ConnTestApp +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_DEX_PREOPT := false LOCAL_PROGUARD_ENABLED := disabled diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 63763c9915a8..abd1fd4b2bde 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1804,7 +1804,14 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_CONFIG_APPLIED_BOOL = "carrier_config_applied_bool"; /** - * List of thresholds of RSRP for determining the display level of LTE signal bar. + * A list of 4 LTE RSRP thresholds above which a signal level is considered POOR, + * MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting. + * + * Note that the min and max thresholds are fixed at -140 and -44, as explained in + * TS 36.133 9.1.4 - RSRP Measurement Report Mapping. + * <p> + * See SignalStrength#MAX_LTE_RSRP and SignalStrength#MIN_LTE_RSRP. Any signal level outside + * these boundaries is considered invalid. * @hide */ public static final String KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY = @@ -2122,12 +2129,10 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false); sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, new int[] { - -140, /* SIGNAL_STRENGTH_NONE_OR_UNKNOWN */ -128, /* SIGNAL_STRENGTH_POOR */ -118, /* SIGNAL_STRENGTH_MODERATE */ -108, /* SIGNAL_STRENGTH_GOOD */ -98, /* SIGNAL_STRENGTH_GREAT */ - -44 }); } diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java index f948f812676f..d35eb60916f3 100644 --- a/telephony/java/android/telephony/CellIdentityGsm.java +++ b/telephony/java/android/telephony/CellIdentityGsm.java @@ -120,7 +120,7 @@ public final class CellIdentityGsm extends CellIdentity { /** * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMccStr} instead. + * @deprecated Use {@link #getMccString} instead. */ @Deprecated public int getMcc() { @@ -129,7 +129,7 @@ public final class CellIdentityGsm extends CellIdentity { /** * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMncStr} instead. + * @deprecated Use {@link #getMncString} instead. */ @Deprecated public int getMnc() { @@ -176,14 +176,14 @@ public final class CellIdentityGsm extends CellIdentity { /** * @return Mobile Country Code in string format, null if unknown */ - public String getMccStr() { + public String getMccString() { return mMccStr; } /** * @return Mobile Network Code in string format, null if unknown */ - public String getMncStr() { + public String getMncString() { return mMncStr; } diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java index 5f1f4489e74e..2b8eb5f3cca6 100644 --- a/telephony/java/android/telephony/CellIdentityLte.java +++ b/telephony/java/android/telephony/CellIdentityLte.java @@ -125,7 +125,7 @@ public final class CellIdentityLte extends CellIdentity { /** * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMccStr} instead. + * @deprecated Use {@link #getMccString} instead. */ @Deprecated public int getMcc() { @@ -134,7 +134,7 @@ public final class CellIdentityLte extends CellIdentity { /** * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMncStr} instead. + * @deprecated Use {@link #getMncString} instead. */ @Deprecated public int getMnc() { @@ -179,14 +179,14 @@ public final class CellIdentityLte extends CellIdentity { /** * @return Mobile Country Code in string format, null if unknown */ - public String getMccStr() { + public String getMccString() { return mMccStr; } /** * @return Mobile Network Code in string format, null if unknown */ - public String getMncStr() { + public String getMncString() { return mMncStr; } diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java index 001d19f777fd..992545d62408 100644 --- a/telephony/java/android/telephony/CellIdentityTdscdma.java +++ b/telephony/java/android/telephony/CellIdentityTdscdma.java @@ -86,7 +86,7 @@ public final class CellIdentityTdscdma extends CellIdentity { * Get Mobile Country Code in string format * @return Mobile Country Code in string format, null if unknown */ - public String getMccStr() { + public String getMccString() { return mMccStr; } @@ -94,7 +94,7 @@ public final class CellIdentityTdscdma extends CellIdentity { * Get Mobile Network Code in string format * @return Mobile Network Code in string format, null if unknown */ - public String getMncStr() { + public String getMncString() { return mMncStr; } diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java index 1aa1715ee3e8..a5fd7dd97941 100644 --- a/telephony/java/android/telephony/CellIdentityWcdma.java +++ b/telephony/java/android/telephony/CellIdentityWcdma.java @@ -118,7 +118,7 @@ public final class CellIdentityWcdma extends CellIdentity { /** * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMccStr} instead. + * @deprecated Use {@link #getMccString} instead. */ @Deprecated public int getMcc() { @@ -127,7 +127,7 @@ public final class CellIdentityWcdma extends CellIdentity { /** * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown - * @deprecated Use {@link #getMncStr} instead. + * @deprecated Use {@link #getMncString} instead. */ @Deprecated public int getMnc() { @@ -160,14 +160,14 @@ public final class CellIdentityWcdma extends CellIdentity { /** * @return Mobile Country Code in string version, null if unknown */ - public String getMccStr() { + public String getMccString() { return mMccStr; } /** * @return Mobile Network Code in string version, null if unknown */ - public String getMncStr() { + public String getMncString() { return mMncStr; } diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java index b362df9ff677..26ffe3216bdc 100644 --- a/telephony/java/android/telephony/LocationAccessPolicy.java +++ b/telephony/java/android/telephony/LocationAccessPolicy.java @@ -82,8 +82,7 @@ public final class LocationAccessPolicy { .noteOpNoThrow(opCode, uid, pkgName) != AppOpsManager.MODE_ALLOWED) { return false; } - if (!isLocationModeEnabled(context, UserHandle.getUserId(uid)) - && !isLegacyForeground(context, pkgName, uid)) { + if (!isLocationModeEnabled(context, UserHandle.getUserId(uid))) { return false; } // If the user or profile is current, permission is granted. @@ -101,35 +100,6 @@ public final class LocationAccessPolicy { && locationMode != Settings.Secure.LOCATION_MODE_SENSORS_ONLY; } - private static boolean isLegacyForeground(@NonNull Context context, @NonNull String pkgName, - int uid) { - long token = Binder.clearCallingIdentity(); - try { - return isLegacyVersion(context, pkgName) && isForegroundApp(context, uid); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - private static boolean isLegacyVersion(@NonNull Context context, @NonNull String pkgName) { - try { - if (context.getPackageManager().getApplicationInfo(pkgName, 0) - .targetSdkVersion <= Build.VERSION_CODES.O) { - return true; - } - } catch (PackageManager.NameNotFoundException e) { - // In case of exception, assume known app (more strict checking) - // Note: This case will never happen since checkPackage is - // called to verify validity before checking app's version. - } - return false; - } - - private static boolean isForegroundApp(@NonNull Context context, int uid) { - final ActivityManager am = context.getSystemService(ActivityManager.class); - return am.getUidImportance(uid) <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE; - } - private static boolean checkInteractAcrossUsersFull(@NonNull Context context) { return context.checkCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 0ee870aaa24b..0446925f8cb4 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -372,7 +372,7 @@ public class PhoneStateListener { break; case LISTEN_PHYSICAL_CHANNEL_CONFIGURATION: PhoneStateListener.this.onPhysicalChannelConfigurationChanged( - (List<PhysicalChannelConfig>)msg.obj); + (List<PhysicalChannelConfig>)msg.obj); break; } } @@ -700,6 +700,10 @@ public class PhoneStateListener { public void onCarrierNetworkChange(boolean active) { send(LISTEN_CARRIER_NETWORK_CHANGE, 0, 0, active); } + + public void onPhysicalChannelConfigurationChanged(List<PhysicalChannelConfig> configs) { + send(LISTEN_PHYSICAL_CHANNEL_CONFIGURATION, 0, 0, configs); + } } IPhoneStateListener callback = new IPhoneStateListenerStub(this); diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java index 651d68d833dc..ce444dd00ce4 100644 --- a/telephony/java/android/telephony/PhysicalChannelConfig.java +++ b/telephony/java/android/telephony/PhysicalChannelConfig.java @@ -27,8 +27,9 @@ import java.lang.annotation.RetentionPolicy; */ public final class PhysicalChannelConfig implements Parcelable { + // TODO(b/72993578) consolidate these enums in a central location. @Retention(RetentionPolicy.SOURCE) - @IntDef({CONNECTION_PRIMARY_SERVING, CONNECTION_SECONDARY_SERVING}) + @IntDef({CONNECTION_PRIMARY_SERVING, CONNECTION_SECONDARY_SERVING, CONNECTION_UNKNOWN}) public @interface ConnectionStatus {} /** @@ -41,6 +42,9 @@ public final class PhysicalChannelConfig implements Parcelable { */ public static final int CONNECTION_SECONDARY_SERVING = 2; + /** Connection status is unknown. */ + public static final int CONNECTION_UNKNOWN = Integer.MAX_VALUE; + /** * Connection status of the cell. * @@ -86,6 +90,7 @@ public final class PhysicalChannelConfig implements Parcelable { * * @see #CONNECTION_PRIMARY_SERVING * @see #CONNECTION_SECONDARY_SERVING + * @see #CONNECTION_UNKNOWN * * @return Connection status of the cell */ diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java index fc2ef2782b78..e508b19302f9 100644 --- a/telephony/java/android/telephony/SignalStrength.java +++ b/telephony/java/android/telephony/SignalStrength.java @@ -57,7 +57,9 @@ public class SignalStrength implements Parcelable { */ public static final int INVALID = Integer.MAX_VALUE; - private static final int LTE_RSRP_THRESHOLDS_NUM = 6; + private static final int LTE_RSRP_THRESHOLDS_NUM = 4; + private static final int MAX_LTE_RSRP = -44; + private static final int MIN_LTE_RSRP = -140; /** Parameters reported by the Radio */ private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 @@ -81,7 +83,8 @@ public class SignalStrength implements Parcelable { // onSignalStrengthResult. private boolean mUseOnlyRsrpForLteLevel; // Use only RSRP for the number of LTE signal bar. - // The threshold of LTE RSRP for determining the display level of LTE signal bar. + // The threshold of LTE RSRP for determining the display level of LTE signal bar. Note that the + // min and max are fixed at MIN_LTE_RSRP (-140) and MAX_LTE_RSRP (-44). private int mLteRsrpThresholds[] = new int[LTE_RSRP_THRESHOLDS_NUM]; /** @@ -319,7 +322,8 @@ public class SignalStrength implements Parcelable { // TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC mLteSignalStrength = (mLteSignalStrength >= 0) ? mLteSignalStrength : 99; - mLteRsrp = ((mLteRsrp >= 44) && (mLteRsrp <= 140)) ? -mLteRsrp : SignalStrength.INVALID; + mLteRsrp = ((-mLteRsrp >= MIN_LTE_RSRP) && (-mLteRsrp <= MAX_LTE_RSRP)) ? -mLteRsrp + : SignalStrength.INVALID; mLteRsrq = ((mLteRsrq >= 3) && (mLteRsrq <= 20)) ? -mLteRsrq : SignalStrength.INVALID; mLteRssnr = ((mLteRssnr >= -200) && (mLteRssnr <= 300)) ? mLteRssnr : SignalStrength.INVALID; @@ -735,24 +739,29 @@ public class SignalStrength implements Parcelable { */ public int getLteLevel() { /* - * TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received - * signal + noise RSRP = reference signal dBm RSRQ = quality of signal - * dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio - * = -10log P1/P2 dB + * TS 36.214 Physical Layer Section 5.1.3 + * TS 36.331 RRC + * + * RSSI = received signal + noise + * RSRP = reference signal dBm + * RSRQ = quality of signal dB = Number of Resource blocks*RSRP/RSSI + * SNR = gain = signal/noise ratio = -10log P1/P2 dB */ int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, rsrpIconLevel = -1, snrIconLevel = -1; - if (mLteRsrp > mLteRsrpThresholds[5]) { - rsrpIconLevel = -1; - } else if (mLteRsrp >= (mLteRsrpThresholds[4] - mLteRsrpBoost)) { - rsrpIconLevel = SIGNAL_STRENGTH_GREAT; + if (mLteRsrp > MAX_LTE_RSRP || mLteRsrp < MIN_LTE_RSRP) { + if (mLteRsrp != INVALID) { + Log.wtf(LOG_TAG, "getLteLevel - invalid lte rsrp: mLteRsrp=" + mLteRsrp); + } } else if (mLteRsrp >= (mLteRsrpThresholds[3] - mLteRsrpBoost)) { - rsrpIconLevel = SIGNAL_STRENGTH_GOOD; + rsrpIconLevel = SIGNAL_STRENGTH_GREAT; } else if (mLteRsrp >= (mLteRsrpThresholds[2] - mLteRsrpBoost)) { - rsrpIconLevel = SIGNAL_STRENGTH_MODERATE; + rsrpIconLevel = SIGNAL_STRENGTH_GOOD; } else if (mLteRsrp >= (mLteRsrpThresholds[1] - mLteRsrpBoost)) { + rsrpIconLevel = SIGNAL_STRENGTH_MODERATE; + } else if (mLteRsrp >= (mLteRsrpThresholds[0] - mLteRsrpBoost)) { rsrpIconLevel = SIGNAL_STRENGTH_POOR; - } else if (mLteRsrp >= mLteRsrpThresholds[0]) { + } else { rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 9a45e7b9cc36..b44f830c45fe 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -391,6 +391,112 @@ public final class SmsManager { } /** + * Send a text based SMS with messaging options. + * + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param text the body of the message to send + * @param sentIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is successfully sent, or failed. + * The result code will be <code>Activity.RESULT_OK</code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is delivered to the recipient. The + * raw pdu of the status report is in the extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending messages through same link or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + * + * @throws IllegalArgumentException if destinationAddress or text are empty + * {@hide} + */ + public void sendTextMessage( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, + int priority, boolean expectMore, int validityPeriod) { + sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, + true /* persistMessage*/, priority, expectMore, validityPeriod); + } + + private void sendTextMessageInternal( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage, + int priority, boolean expectMore, int validityPeriod) { + if (TextUtils.isEmpty(destinationAddress)) { + throw new IllegalArgumentException("Invalid destinationAddress"); + } + + if (TextUtils.isEmpty(text)) { + throw new IllegalArgumentException("Invalid message body"); + } + + if (priority < 0x00 || priority > 0x03) { + throw new IllegalArgumentException("Invalid priority"); + } + + if (validityPeriod < 0x05 || validityPeriod > 0x09b0a0) { + throw new IllegalArgumentException("Invalid validity period"); + } + + try { + ISms iccISms = getISmsServiceOrThrow(); + if (iccISms != null) { + iccISms.sendTextForSubscriberWithOptions(getSubscriptionId(), + ActivityThread.currentPackageName(), destinationAddress, scAddress, text, + sentIntent, deliveryIntent, persistMessage, priority, expectMore, + validityPeriod); + } + } catch (RemoteException ex) { + // ignore it + } + } + + /** + * Send a text based SMS without writing it into the SMS Provider. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier + * privileges. + * </p> + * + * @see #sendTextMessage(String, String, String, PendingIntent, + * PendingIntent, int, boolean, int) + * @hide + */ + public void sendTextMessageWithoutPersisting( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, int priority, + boolean expectMore, int validityPeriod) { + sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, + false /* persistMessage */, priority, expectMore, validityPeriod); + } + + /** + * * Inject an SMS PDU into the android application framework. * * <p>Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} or carrier @@ -545,6 +651,140 @@ public final class SmsManager { } /** + * Send a multi-part text based SMS with messaging options. The callee should have already + * divided the message into correctly sized parts by calling + * <code>divideMessage</code>. + * + * <p class="note"><strong>Note:</strong> Using this method requires that your app has the + * {@link android.Manifest.permission#SEND_SMS} permission.</p> + * + * <p class="note"><strong>Note:</strong> Beginning with Android 4.4 (API level 19), if + * <em>and only if</em> an app is not selected as the default SMS app, the system automatically + * writes messages sent using this method to the SMS Provider (the default SMS app is always + * responsible for writing its sent messages to the SMS Provider). For information about + * how to behave as the default SMS app, see {@link android.provider.Telephony}.</p> + * + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param parts an <code>ArrayList</code> of strings that, in order, + * comprise the original message + * @param sentIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been sent. + * The result code will be <code>Activity.RESULT_OK</code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> each sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been delivered + * to the recipient. The raw pdu of the status report is in the + * extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending messages through same link or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + * + * @throws IllegalArgumentException if destinationAddress or data are empty + * {@hide} + */ + public void sendMultipartTextMessage( + String destinationAddress, String scAddress, ArrayList<String> parts, + ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, + int priority, boolean expectMore, int validityPeriod) { + sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, + deliveryIntents, true /* persistMessage*/); + } + + private void sendMultipartTextMessageInternal( + String destinationAddress, String scAddress, List<String> parts, + List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents, + boolean persistMessage, int priority, boolean expectMore, int validityPeriod) { + if (TextUtils.isEmpty(destinationAddress)) { + throw new IllegalArgumentException("Invalid destinationAddress"); + } + if (parts == null || parts.size() < 1) { + throw new IllegalArgumentException("Invalid message body"); + } + + if (priority < 0x00 || priority > 0x03) { + throw new IllegalArgumentException("Invalid priority"); + } + + if (validityPeriod < 0x05 || validityPeriod > 0x09b0a0) { + throw new IllegalArgumentException("Invalid validity period"); + } + + if (parts.size() > 1) { + try { + ISms iccISms = getISmsServiceOrThrow(); + if (iccISms != null) { + iccISms.sendMultipartTextForSubscriberWithOptions(getSubscriptionId(), + ActivityThread.currentPackageName(), destinationAddress, scAddress, + parts, sentIntents, deliveryIntents, persistMessage, priority, + expectMore, validityPeriod); + } + } catch (RemoteException ex) { + // ignore it + } + } else { + PendingIntent sentIntent = null; + PendingIntent deliveryIntent = null; + if (sentIntents != null && sentIntents.size() > 0) { + sentIntent = sentIntents.get(0); + } + if (deliveryIntents != null && deliveryIntents.size() > 0) { + deliveryIntent = deliveryIntents.get(0); + } + sendTextMessageInternal(destinationAddress, scAddress, parts.get(0), + sentIntent, deliveryIntent, persistMessage, priority, expectMore, + validityPeriod); + } + } + + /** + * Send a multi-part text based SMS without writing it into the SMS Provider. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier + * privileges. + * </p> + * + * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, + * ArrayList, int, boolean, int) + * @hide + **/ + public void sendMultipartTextMessageWithoutPersisting( + String destinationAddress, String scAddress, List<String> parts, + List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents, + int priority, boolean expectMore, int validityPeriod) { + sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, + deliveryIntents, false /* persistMessage*/, priority, expectMore, + validityPeriod); + } + + /** * Send a data based SMS to a specific application port. * * <p class="note"><strong>Note:</strong> Using this method requires that your app has the @@ -1007,7 +1247,7 @@ public final class SmsManager { * <code>getAllMessagesFromIcc</code> * @return <code>ArrayList</code> of <code>SmsMessage</code> objects. */ - private static ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { + private ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { ArrayList<SmsMessage> messages = new ArrayList<SmsMessage>(); if (records != null) { int count = records.size(); @@ -1015,7 +1255,8 @@ public final class SmsManager { SmsRawData data = records.get(i); // List contains all records, including "free" records (null) if (data != null) { - SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes()); + SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes(), + getSubscriptionId()); if (sms != null) { messages.add(sms); } diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java index 6e083c21cd5b..ea74bac7208f 100644 --- a/telephony/java/android/telephony/SmsMessage.java +++ b/telephony/java/android/telephony/SmsMessage.java @@ -268,6 +268,31 @@ public class SmsMessage { } /** + * Create an SmsMessage from an SMS EF record. + * + * @param index Index of SMS record. This should be index in ArrayList + * returned by SmsManager.getAllMessagesFromSim + 1. + * @param data Record data. + * @param subId Subscription Id of the SMS + * @return An SmsMessage representing the record. + * + * @hide + */ + public static SmsMessage createFromEfRecord(int index, byte[] data, int subId) { + SmsMessageBase wrappedMessage; + + if (isCdmaVoice(subId)) { + wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromEfRecord( + index, data); + } else { + wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromEfRecord( + index, data); + } + + return wrappedMessage != null ? new SmsMessage(wrappedMessage) : null; + } + + /** * Get the TP-Layer-Length for the given SMS-SUBMIT PDU Basically, the * length in bytes (not hex chars) less the SMSC header * @@ -827,6 +852,7 @@ public class SmsMessage { int activePhone = TelephonyManager.getDefault().getCurrentPhoneType(subId); return (PHONE_TYPE_CDMA == activePhone); } + /** * Decide if the carrier supports long SMS. * {@hide} diff --git a/telephony/java/android/telephony/Telephony.java b/telephony/java/android/telephony/Telephony.java index e7f0cc2423f4..cb87d1fb1d56 100644 --- a/telephony/java/android/telephony/Telephony.java +++ b/telephony/java/android/telephony/Telephony.java @@ -1103,10 +1103,15 @@ public final class Telephony { "android.provider.Telephony.MMS_DOWNLOADED"; /** - * Broadcast Action: A debug code has been entered in the dialer. These "secret codes" - * are used to activate developer menus by dialing certain codes. And they are of the - * form {@code *#*#<code>#*#*}. The intent will have the data URI: - * {@code android_secret_code://<code>}. + * Broadcast Action: A debug code has been entered in the dialer. This intent is + * broadcast by the system and OEM telephony apps may need to receive these broadcasts. + * These "secret codes" are used to activate developer menus by dialing certain codes. + * And they are of the form {@code *#*#<code>#*#*}. The intent will have the data + * URI: {@code android_secret_code://<code>}. It is possible that a manifest + * receiver would be woken up even if it is not currently running. + * + * <p>Requires {@code android.Manifest.permission#CONTROL_INCALL_EXPERIENCE} to + * send and receive.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String SECRET_CODE_ACTION = diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 0c92a68b2788..9f5907ba7bfd 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -5107,6 +5107,24 @@ public class TelephonyManager { } /** + * Determines if emergency calling is allowed for the MMTEL feature on the slot provided. + * @param slotIndex The SIM slot of the MMTEL feature + * @return true if emergency calling is allowed, false otherwise. + * @hide + */ + public boolean isEmergencyMmTelAvailable(int slotIndex) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.isEmergencyMmTelAvailable(slotIndex); + } + } catch (RemoteException e) { + Rlog.e(TAG, "isEmergencyMmTelAvailable, RemoteException: " + e.getMessage()); + } + return false; + } + + /** * Set IMS registration state * * @param Registration state @@ -6968,18 +6986,16 @@ public class TelephonyManager { * * @return Carrier id of the current subscription. Return {@link #UNKNOWN_CARRIER_ID} if the * subscription is unavailable or the carrier cannot be identified. - * @throws IllegalStateException if telephony service is unavailable. */ public int getAndroidCarrierIdForSubscription() { try { ITelephony service = getITelephony(); - return service.getSubscriptionCarrierId(getSubId()); + if (service != null) { + return service.getSubscriptionCarrierId(getSubId()); + } } catch (RemoteException ex) { // This could happen if binder process crashes. ex.rethrowAsRuntimeException(); - } catch (NullPointerException ex) { - // This could happen before phone restarts due to crashing. - throw new IllegalStateException("Telephony service unavailable"); } return UNKNOWN_CARRIER_ID; } @@ -6995,18 +7011,16 @@ public class TelephonyManager { * * @return Carrier name of the current subscription. Return {@code null} if the subscription is * unavailable or the carrier cannot be identified. - * @throws IllegalStateException if telephony service is unavailable. */ public CharSequence getAndroidCarrierNameForSubscription() { try { ITelephony service = getITelephony(); - return service.getSubscriptionCarrierName(getSubId()); + if (service != null) { + return service.getSubscriptionCarrierName(getSubId()); + } } catch (RemoteException ex) { // This could happen if binder process crashes. ex.rethrowAsRuntimeException(); - } catch (NullPointerException ex) { - // This could happen before phone restarts due to crashing. - throw new IllegalStateException("Telephony service unavailable"); } return null; } @@ -7451,4 +7465,83 @@ public class TelephonyManager { Log.e(TAG, "Error calling ITelephony#setUserDataEnabled", e); } } + + /** + * In this mode, modem will not send specified indications when screen is off. + * @hide + */ + public static final int INDICATION_UPDATE_MODE_NORMAL = 1; + + /** + * In this mode, modem will still send specified indications when screen is off. + * @hide + */ + public static final int INDICATION_UPDATE_MODE_IGNORE_SCREEN_OFF = 2; + + /** @hide */ + @IntDef(prefix = { "INDICATION_UPDATE_MODE_" }, value = { + INDICATION_UPDATE_MODE_NORMAL, + INDICATION_UPDATE_MODE_IGNORE_SCREEN_OFF + }) + @Retention(RetentionPolicy.SOURCE) + public @interface IndicationUpdateMode{} + + /** + * The indication for signal strength update. + * @hide + */ + public static final int INDICATION_FILTER_SIGNAL_STRENGTH = 0x1; + + /** + * The indication for full network state update. + * @hide + */ + public static final int INDICATION_FILTER_FULL_NETWORK_STATE = 0x2; + + /** + * The indication for data call dormancy changed update. + * @hide + */ + public static final int INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED = 0x4; + + /** @hide */ + @IntDef(flag = true, prefix = { "INDICATION_FILTER_" }, value = { + INDICATION_FILTER_SIGNAL_STRENGTH, + INDICATION_FILTER_FULL_NETWORK_STATE, + INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED + }) + @Retention(RetentionPolicy.SOURCE) + public @interface IndicationFilters{} + + /** + * Sets radio indication update mode. This can be used to control the behavior of indication + * update from modem to Android frameworks. For example, by default several indication updates + * are turned off when screen is off, but in some special cases (e.g. carkit is connected but + * screen is off) we want to turn on those indications even when the screen is off. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * + * @param filters Indication filters. Should be a bitmask of INDICATION_FILTER_XXX. + * @see #INDICATION_FILTER_SIGNAL_STRENGTH + * @see #INDICATION_FILTER_FULL_NETWORK_STATE + * @see #INDICATION_FILTER_DATA_CALL_DORMANCY_CHANGED + * @param updateMode The voice activation state + * @see #INDICATION_UPDATE_MODE_NORMAL + * @see #INDICATION_UPDATE_MODE_IGNORE_SCREEN_OFF + * @hide + */ + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public void setRadioIndicationUpdateMode(@IndicationFilters int filters, + @IndicationUpdateMode int updateMode) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.setRadioIndicationUpdateMode(getSubId(), filters, updateMode); + } + } catch (RemoteException ex) { + // This could happen if binder process crashes. + ex.rethrowAsRuntimeException(); + } + } } diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java index c3f8a1930409..21bc9d022d4c 100644 --- a/telephony/java/android/telephony/UiccAccessRule.java +++ b/telephony/java/android/telephony/UiccAccessRule.java @@ -221,6 +221,15 @@ public final class UiccAccessRule implements Parcelable { } @Override + public int hashCode() { + int result = 1; + result = 31 * result + Arrays.hashCode(mCertificateHash); + result = 31 * result + Objects.hashCode(mPackageName); + result = 31 * result + Objects.hashCode(mAccessType); + return result; + } + + @Override public String toString() { return "cert: " + IccUtils.bytesToHexString(mCertificateHash) + " pkg: " + mPackageName + " access: " + mAccessType; diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 41c1430e386f..e8597b221391 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -17,6 +17,7 @@ package android.telephony.data; import android.annotation.SystemApi; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -230,8 +231,10 @@ public final class DataProfile implements Parcelable { @Override public String toString() { - return "DataProfile=" + mProfileId + "/" + mApn + "/" + mProtocol + "/" + mAuthType - + "/" + mUserName + "/" + mPassword + "/" + mType + "/" + mMaxConnsTime + return "DataProfile=" + mProfileId + "/" + mProtocol + "/" + mAuthType + + "/" + (Build.IS_USER ? "***/***/***" : + (mApn + "/" + mUserName + "/" + mPassword)) + + "/" + mType + "/" + mMaxConnsTime + "/" + mMaxConns + "/" + mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmap + "/" + mRoamingProtocol + "/" + mBearerBitmap + "/" + mMtu + "/" + mMvnoType + "/" + mMvnoMatchData + "/" + mModemCognitive; diff --git a/telephony/java/android/telephony/euicc/EuiccCardManager.java b/telephony/java/android/telephony/euicc/EuiccCardManager.java index 6be77250996e..cc0d1c69ae2a 100644 --- a/telephony/java/android/telephony/euicc/EuiccCardManager.java +++ b/telephony/java/android/telephony/euicc/EuiccCardManager.java @@ -115,6 +115,9 @@ public class EuiccCardManager { /** Result code of an unknown error. */ public static final int RESULT_UNKNOWN_ERROR = -1; + /** Result code when the eUICC card with the given card Id is not found. */ + public static final int RESULT_EUICC_NOT_FOUND = -2; + /** * Callback to receive the result of an eUICC card API. * diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java index 1fdbae9186b7..d53769907342 100644 --- a/telephony/java/android/telephony/ims/feature/ImsFeature.java +++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java @@ -87,7 +87,9 @@ public abstract class ImsFeature { // ImsFeatures that are defined in the Manifests. Ensure that these values match the previously // defined values in ImsServiceClass for compatibility purposes. /** - * This feature supports emergency calling over MMTEL. + * This feature supports emergency calling over MMTEL. If defined, the framework will try to + * place an emergency call over IMS first. If it is not defined, the framework will only use + * CSFB for emergency calling. */ public static final int FEATURE_EMERGENCY_MMTEL = 0; /** diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index 09267fc2554c..2fffd36a1a4f 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -332,20 +332,14 @@ public class MmTelFeature extends ImsFeature { public static final int PROCESS_CALL_IMS = 0; /** * To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should - * not process the outgoing NON_EMERGENCY call as IMS and should instead use circuit switch. + * not process the outgoing call as IMS and should instead use circuit switch. */ public static final int PROCESS_CALL_CSFB = 1; - /** - * To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should - * not process the outgoing EMERGENCY call as IMS and should instead use circuit switch. - */ - public static final int PROCESS_CALL_EMERGENCY_CSFB = 2; @IntDef(flag = true, value = { PROCESS_CALL_IMS, - PROCESS_CALL_CSFB, - PROCESS_CALL_EMERGENCY_CSFB + PROCESS_CALL_CSFB }) @Retention(RetentionPolicy.SOURCE) public @interface ProcessCallResult {} @@ -536,12 +530,15 @@ public class MmTelFeature extends ImsFeature { /** * Called by the framework to determine if the outgoing call, designated by the outgoing - * {@link Uri}s, should be processed as an IMS call or CSFB call. + * {@link String}s, should be processed as an IMS call or CSFB call. If this method's + * functionality is not overridden, the platform will process every call as IMS as long as the + * MmTelFeature reports that the {@link MmTelCapabilities#CAPABILITY_TYPE_VOICE} capability is + * available. * @param numbers An array of {@link String}s that will be used for placing the call. There can * be multiple {@link String}s listed in the case when we want to place an outgoing * call as a conference. * @return a {@link ProcessCallResult} to the framework, which will be used to determine if the - * call wil lbe placed over IMS or via CSFB. + * call will be placed over IMS or via CSFB. */ public @ProcessCallResult int shouldProcessCall(String[] numbers) { return PROCESS_CALL_IMS; diff --git a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java index bf8953386e49..92d62da8d00c 100644 --- a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java @@ -74,7 +74,9 @@ public class ImsSmsImplBase { /** @hide */ @IntDef({ DELIVER_STATUS_OK, - DELIVER_STATUS_ERROR + DELIVER_STATUS_ERROR_GENERIC, + DELIVER_STATUS_ERROR_NO_MEMORY, + DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED }) @Retention(RetentionPolicy.SOURCE) public @interface DeliverStatusResult {} @@ -86,7 +88,17 @@ public class ImsSmsImplBase { /** * Message was not delivered. */ - public static final int DELIVER_STATUS_ERROR = 2; + public static final int DELIVER_STATUS_ERROR_GENERIC = 2; + + /** + * Message was not delivered due to lack of memory. + */ + public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; + + /** + * Message was not delivered as the request is not supported. + */ + public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; /** @hide */ @IntDef({ @@ -106,7 +118,6 @@ public class ImsSmsImplBase { */ public static final int STATUS_REPORT_STATUS_ERROR = 2; - // Lock for feature synchronization private final Object mLock = new Object(); private IImsSmsListener mListener; @@ -157,7 +168,9 @@ public class ImsSmsImplBase { * @param token token provided in {@link #onSmsReceived(int, String, byte[])} * @param result result of delivering the message. Valid values are: * {@link #DELIVER_STATUS_OK}, - * {@link #DELIVER_STATUS_ERROR} + * {@link #DELIVER_STATUS_ERROR_GENERIC}, + * {@link #DELIVER_STATUS_ERROR_NO_MEMORY}, + * {@link #DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED} * @param messageRef the message reference */ public void acknowledgeSms(int token, @DeliverStatusResult int messageRef, int result) { @@ -202,7 +215,7 @@ public class ImsSmsImplBase { mListener.onSmsReceived(token, format, pdu); } catch (RemoteException e) { Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage()); - acknowledgeSms(token, 0, DELIVER_STATUS_ERROR); + acknowledgeSms(token, 0, DELIVER_STATUS_ERROR_GENERIC); } } } diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 8e3f4c070d2e..1cfe8c2442bd 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -21,6 +21,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.CellInfo; import android.telephony.DataConnectionRealTimeInfo; +import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; import android.telephony.VoLteServiceState; @@ -37,6 +38,7 @@ oneway interface IPhoneStateListener { void onDataConnectionStateChanged(int state, int networkType); void onDataActivity(int direction); void onSignalStrengthsChanged(in SignalStrength signalStrength); + void onPhysicalChannelConfigurationChanged(in List<PhysicalChannelConfig> configs); void onOtaspChanged(in int otaspMode); void onCellInfoChanged(in List<CellInfo> cellInfo); void onPreciseCallStateChanged(in PreciseCallState callState); diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index fe37531c0611..a4eb424ab66e 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -187,6 +187,57 @@ interface ISms { in PendingIntent deliveryIntent, in boolean persistMessage); /** + * Send an SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destAddr the address to send the message to + * @param scAddr the SMSC to send the message through, or NULL for the + * default SMSC + * @param text the body of the message to send + * @param sentIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is sucessfully sent, or failed. + * The result code will be <code>Activity.RESULT_OK<code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is delivered to the recipient. The + * raw pdu of the status report is in the extended data ("pdu"). + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendTextForSubscriberWithOptions(in int subId, String callingPkg, in String destAddr, + in String scAddr, in String text, in PendingIntent sentIntent, + in PendingIntent deliveryIntent, in boolean persistMessageForNonDefaultSmsApp, + in int priority, in boolean expectMore, in int validityPeriod); + + /** * Inject an SMS PDU into the android platform. * * @param subId the subId on which the SMS has to be injected. @@ -234,6 +285,56 @@ interface ISms { in List<PendingIntent> deliveryIntents, in boolean persistMessageForNonDefaultSmsApp); /** + * Send a multi-part text based SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param parts an <code>ArrayList</code> of strings that, in order, + * comprise the original message + * @param sentIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been sent. + * The result code will be <code>Activity.RESULT_OK<code> for success, + * or one of these errors: + * <code>RESULT_ERROR_GENERIC_FAILURE</code> + * <code>RESULT_ERROR_RADIO_OFF</code> + * <code>RESULT_ERROR_NULL_PDU</code>. + * @param deliveryIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been delivered + * to the recipient. The raw pdu of the status report is in the + * extended data ("pdu"). + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendMultipartTextForSubscriberWithOptions(in int subId, String callingPkg, + in String destinationAddress, in String scAddress, in List<String> parts, + in List<PendingIntent> sentIntents, in List<PendingIntent> deliveryIntents, + in boolean persistMessageForNonDefaultSmsApp, in int priority, in boolean expectMore, + in int validityPeriod); + + /** * Enable reception of cell broadcast (SMS-CB) messages with the given * message identifier and RAN type. The RAN type specify this message ID * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 9e2b519e3dd6..a941a5671f13 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -823,6 +823,12 @@ interface ITelephony { IImsConfig getImsConfig(int slotId, int feature); /** + * Returns true if emergency calling is available for the MMTEL feature associated with the + * slot specified. + */ + boolean isEmergencyMmTelAvailable(int slotId); + + /** * Set the network selection mode to automatic. * * @param subId the id of the subscription to update. @@ -1473,4 +1479,12 @@ interface ITelephony { * @return boolean Return true if the switch succeeds, false if the switch fails. */ boolean switchSlots(in int[] physicalSlots); + + /** + * Sets radio indication update mode. This can be used to control the behavior of indication + * update from modem to Android frameworks. For example, by default several indication updates + * are turned off when screen is off, but in some special cases (e.g. carkit is connected but + * screen is off) we want to turn on those indications even when the screen is off. + */ + void setRadioIndicationUpdateMode(int subId, int filters, int mode); } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 188167cc14f6..06dc13e53bf7 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -21,9 +21,9 @@ import android.net.LinkProperties; import android.net.NetworkCapabilities; import android.os.Bundle; import android.telephony.CellInfo; +import android.telephony.PhysicalChannelConfig; import android.telephony.ServiceState; import android.telephony.SignalStrength; -import android.telephony.CellInfo; import android.telephony.VoLteServiceState; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; @@ -58,6 +58,9 @@ interface ITelephonyRegistry { void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation); void notifyOtaspChanged(in int otaspMode); void notifyCellInfo(in List<CellInfo> cellInfo); + void notifyPhysicalChannelConfiguration(in List<PhysicalChannelConfig> configs); + void notifyPhysicalChannelConfigurationForSubscriber(in int subId, + in List<PhysicalChannelConfig> configs); void notifyPreciseCallState(int ringingCallState, int foregroundCallState, int backgroundCallState); void notifyDisconnectCause(int disconnectCause, int preciseDisconnectCause); diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index 7a53ef63e2a8..14c5f4bebebb 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -99,6 +99,15 @@ public class SmsMessage extends SmsMessageBase { private static final int RETURN_NO_ACK = 0; private static final int RETURN_ACK = 1; + /** + * Supported priority modes for CDMA SMS messages + * (See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1) + */ + private static final int PRIORITY_NORMAL = 0x0; + private static final int PRIORITY_INTERACTIVE = 0x1; + private static final int PRIORITY_URGENT = 0x2; + private static final int PRIORITY_EMERGENCY = 0x3; + private SmsEnvelope mEnvelope; private BearerData mBearerData; @@ -211,6 +220,26 @@ public class SmsMessage extends SmsMessageBase { */ public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, boolean statusReportRequested, SmsHeader smsHeader) { + return getSubmitPdu(scAddr, destAddr, message, statusReportRequested, smsHeader, -1); + } + + /** + * Get an SMS-SUBMIT PDU for a destination address and a message + * + * @param scAddr Service Centre address. Null means use default. + * @param destAddr Address of the recipient. + * @param message String representation of the message payload. + * @param statusReportRequested Indicates whether a report is requested for this message. + * @param smsHeader Array containing the data for the User Data Header, preceded + * by the Element Identifiers. + * @param priority Priority level of the message + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + * @hide + */ + public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, + boolean statusReportRequested, SmsHeader smsHeader, int priority) { /** * TODO(cleanup): Do we really want silent failure like this? @@ -224,7 +253,7 @@ public class SmsMessage extends SmsMessageBase { UserData uData = new UserData(); uData.payloadStr = message; uData.userDataHeader = smsHeader; - return privateGetSubmitPdu(destAddr, statusReportRequested, uData); + return privateGetSubmitPdu(destAddr, statusReportRequested, uData, priority); } /** @@ -282,6 +311,22 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get an SMS-SUBMIT PDU for a data message to a destination address & port + * + * @param destAddr the address of the destination for the message + * @param userData the data for the message + * @param statusReportRequested Indicates whether a report is requested for this message. + * @param priority Priority level of the message + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + */ + public static SubmitPdu getSubmitPdu(String destAddr, UserData userData, + boolean statusReportRequested, int priority) { + return privateGetSubmitPdu(destAddr, statusReportRequested, userData, priority); + } + + /** * Note: This function is a GSM specific functionality which is not supported in CDMA mode. */ @Override @@ -764,6 +809,15 @@ public class SmsMessage extends SmsMessageBase { */ private static SubmitPdu privateGetSubmitPdu(String destAddrStr, boolean statusReportRequested, UserData userData) { + return privateGetSubmitPdu(destAddrStr, statusReportRequested, userData, -1); + } + + /** + * Creates BearerData and Envelope from parameters for a Submit SMS. + * @return byte stream for SubmitPdu. + */ + private static SubmitPdu privateGetSubmitPdu(String destAddrStr, boolean statusReportRequested, + UserData userData, int priority) { /** * TODO(cleanup): give this function a more meaningful name. @@ -792,6 +846,10 @@ public class SmsMessage extends SmsMessageBase { bearerData.userAckReq = false; bearerData.readAckReq = false; bearerData.reportReq = false; + if (priority >= PRIORITY_NORMAL && priority <= PRIORITY_EMERGENCY) { + bearerData.priorityIndicatorSet = true; + bearerData.priority = priority; + } bearerData.userData = userData; diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index 1ca19e01d6c8..4f5bfa919135 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -89,6 +89,18 @@ public class SmsMessage extends SmsMessageBase { private int mVoiceMailCount = 0; + private static final int VALIDITY_PERIOD_FORMAT_NONE = 0x00; + private static final int VALIDITY_PERIOD_FORMAT_ENHANCED = 0x01; + private static final int VALIDITY_PERIOD_FORMAT_RELATIVE = 0x02; + private static final int VALIDITY_PERIOD_FORMAT_ABSOLUTE = 0x03; + + //Validity Period min - 5 mins + private static final int VALIDITY_PERIOD_MIN = 5; + //Validity Period max - 63 weeks + private static final int VALIDITY_PERIOD_MAX = 635040; + + private static final int INVALID_VALIDITY_PERIOD = -1; + public static class SubmitPdu extends SubmitPduBase { } @@ -202,6 +214,45 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get Encoded Relative Validty Period Value from Validity period in mins. + * + * @param validityPeriod Validity period in mins. + * + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * ||relValidityPeriod (TP-VP) || || validityPeriod || + * + * 0 to 143 ---> (TP-VP + 1) x 5 minutes + * + * 144 to 167 ---> 12 hours + ((TP-VP -143) x 30 minutes) + * + * 168 to 196 ---> (TP-VP - 166) x 1 day + * + * 197 to 255 ---> (TP-VP - 192) x 1 week + * + * @return relValidityPeriod Encoded Relative Validity Period Value. + * @hide + */ + public static int getRelativeValidityPeriod(int validityPeriod) { + int relValidityPeriod = INVALID_VALIDITY_PERIOD; + + if (validityPeriod < VALIDITY_PERIOD_MIN || validityPeriod > VALIDITY_PERIOD_MAX) { + Rlog.e(LOG_TAG,"Invalid Validity Period" + validityPeriod); + return relValidityPeriod; + } + + if (validityPeriod <= 720) { + relValidityPeriod = (validityPeriod / 5) - 1; + } else if (validityPeriod <= 1440) { + relValidityPeriod = ((validityPeriod - 720) / 30) + 143; + } else if (validityPeriod <= 43200) { + relValidityPeriod = (validityPeriod / 1440) + 166; + } else if (validityPeriod <= 635040) { + relValidityPeriod = (validityPeriod / 10080) + 192; + } + return relValidityPeriod; + } + + /** * Get an SMS-SUBMIT PDU for a destination address and a message * * @param scAddress Service Centre address. Null means use default. @@ -236,6 +287,29 @@ public class SmsMessage extends SmsMessageBase { String destinationAddress, String message, boolean statusReportRequested, byte[] header, int encoding, int languageTable, int languageShiftTable) { + return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, + header, encoding, languageTable, languageShiftTable, -1); + } + + /** + * Get an SMS-SUBMIT PDU for a destination address and a message using the + * specified encoding. + * + * @param scAddress Service Centre address. Null means use default. + * @param encoding Encoding defined by constants in + * com.android.internal.telephony.SmsConstants.ENCODING_* + * @param languageTable + * @param languageShiftTable + * @param validityPeriod Validity Period of the message in Minutes. + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + * @hide + */ + public static SubmitPdu getSubmitPdu(String scAddress, + String destinationAddress, String message, + boolean statusReportRequested, byte[] header, int encoding, + int languageTable, int languageShiftTable, int validityPeriod) { // Perform null parameter checks. if (message == null || destinationAddress == null) { @@ -272,8 +346,19 @@ public class SmsMessage extends SmsMessageBase { } SubmitPdu ret = new SubmitPdu(); - // MTI = SMS-SUBMIT, UDHI = header != null - byte mtiByte = (byte)(0x01 | (header != null ? 0x40 : 0x00)); + + int validityPeriodFormat = VALIDITY_PERIOD_FORMAT_NONE; + int relativeValidityPeriod = INVALID_VALIDITY_PERIOD; + + // TP-Validity-Period-Format (TP-VPF) in 3GPP TS 23.040 V6.8.1 section 9.2.3.3 + //bit 4:3 = 10 - TP-VP field present - relative format + if((relativeValidityPeriod = getRelativeValidityPeriod(validityPeriod)) >= 0) { + validityPeriodFormat = VALIDITY_PERIOD_FORMAT_RELATIVE; + } + + byte mtiByte = (byte)(0x01 | (validityPeriodFormat << 0x03) | + (header != null ? 0x40 : 0x00)); + ByteArrayOutputStream bo = getSubmitPduHead( scAddress, destinationAddress, mtiByte, statusReportRequested, ret); @@ -338,7 +423,11 @@ public class SmsMessage extends SmsMessageBase { bo.write(0x08); } - // (no TP-Validity-Period) + if (validityPeriodFormat == VALIDITY_PERIOD_FORMAT_RELATIVE) { + // ( TP-Validity-Period - relative format) + bo.write(relativeValidityPeriod); + } + bo.write(userData, 0, userData.length); ret.encodedMessage = bo.toByteArray(); return ret; @@ -388,6 +477,24 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get an SMS-SUBMIT PDU for a destination address and a message + * + * @param scAddress Service Centre address. Null means use default. + * @param destinationAddress the address of the destination for the message + * @param statusReportRequested staus report of the message Requested + * @param validityPeriod Validity Period of the message in Minutes. + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + */ + public static SubmitPdu getSubmitPdu(String scAddress, + String destinationAddress, String message, + boolean statusReportRequested, int validityPeriod) { + return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, + null, ENCODING_UNKNOWN, 0, 0, validityPeriod); + } + + /** * Get an SMS-SUBMIT PDU for a data message to a destination address & port * * @param scAddress Service Centre address. null == use default diff --git a/test-runner/tests/Android.mk b/test-runner/tests/Android.mk index 7ee047e47058..7b9e9a4a09e6 100644 --- a/test-runner/tests/Android.mk +++ b/test-runner/tests/Android.mk @@ -32,6 +32,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := FrameworkTestRunnerTests +# Because of android.test.mock. +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/AccessibilityEventsLogger/Android.mk b/tests/AccessibilityEventsLogger/Android.mk index 52bc57900e3f..4224017993e2 100644 --- a/tests/AccessibilityEventsLogger/Android.mk +++ b/tests/AccessibilityEventsLogger/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AccessibilityEventsLogger +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/ActivityTests/Android.mk b/tests/ActivityTests/Android.mk index f3c6b5a0cedf..274fc5fcf471 100644 --- a/tests/ActivityTests/Android.mk +++ b/tests/ActivityTests/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := ActivityTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests LOCAL_CERTIFICATE := platform diff --git a/tests/AppLaunch/Android.mk b/tests/AppLaunch/Android.mk index d01b1f96ee05..9cbb4ed1fba9 100644 --- a/tests/AppLaunch/Android.mk +++ b/tests/AppLaunch/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := AppLaunch +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_JAVA_LIBRARIES := legacy-android-test diff --git a/tests/Assist/Android.mk b/tests/Assist/Android.mk index f31c4ddfbca6..d0d3ecaa5dec 100644 --- a/tests/Assist/Android.mk +++ b/tests/Assist/Android.mk @@ -6,5 +6,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := Assist +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/BandwidthTests/Android.mk b/tests/BandwidthTests/Android.mk index 7bc5f857e920..d00fdc68cda4 100644 --- a/tests/BandwidthTests/Android.mk +++ b/tests/BandwidthTests/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := BandwidthEnforcementTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_SRC_FILES := $(call all-java-files-under, src) include $(BUILD_PACKAGE) diff --git a/tests/BatteryWaster/Android.mk b/tests/BatteryWaster/Android.mk index 6db34a71bbf4..fb244a856121 100644 --- a/tests/BatteryWaster/Android.mk +++ b/tests/BatteryWaster/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := BatteryWaster +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/BiDiTests/Android.mk b/tests/BiDiTests/Android.mk index ae29fc262b13..78cf4be66fbe 100644 --- a/tests/BiDiTests/Android.mk +++ b/tests/BiDiTests/Android.mk @@ -21,6 +21,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := BiDiTests +LOCAL_SDK_VERSION := current LOCAL_PROGUARD_FLAG_FILES := proguard.flags diff --git a/tests/BrowserPowerTest/Android.mk b/tests/BrowserPowerTest/Android.mk index 59bc729a6280..50f1d10f3939 100644 --- a/tests/BrowserPowerTest/Android.mk +++ b/tests/BrowserPowerTest/Android.mk @@ -25,6 +25,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := BrowserPowerTests +LOCAL_PRIVATE_PLATFORM_APIS := true #LOCAL_INSTRUMENTATION_FOR := browserpowertest diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk index 527d1bbfd886..541bddc0f454 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests # LOCAL_SDK_VERSION := current +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PACKAGE_NAME := SmartCamera-tests diff --git a/tests/CameraPrewarmTest/Android.mk b/tests/CameraPrewarmTest/Android.mk index b6316f0ff10e..e12850469245 100644 --- a/tests/CameraPrewarmTest/Android.mk +++ b/tests/CameraPrewarmTest/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := CameraPrewarmTest +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_CERTIFICATE := platform diff --git a/tests/CanvasCompare/Android.mk b/tests/CanvasCompare/Android.mk index 90de503ebd81..6b850a9836c8 100644 --- a/tests/CanvasCompare/Android.mk +++ b/tests/CanvasCompare/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) LOCAL_PACKAGE_NAME := CanvasCompare +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/Compatibility/Android.mk b/tests/Compatibility/Android.mk index 82e212688637..9c47a2610223 100644 --- a/tests/Compatibility/Android.mk +++ b/tests/Compatibility/Android.mk @@ -24,6 +24,7 @@ LOCAL_SRC_FILES := \ LOCAL_PACKAGE_NAME := AppCompatibilityTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk index c9f11615381f..e5682644b772 100644 --- a/tests/CoreTests/android/Android.mk +++ b/tests/CoreTests/android/Android.mk @@ -10,5 +10,6 @@ LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle conscrypt org.apache.ht LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := CoreTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/DataIdleTest/Android.mk b/tests/DataIdleTest/Android.mk index 4e15729221a9..17ba75f1bef2 100644 --- a/tests/DataIdleTest/Android.mk +++ b/tests/DataIdleTest/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := DataIdleTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) diff --git a/tests/DozeTest/Android.mk b/tests/DozeTest/Android.mk index 01f10e5ac1de..ec250ffe3aa0 100644 --- a/tests/DozeTest/Android.mk +++ b/tests/DozeTest/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := DozeTest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/DpiTest/Android.mk b/tests/DpiTest/Android.mk index f55ce6e3bdfd..e69d0826bb57 100644 --- a/tests/DpiTest/Android.mk +++ b/tests/DpiTest/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := DensityTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/FeatureSplit/base/Android.mk b/tests/FeatureSplit/base/Android.mk index 93f6d7a5f52b..5ddceda99fca 100644 --- a/tests/FeatureSplit/base/Android.mk +++ b/tests/FeatureSplit/base/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := FeatureSplitBase +LOCAL_SDK_VERSION := current LOCAL_EXPORT_PACKAGE_RESOURCES := true LOCAL_MODULE_TAGS := tests diff --git a/tests/FeatureSplit/feature1/Android.mk b/tests/FeatureSplit/feature1/Android.mk index e6ba5c2d04c9..d4d25890431e 100644 --- a/tests/FeatureSplit/feature1/Android.mk +++ b/tests/FeatureSplit/feature1/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := FeatureSplit1 +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_APK_LIBRARIES := FeatureSplitBase diff --git a/tests/FeatureSplit/feature2/Android.mk b/tests/FeatureSplit/feature2/Android.mk index c8e860942fa3..5e5e78bcfff5 100644 --- a/tests/FeatureSplit/feature2/Android.mk +++ b/tests/FeatureSplit/feature2/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := FeatureSplit2 +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_APK_LIBRARIES := FeatureSplitBase diff --git a/tests/FixVibrateSetting/Android.mk b/tests/FixVibrateSetting/Android.mk index 2a88e5a4f584..86db09eaa20d 100644 --- a/tests/FixVibrateSetting/Android.mk +++ b/tests/FixVibrateSetting/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := FixVibrateSetting +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/FrameworkPerf/Android.mk b/tests/FrameworkPerf/Android.mk index d2ec75347531..b083c12df368 100644 --- a/tests/FrameworkPerf/Android.mk +++ b/tests/FrameworkPerf/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := FrameworkPerf +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test diff --git a/tests/GridLayoutTest/Android.mk b/tests/GridLayoutTest/Android.mk index a02918b0a464..e7e3ccd56986 100644 --- a/tests/GridLayoutTest/Android.mk +++ b/tests/GridLayoutTest/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := GridLayoutTest +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/HierarchyViewerTest/Android.mk b/tests/HierarchyViewerTest/Android.mk index f8c865631f93..cf1a512b6d57 100644 --- a/tests/HierarchyViewerTest/Android.mk +++ b/tests/HierarchyViewerTest/Android.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := HierarchyViewerTest +LOCAL_SDK_VERSION := current -LOCAL_JAVA_LIBRARIES := android.test.runner -LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test +LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs +LOCAL_STATIC_JAVA_LIBRARIES := junit include $(BUILD_PACKAGE) diff --git a/tests/HwAccelerationTest/Android.mk b/tests/HwAccelerationTest/Android.mk index d4743f938d4b..11ea954c62c7 100644 --- a/tests/HwAccelerationTest/Android.mk +++ b/tests/HwAccelerationTest/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := HwAccelerationTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/ImfTest/Android.mk b/tests/ImfTest/Android.mk index eb5327b11213..a8f5b0867c65 100644 --- a/tests/ImfTest/Android.mk +++ b/tests/ImfTest/Android.mk @@ -8,6 +8,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ImfTest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/ImfTest/tests/Android.mk b/tests/ImfTest/tests/Android.mk index 60424712d02c..2a4999885bd4 100644 --- a/tests/ImfTest/tests/Android.mk +++ b/tests/ImfTest/tests/Android.mk @@ -11,6 +11,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := ImfTestTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_INSTRUMENTATION_FOR := ImfTest diff --git a/tests/Internal/Android.mk b/tests/Internal/Android.mk index fc001e928e80..a8fb395eda81 100644 --- a/tests/Internal/Android.mk +++ b/tests/Internal/Android.mk @@ -18,6 +18,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit \ LOCAL_CERTIFICATE := platform LOCAL_PACKAGE_NAME := InternalTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_COMPATIBILITY_SUITE := device-tests include $(BUILD_PACKAGE) diff --git a/tests/JobSchedulerTestApp/Android.mk b/tests/JobSchedulerTestApp/Android.mk index 7336d8c6a00d..48ee1f673755 100644 --- a/tests/JobSchedulerTestApp/Android.mk +++ b/tests/JobSchedulerTestApp/Android.mk @@ -8,6 +8,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := JobSchedulerTestApp +LOCAL_SDK_VERSION := current LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/LargeAssetTest/Android.mk b/tests/LargeAssetTest/Android.mk index cb7f01be8b40..f6d98bfa094a 100644 --- a/tests/LargeAssetTest/Android.mk +++ b/tests/LargeAssetTest/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := LargeAssetTest +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/LegacyAssistant/Android.mk b/tests/LegacyAssistant/Android.mk index 0ad48d1ccef0..a58336967f7e 100644 --- a/tests/LegacyAssistant/Android.mk +++ b/tests/LegacyAssistant/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := LegacyAssistant +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_CERTIFICATE := platform diff --git a/tests/LocationTracker/Android.mk b/tests/LocationTracker/Android.mk index b142d2269b00..0d51b3bcf13f 100644 --- a/tests/LocationTracker/Android.mk +++ b/tests/LocationTracker/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := LocationTracker +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/LockTaskTests/Android.mk b/tests/LockTaskTests/Android.mk index ed5864304b67..a693eaa4da04 100644 --- a/tests/LockTaskTests/Android.mk +++ b/tests/LockTaskTests/Android.mk @@ -5,6 +5,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app LOCAL_PACKAGE_NAME := LockTaskTests +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform LOCAL_SRC_FILES := $(call all-Iaidl-files-under, src) $(call all-java-files-under, src) diff --git a/tests/LotsOfApps/Android.mk b/tests/LotsOfApps/Android.mk index 0ef9550b8084..bee3bcc7ca51 100644 --- a/tests/LotsOfApps/Android.mk +++ b/tests/LotsOfApps/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := LotsOfApps +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/LowStorageTest/Android.mk b/tests/LowStorageTest/Android.mk index ab5b9e925ed6..bdde6bdc2fe1 100644 --- a/tests/LowStorageTest/Android.mk +++ b/tests/LowStorageTest/Android.mk @@ -21,5 +21,6 @@ LOCAL_CERTIFICATE := platform LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := lowstoragetest +LOCAL_SDK_VERSION := current include $(BUILD_PACKAGE) diff --git a/tests/MemoryUsage/Android.mk b/tests/MemoryUsage/Android.mk index 578e628987f1..bab6a7087e40 100644 --- a/tests/MemoryUsage/Android.mk +++ b/tests/MemoryUsage/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := MemoryUsage +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_JAVA_LIBRARIES := android.test.runner diff --git a/tests/NetworkSecurityConfigTest/Android.mk b/tests/NetworkSecurityConfigTest/Android.mk index dd9ff11971eb..e29090be29d9 100644 --- a/tests/NetworkSecurityConfigTest/Android.mk +++ b/tests/NetworkSecurityConfigTest/Android.mk @@ -12,5 +12,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := NetworkSecurityConfigTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/OneMedia/Android.mk b/tests/OneMedia/Android.mk index 9fc64035a914..41f3f64235d4 100644 --- a/tests/OneMedia/Android.mk +++ b/tests/OneMedia/Android.mk @@ -7,6 +7,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) \ $(call all-Iaidl-files-under, src) LOCAL_PACKAGE_NAME := OneMedia +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_JAVA_LIBRARIES += org.apache.http.legacy diff --git a/tests/RenderThreadTest/Android.mk b/tests/RenderThreadTest/Android.mk index e07e943b9ca2..4e5f35bd71ca 100644 --- a/tests/RenderThreadTest/Android.mk +++ b/tests/RenderThreadTest/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := RenderThreadTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_STATIC_JAVA_LIBRARIES += android-common diff --git a/tests/SerialChat/Android.mk b/tests/SerialChat/Android.mk index a534e1a86a86..ed6ca9991417 100644 --- a/tests/SerialChat/Android.mk +++ b/tests/SerialChat/Android.mk @@ -22,5 +22,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := SerialChat +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/ServiceCrashTest/Android.mk b/tests/ServiceCrashTest/Android.mk index d1f845623be8..3aa7132367f0 100644 --- a/tests/ServiceCrashTest/Android.mk +++ b/tests/ServiceCrashTest/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := ServiceCrashTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_JAVA_LIBRARIES := legacy-android-test diff --git a/tests/SharedLibrary/client/Android.mk b/tests/SharedLibrary/client/Android.mk index a04fb0550998..9e76c4038600 100644 --- a/tests/SharedLibrary/client/Android.mk +++ b/tests/SharedLibrary/client/Android.mk @@ -7,6 +7,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_RES_LIBRARIES := SharedLibrary LOCAL_PACKAGE_NAME := SharedLibraryClient +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/SharedLibrary/lib/Android.mk b/tests/SharedLibrary/lib/Android.mk index 78fcb8b7c0a6..3c1ca8764386 100644 --- a/tests/SharedLibrary/lib/Android.mk +++ b/tests/SharedLibrary/lib/Android.mk @@ -6,6 +6,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_AAPT_FLAGS := --shared-lib LOCAL_PACKAGE_NAME := SharedLibrary +LOCAL_SDK_VERSION := current LOCAL_EXPORT_PACKAGE_RESOURCES := true LOCAL_PRIVILEGED_MODULE := true diff --git a/tests/ShowWhenLockedApp/Android.mk b/tests/ShowWhenLockedApp/Android.mk index 006416791dd9..41e0ac42a5a9 100644 --- a/tests/ShowWhenLockedApp/Android.mk +++ b/tests/ShowWhenLockedApp/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := ShowWhenLocked +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/SmokeTestApps/Android.mk b/tests/SmokeTestApps/Android.mk index 3f5f0118b1ac..1f564e06bb85 100644 --- a/tests/SmokeTestApps/Android.mk +++ b/tests/SmokeTestApps/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := SmokeTestTriggerApps +LOCAL_SDK_VERSION := current include $(BUILD_PACKAGE) diff --git a/tests/SoundTriggerTestApp/Android.mk b/tests/SoundTriggerTestApp/Android.mk index c327b0956811..73fb5e8eab54 100644 --- a/tests/SoundTriggerTestApp/Android.mk +++ b/tests/SoundTriggerTestApp/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := SoundTriggerTestApp +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := optional diff --git a/tests/SoundTriggerTests/Android.mk b/tests/SoundTriggerTests/Android.mk index 359484ee63d7..774fc85eb80e 100644 --- a/tests/SoundTriggerTests/Android.mk +++ b/tests/SoundTriggerTests/Android.mk @@ -31,5 +31,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := mockito-target legacy-android-test LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := SoundTriggerTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/Split/Android.mk b/tests/Split/Android.mk index b068bef58785..4d15b2d4bd01 100644 --- a/tests/Split/Android.mk +++ b/tests/Split/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := Split +LOCAL_SDK_VERSION := current LOCAL_PACKAGE_SPLITS := mdpi-v4 hdpi-v4 xhdpi-v4 xxhdpi-v4 diff --git a/tests/StatusBar/Android.mk b/tests/StatusBar/Android.mk index 502657f4e260..e845335684bc 100644 --- a/tests/StatusBar/Android.mk +++ b/tests/StatusBar/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := StatusBarTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_CERTIFICATE := platform LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/SystemUIDemoModeController/Android.mk b/tests/SystemUIDemoModeController/Android.mk index 64ea63ce05de..cc6fa8dfb5f7 100644 --- a/tests/SystemUIDemoModeController/Android.mk +++ b/tests/SystemUIDemoModeController/Android.mk @@ -6,5 +6,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := DemoModeController +LOCAL_SDK_VERSION := current include $(BUILD_PACKAGE) diff --git a/tests/TouchLatency/Android.mk b/tests/TouchLatency/Android.mk index 969283df4af7..2334bd84c1f2 100644 --- a/tests/TouchLatency/Android.mk +++ b/tests/TouchLatency/Android.mk @@ -15,6 +15,7 @@ LOCAL_AAPT_FLAGS := \ --auto-add-overlay LOCAL_PACKAGE_NAME := TouchLatency +LOCAL_SDK_VERSION := current LOCAL_COMPATIBILITY_SUITE := device-tests diff --git a/tests/TransformTest/Android.mk b/tests/TransformTest/Android.mk index 2d3637da569a..5340cdd5f29b 100644 --- a/tests/TransformTest/Android.mk +++ b/tests/TransformTest/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := TransformTest +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/TransitionTests/Android.mk b/tests/TransitionTests/Android.mk index 22fa63889261..a696156d1ee8 100644 --- a/tests/TransitionTests/Android.mk +++ b/tests/TransitionTests/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := TransitionTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_STATIC_JAVA_LIBRARIES += android-common diff --git a/tests/TtsTests/Android.mk b/tests/TtsTests/Android.mk index 3c3cd77813f7..4fee739988af 100644 --- a/tests/TtsTests/Android.mk +++ b/tests/TtsTests/Android.mk @@ -24,5 +24,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := mockito-target legacy-android-test LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_PACKAGE_NAME := TtsTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/UsageStatsTest/Android.mk b/tests/UsageStatsTest/Android.mk index 6b5c9998fc06..6735c7c8f787 100644 --- a/tests/UsageStatsTest/Android.mk +++ b/tests/UsageStatsTest/Android.mk @@ -11,5 +11,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_CERTIFICATE := platform LOCAL_PACKAGE_NAME := UsageStatsTest +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.mk b/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.mk index 3137a7338084..cd7aaedf2bb1 100644 --- a/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.mk +++ b/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.mk @@ -25,6 +25,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := AoapTestDeviceApp +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) diff --git a/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.mk b/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.mk index 354e8c9b7bf4..bd8a51b69bff 100644 --- a/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.mk +++ b/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.mk @@ -25,6 +25,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := AoapTestHostApp +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) diff --git a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.mk b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.mk index 2d6d6ea8cdcc..fed454eb9d01 100644 --- a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.mk +++ b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.mk @@ -25,6 +25,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := UsbHostExternalManagementTestApp +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PRIVILEGED_MODULE := true # TODO remove tests tag diff --git a/tests/UsesFeature2Test/Android.mk b/tests/UsesFeature2Test/Android.mk index cc784d7944aa..4cba4ff62dd4 100644 --- a/tests/UsesFeature2Test/Android.mk +++ b/tests/UsesFeature2Test/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := UsesFeature2Test +LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests diff --git a/tests/VectorDrawableTest/Android.mk b/tests/VectorDrawableTest/Android.mk index dd8a4d474ae2..155b2bc8560c 100644 --- a/tests/VectorDrawableTest/Android.mk +++ b/tests/VectorDrawableTest/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := VectorDrawableTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/VoiceEnrollment/Android.mk b/tests/VoiceEnrollment/Android.mk index 2ab3d029092f..725e2bdd74e5 100644 --- a/tests/VoiceEnrollment/Android.mk +++ b/tests/VoiceEnrollment/Android.mk @@ -4,6 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := VoiceEnrollment +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := optional diff --git a/tests/VoiceInteraction/Android.mk b/tests/VoiceInteraction/Android.mk index 8decca7d163f..aa48b42d57ca 100644 --- a/tests/VoiceInteraction/Android.mk +++ b/tests/VoiceInteraction/Android.mk @@ -6,5 +6,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := VoiceInteraction +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/WallpaperTest/Android.mk b/tests/WallpaperTest/Android.mk index b4259cd2782b..4815500b68e6 100644 --- a/tests/WallpaperTest/Android.mk +++ b/tests/WallpaperTest/Android.mk @@ -8,6 +8,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := WallpaperTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/WindowManagerStressTest/Android.mk b/tests/WindowManagerStressTest/Android.mk index e4cbe939e521..6f4403fa86c7 100644 --- a/tests/WindowManagerStressTest/Android.mk +++ b/tests/WindowManagerStressTest/Android.mk @@ -20,6 +20,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := WindowManagerStressTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/appwidgets/AppWidgetHostTest/Android.mk b/tests/appwidgets/AppWidgetHostTest/Android.mk index 4d0c704fc812..c9e6c6b42b5b 100644 --- a/tests/appwidgets/AppWidgetHostTest/Android.mk +++ b/tests/appwidgets/AppWidgetHostTest/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AppWidgetHostTest +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/appwidgets/AppWidgetProviderTest/Android.mk b/tests/appwidgets/AppWidgetProviderTest/Android.mk index 6084fb907c07..b26c60b38d4a 100644 --- a/tests/appwidgets/AppWidgetProviderTest/Android.mk +++ b/tests/appwidgets/AppWidgetProviderTest/Android.mk @@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AppWidgetProvider +LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk index 202a699c1706..e9618300fc48 100644 --- a/tests/backup/Android.mk +++ b/tests/backup/Android.mk @@ -40,6 +40,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := BackupTest +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/net/java/android/net/IpPrefixTest.java b/tests/net/java/android/net/IpPrefixTest.java index b5b2c07cbc4e..1f1ba2e6a603 100644 --- a/tests/net/java/android/net/IpPrefixTest.java +++ b/tests/net/java/android/net/IpPrefixTest.java @@ -223,14 +223,14 @@ public class IpPrefixTest { } @Test - public void testContains() { + public void testContainsInetAddress() { IpPrefix p = new IpPrefix("2001:db8:f00::ace:d00d/127"); assertTrue(p.contains(Address("2001:db8:f00::ace:d00c"))); assertTrue(p.contains(Address("2001:db8:f00::ace:d00d"))); assertFalse(p.contains(Address("2001:db8:f00::ace:d00e"))); assertFalse(p.contains(Address("2001:db8:f00::bad:d00d"))); assertFalse(p.contains(Address("2001:4868:4860::8888"))); - assertFalse(p.contains(null)); + assertFalse(p.contains((InetAddress)null)); assertFalse(p.contains(Address("8.8.8.8"))); p = new IpPrefix("192.0.2.0/23"); @@ -251,6 +251,53 @@ public class IpPrefixTest { } @Test + public void testContainsIpPrefix() { + assertTrue(new IpPrefix("0.0.0.0/0").containsPrefix(new IpPrefix("0.0.0.0/0"))); + assertTrue(new IpPrefix("0.0.0.0/0").containsPrefix(new IpPrefix("1.2.3.4/0"))); + assertTrue(new IpPrefix("0.0.0.0/0").containsPrefix(new IpPrefix("1.2.3.4/8"))); + assertTrue(new IpPrefix("0.0.0.0/0").containsPrefix(new IpPrefix("1.2.3.4/24"))); + assertTrue(new IpPrefix("0.0.0.0/0").containsPrefix(new IpPrefix("1.2.3.4/23"))); + + assertTrue(new IpPrefix("1.2.3.4/8").containsPrefix(new IpPrefix("1.2.3.4/8"))); + assertTrue(new IpPrefix("1.2.3.4/8").containsPrefix(new IpPrefix("1.254.12.9/8"))); + assertTrue(new IpPrefix("1.2.3.4/21").containsPrefix(new IpPrefix("1.2.3.4/21"))); + assertTrue(new IpPrefix("1.2.3.4/32").containsPrefix(new IpPrefix("1.2.3.4/32"))); + + assertTrue(new IpPrefix("1.2.3.4/20").containsPrefix(new IpPrefix("1.2.3.0/24"))); + + assertFalse(new IpPrefix("1.2.3.4/32").containsPrefix(new IpPrefix("1.2.3.5/32"))); + assertFalse(new IpPrefix("1.2.3.4/8").containsPrefix(new IpPrefix("2.2.3.4/8"))); + assertFalse(new IpPrefix("0.0.0.0/16").containsPrefix(new IpPrefix("0.0.0.0/15"))); + assertFalse(new IpPrefix("100.0.0.0/8").containsPrefix(new IpPrefix("99.0.0.0/8"))); + + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("::/0"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("2001:db8::f00/1"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("3d8a:661:a0::770/8"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("2001:db8::f00/8"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("2001:db8::f00/64"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("2001:db8::f00/113"))); + assertTrue(new IpPrefix("::/0").containsPrefix(new IpPrefix("2001:db8::f00/128"))); + + assertTrue(new IpPrefix("2001:db8:f00::ace:d00d/64").containsPrefix( + new IpPrefix("2001:db8:f00::ace:d00d/64"))); + assertTrue(new IpPrefix("2001:db8:f00::ace:d00d/64").containsPrefix( + new IpPrefix("2001:db8:f00::ace:d00d/120"))); + assertFalse(new IpPrefix("2001:db8:f00::ace:d00d/64").containsPrefix( + new IpPrefix("2001:db8:f00::ace:d00d/32"))); + assertFalse(new IpPrefix("2001:db8:f00::ace:d00d/64").containsPrefix( + new IpPrefix("2006:db8:f00::ace:d00d/96"))); + + assertTrue(new IpPrefix("2001:db8:f00::ace:d00d/128").containsPrefix( + new IpPrefix("2001:db8:f00::ace:d00d/128"))); + assertTrue(new IpPrefix("2001:db8:f00::ace:d00d/100").containsPrefix( + new IpPrefix("2001:db8:f00::ace:ccaf/110"))); + + assertFalse(new IpPrefix("2001:db8:f00::ace:d00d/128").containsPrefix( + new IpPrefix("2001:db8:f00::ace:d00e/128"))); + assertFalse(new IpPrefix("::/30").containsPrefix(new IpPrefix("::/29"))); + } + + @Test public void testHashCode() { IpPrefix p = new IpPrefix(new byte[4], 0); Random random = new Random(); diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java index 4c6a64464b6e..caaa6109f0e6 100644 --- a/tests/net/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java @@ -17,18 +17,25 @@ package android.net; import static android.net.NetworkCapabilities.LINK_BANDWIDTH_UNSPECIFIED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS; import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; +import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_WIFI_P2P; import static android.net.NetworkCapabilities.RESTRICTED_CAPABILITIES; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.UNRESTRICTED_CAPABILITIES; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -222,7 +229,9 @@ public class NetworkCapabilitiesTest { assertFalse(netCap.appliesToUidRange(new UidRange(60, 3400))); NetworkCapabilities netCap2 = new NetworkCapabilities(); - assertFalse(netCap2.satisfiedByUids(netCap)); + // A new netcap object has null UIDs, so anything will satisfy it. + assertTrue(netCap2.satisfiedByUids(netCap)); + // Still not equal though. assertFalse(netCap2.equalsUids(netCap)); netCap2.setUids(uids); assertTrue(netCap2.satisfiedByUids(netCap)); @@ -239,7 +248,7 @@ public class NetworkCapabilitiesTest { assertTrue(netCap.appliesToUid(650)); assertFalse(netCap.appliesToUid(500)); - assertFalse(new NetworkCapabilities().satisfiedByUids(netCap)); + assertTrue(new NetworkCapabilities().satisfiedByUids(netCap)); netCap.combineCapabilities(new NetworkCapabilities()); assertTrue(netCap.appliesToUid(500)); assertTrue(netCap.appliesToUidRange(new UidRange(1, 100000))); @@ -261,6 +270,133 @@ public class NetworkCapabilitiesTest { assertEqualsThroughMarshalling(netCap); } + @Test + public void testOemPaid() { + NetworkCapabilities nc = new NetworkCapabilities(); + nc.maybeMarkCapabilitiesRestricted(); + assertFalse(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); + assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + nc.addCapability(NET_CAPABILITY_OEM_PAID); + nc.maybeMarkCapabilitiesRestricted(); + assertTrue(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); + assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + } + + @Test + public void testUnwantedCapabilities() { + NetworkCapabilities network = new NetworkCapabilities(); + + NetworkCapabilities request = new NetworkCapabilities(); + assertTrue("Request: " + request + ", Network:" + network, + request.satisfiedByNetworkCapabilities(network)); + + // Adding capabilities that doesn't exist in the network anyway + request.addUnwantedCapability(NET_CAPABILITY_WIFI_P2P); + request.addUnwantedCapability(NET_CAPABILITY_NOT_METERED); + assertTrue(request.satisfiedByNetworkCapabilities(network)); + assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, NET_CAPABILITY_NOT_METERED}, + request.getUnwantedCapabilities()); + + // This is a default capability, just want to make sure its there because we use it below. + assertTrue(network.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + // Verify that adding unwanted capability will effectively remove it from capability list. + request.addUnwantedCapability(NET_CAPABILITY_NOT_RESTRICTED); + assertTrue(request.hasUnwantedCapability(NET_CAPABILITY_NOT_RESTRICTED)); + assertFalse(request.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + + // Now this request won't be satisfied because network contains NOT_RESTRICTED. + assertFalse(request.satisfiedByNetworkCapabilities(network)); + network.removeCapability(NET_CAPABILITY_NOT_RESTRICTED); + assertTrue(request.satisfiedByNetworkCapabilities(network)); + + // Verify that adding capability will effectively remove it from unwanted list + request.addCapability(NET_CAPABILITY_NOT_RESTRICTED); + assertTrue(request.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + assertFalse(request.hasUnwantedCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + assertFalse(request.satisfiedByNetworkCapabilities(network)); + network.addCapability(NET_CAPABILITY_NOT_RESTRICTED); + assertTrue(request.satisfiedByNetworkCapabilities(network)); + } + + @Test + public void testEqualsNetCapabilities() { + int CAPABILITY = NET_CAPABILITY_MMS; // An arbitrary not mutable capability. + + NetworkCapabilities nc1 = new NetworkCapabilities(); + NetworkCapabilities nc2 = new NetworkCapabilities(); + assertTrue(nc1.equalsNetCapabilities(nc2)); + assertEquals(nc1, nc2); + + nc1.addCapability(CAPABILITY); + assertFalse(nc1.equalsNetCapabilities(nc2)); + assertNotEquals(nc1, nc2); + nc2.addCapability(CAPABILITY); + assertTrue(nc1.equalsNetCapabilities(nc2)); + assertEquals(nc1, nc2); + + nc1.addUnwantedCapability(CAPABILITY); + assertFalse(nc1.equalsNetCapabilities(nc2)); + nc2.addUnwantedCapability(CAPABILITY); + assertTrue(nc1.equalsNetCapabilities(nc2)); + + nc1.removeCapability(CAPABILITY); + assertFalse(nc1.equalsNetCapabilities(nc2)); + nc2.removeCapability(CAPABILITY); + assertTrue(nc1.equalsNetCapabilities(nc2)); + } + + @Test + public void testCombineCapabilities() { + NetworkCapabilities nc1 = new NetworkCapabilities(); + NetworkCapabilities nc2 = new NetworkCapabilities(); + + nc1.addUnwantedCapability(NET_CAPABILITY_CAPTIVE_PORTAL); + nc1.addCapability(NET_CAPABILITY_NOT_ROAMING); + assertNotEquals(nc1, nc2); + nc2.combineCapabilities(nc1); + assertEquals(nc1, nc2); + assertTrue(nc2.hasCapability(NET_CAPABILITY_NOT_ROAMING)); + assertTrue(nc2.hasUnwantedCapability(NET_CAPABILITY_CAPTIVE_PORTAL)); + + // This will effectively move NOT_ROAMING capability from required to unwanted for nc1. + nc1.addUnwantedCapability(NET_CAPABILITY_NOT_ROAMING); + + nc2.combineCapabilities(nc1); + // We will get this capability in both requested and unwanted lists thus this request + // will never be satisfied. + assertTrue(nc2.hasCapability(NET_CAPABILITY_NOT_ROAMING)); + assertTrue(nc2.hasUnwantedCapability(NET_CAPABILITY_NOT_ROAMING)); + } + + @Test + public void testSetCapabilities() { + final int[] REQUIRED_CAPABILITIES = new int[] { + NET_CAPABILITY_INTERNET, NET_CAPABILITY_NOT_VPN }; + final int[] UNWANTED_CAPABILITIES = new int[] { + NET_CAPABILITY_NOT_RESTRICTED, NET_CAPABILITY_NOT_METERED + }; + + NetworkCapabilities nc1 = new NetworkCapabilities(); + NetworkCapabilities nc2 = new NetworkCapabilities(); + + nc1.setCapabilities(REQUIRED_CAPABILITIES, UNWANTED_CAPABILITIES); + assertArrayEquals(REQUIRED_CAPABILITIES, nc1.getCapabilities()); + + // Verify that setting and adding capabilities leads to the same object state. + nc2.clearAll(); + for (int cap : REQUIRED_CAPABILITIES) { + nc2.addCapability(cap); + } + for (int cap : UNWANTED_CAPABILITIES) { + nc2.addUnwantedCapability(cap); + } + assertEquals(nc1, nc2); + } + private void assertEqualsThroughMarshalling(NetworkCapabilities netCap) { Parcel p = Parcel.obtain(); netCap.writeToParcel(p, /* flags */ 0); diff --git a/tests/net/java/android/net/NetworkUtilsTest.java b/tests/net/java/android/net/NetworkUtilsTest.java index 8d51c3b01258..a5ee8e37553d 100644 --- a/tests/net/java/android/net/NetworkUtilsTest.java +++ b/tests/net/java/android/net/NetworkUtilsTest.java @@ -19,8 +19,10 @@ package android.net; import android.net.NetworkUtils; import android.test.suitebuilder.annotation.SmallTest; +import java.math.BigInteger; import java.net.Inet4Address; import java.net.InetAddress; +import java.util.TreeSet; import junit.framework.TestCase; @@ -67,4 +69,101 @@ public class NetworkUtilsTest extends TestCase { assertInvalidNetworkMask(IPv4Address("255.255.255.253")); assertInvalidNetworkMask(IPv4Address("255.255.0.255")); } + + @SmallTest + public void testRoutedIPv4AddressCount() { + final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator()); + // No routes routes to no addresses. + assertEquals(0, NetworkUtils.routedIPv4AddressCount(set)); + + set.add(new IpPrefix("0.0.0.0/0")); + assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); + + set.add(new IpPrefix("20.18.0.0/16")); + set.add(new IpPrefix("20.18.0.0/24")); + set.add(new IpPrefix("20.18.0.0/8")); + // There is a default route, still covers everything + assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); + + set.clear(); + set.add(new IpPrefix("20.18.0.0/24")); + set.add(new IpPrefix("20.18.0.0/8")); + // The 8-length includes the 24-length prefix + assertEquals(1l << 24, NetworkUtils.routedIPv4AddressCount(set)); + + set.add(new IpPrefix("10.10.10.126/25")); + // The 8-length does not include this 25-length prefix + assertEquals((1l << 24) + (1 << 7), NetworkUtils.routedIPv4AddressCount(set)); + + set.clear(); + set.add(new IpPrefix("1.2.3.4/32")); + set.add(new IpPrefix("1.2.3.4/32")); + set.add(new IpPrefix("1.2.3.4/32")); + set.add(new IpPrefix("1.2.3.4/32")); + assertEquals(1l, NetworkUtils.routedIPv4AddressCount(set)); + + set.add(new IpPrefix("1.2.3.5/32")); + set.add(new IpPrefix("1.2.3.6/32")); + + set.add(new IpPrefix("1.2.3.7/32")); + set.add(new IpPrefix("1.2.3.8/32")); + set.add(new IpPrefix("1.2.3.9/32")); + set.add(new IpPrefix("1.2.3.0/32")); + assertEquals(7l, NetworkUtils.routedIPv4AddressCount(set)); + + // 1.2.3.4/30 eats 1.2.3.{4-7}/32 + set.add(new IpPrefix("1.2.3.4/30")); + set.add(new IpPrefix("6.2.3.4/28")); + set.add(new IpPrefix("120.2.3.4/16")); + assertEquals(7l - 4 + 4 + 16 + 65536, NetworkUtils.routedIPv4AddressCount(set)); + } + + @SmallTest + public void testRoutedIPv6AddressCount() { + final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator()); + // No routes routes to no addresses. + assertEquals(BigInteger.ZERO, NetworkUtils.routedIPv6AddressCount(set)); + + set.add(new IpPrefix("::/0")); + assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); + + set.add(new IpPrefix("1234:622a::18/64")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); + // There is a default route, still covers everything + assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); + + set.clear(); + set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); + // The 8-length includes the 96-length prefix + assertEquals(BigInteger.ONE.shiftLeft(120), NetworkUtils.routedIPv6AddressCount(set)); + + set.add(new IpPrefix("10::26/64")); + // The 8-length does not include this 64-length prefix + assertEquals(BigInteger.ONE.shiftLeft(120).add(BigInteger.ONE.shiftLeft(64)), + NetworkUtils.routedIPv6AddressCount(set)); + + set.clear(); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); + assertEquals(BigInteger.ONE, NetworkUtils.routedIPv6AddressCount(set)); + + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad5/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad6/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad7/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad8/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad9/128")); + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad0/128")); + assertEquals(BigInteger.valueOf(7), NetworkUtils.routedIPv6AddressCount(set)); + + // add4:f00:80:f7:1111::6ad4/126 eats add4:f00:8[:f7:1111::6ad{4-7}/128 + set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/126")); + set.add(new IpPrefix("d00d:f00:80:f7:1111::6ade/124")); + set.add(new IpPrefix("f00b:a33::/112")); + assertEquals(BigInteger.valueOf(7l - 4 + 4 + 16 + 65536), + NetworkUtils.routedIPv6AddressCount(set)); + } } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 28f81220027c..5ea21ea4f1c6 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -387,6 +387,7 @@ public class ConnectivityServiceTest { mScore = 20; break; case TRANSPORT_VPN: + mNetworkCapabilities.removeCapability(NET_CAPABILITY_NOT_VPN); mScore = ConnectivityConstants.VPN_DEFAULT_SCORE; break; default: @@ -3744,14 +3745,19 @@ public class ConnectivityServiceTest { final int uid = Process.myUid(); final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback(); + final TestNetworkCallback genericNotVpnNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); - final NetworkRequest genericRequest = new NetworkRequest.Builder().build(); + final NetworkRequest genericNotVpnRequest = new NetworkRequest.Builder().build(); + final NetworkRequest genericRequest = new NetworkRequest.Builder() + .removeCapability(NET_CAPABILITY_NOT_VPN).build(); final NetworkRequest wifiRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_WIFI).build(); final NetworkRequest vpnNetworkRequest = new NetworkRequest.Builder() + .removeCapability(NET_CAPABILITY_NOT_VPN) .addTransportType(TRANSPORT_VPN).build(); mCm.registerNetworkCallback(genericRequest, genericNetworkCallback); + mCm.registerNetworkCallback(genericNotVpnRequest, genericNotVpnNetworkCallback); mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback); mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); @@ -3759,6 +3765,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + genericNotVpnNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); wifiNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); vpnNetworkCallback.assertNoCallback(); @@ -3773,16 +3780,19 @@ public class ConnectivityServiceTest { vpnNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); genericNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + genericNotVpnNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCapabilitiesLike(nc -> null == nc.getUids(), vpnNetworkAgent); ranges.clear(); vpnNetworkAgent.setUids(ranges); genericNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); @@ -3790,18 +3800,21 @@ public class ConnectivityServiceTest { vpnNetworkAgent.setUids(ranges); genericNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); mWiFiNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + genericNotVpnNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); vpnNetworkCallback.assertNoCallback(); vpnNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java index 66e0955b04c3..3e1ff6dd5f32 100644 --- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java +++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java @@ -281,6 +281,7 @@ public class IpSecServiceParameterizedTest { anyInt()); } + @Test public void testCreateTwoTransformsWithSameSpis() throws Exception { IpSecConfig ipSecConfig = new IpSecConfig(); addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig); diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index a115146486a4..099cfd457160 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -40,6 +40,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.mock; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -59,12 +60,14 @@ import android.net.NetworkRequest; import android.net.util.SharedLog; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.Bundle; import android.os.Handler; import android.os.INetworkManagementService; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.test.TestLooper; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -558,6 +561,90 @@ public class TetheringTest { verifyNoMoreInteractions(mNMService); } + private void userRestrictionsListenerBehaviour( + boolean currentDisallow, boolean nextDisallow, String[] activeTetheringIfacesList, + int expectedInteractionsWithShowNotification) throws Exception { + final int userId = 0; + final Bundle currRestrictions = new Bundle(); + final Bundle newRestrictions = new Bundle(); + Tethering tethering = mock(Tethering.class); + Tethering.TetheringUserRestrictionListener turl = + new Tethering.TetheringUserRestrictionListener(tethering); + + currRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, currentDisallow); + newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow); + when(tethering.getTetheredIfaces()).thenReturn(activeTetheringIfacesList); + + turl.onUserRestrictionsChanged(userId, newRestrictions, currRestrictions); + + verify(tethering, times(expectedInteractionsWithShowNotification)) + .showTetheredNotification(anyInt(), eq(false)); + + verify(tethering, times(expectedInteractionsWithShowNotification)).untetherAll(); + } + + @Test + public void testDisallowTetheringWhenNoTetheringInterfaceIsActive() throws Exception { + final String[] emptyActiveIfacesList = new String[]{}; + final boolean currDisallow = false; + final boolean nextDisallow = true; + final int expectedInteractionsWithShowNotification = 0; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, emptyActiveIfacesList, + expectedInteractionsWithShowNotification); + } + + @Test + public void testDisallowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception { + final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname}; + final boolean currDisallow = false; + final boolean nextDisallow = true; + final int expectedInteractionsWithShowNotification = 1; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList, + expectedInteractionsWithShowNotification); + } + + @Test + public void testAllowTetheringWhenNoTetheringInterfaceIsActive() throws Exception { + final String[] nonEmptyActiveIfacesList = new String[]{}; + final boolean currDisallow = true; + final boolean nextDisallow = false; + final int expectedInteractionsWithShowNotification = 0; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList, + expectedInteractionsWithShowNotification); + } + + @Test + public void testAllowTetheringWhenAtLeastOneTetheringInterfaceIsActive() throws Exception { + final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname}; + final boolean currDisallow = true; + final boolean nextDisallow = false; + final int expectedInteractionsWithShowNotification = 0; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList, + expectedInteractionsWithShowNotification); + } + + @Test + public void testDisallowTetheringUnchanged() throws Exception { + final String[] nonEmptyActiveIfacesList = new String[]{mTestIfname}; + final int expectedInteractionsWithShowNotification = 0; + boolean currDisallow = true; + boolean nextDisallow = true; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList, + expectedInteractionsWithShowNotification); + + currDisallow = false; + nextDisallow = false; + + userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList, + expectedInteractionsWithShowNotification); + } + + // TODO: Test that a request for hotspot mode doesn't interfere with an // already operating tethering mode interface. } diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index 1dbf9b2dfced..f59850d45ae3 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -57,9 +57,13 @@ import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; import android.content.res.Resources; import android.net.ConnectivityManager; +import android.net.IConnectivityManager; +import android.net.IpPrefix; +import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo.DetailedState; +import android.net.RouteInfo; import android.net.UidRange; import android.net.VpnService; import android.os.Build.VERSION_CODES; @@ -90,7 +94,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; - +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Tests for {@link Vpn}. @@ -563,4 +568,75 @@ public class VpnTest { return networks.get(network); }).when(mConnectivityManager).getNetworkCapabilities(any()); } + + // Need multiple copies of this, but Java's Stream objects can't be reused or + // duplicated. + private Stream<String> publicIpV4Routes() { + return Stream.of( + "0.0.0.0/5", "8.0.0.0/7", "11.0.0.0/8", "12.0.0.0/6", "16.0.0.0/4", + "32.0.0.0/3", "64.0.0.0/2", "128.0.0.0/3", "160.0.0.0/5", "168.0.0.0/6", + "172.0.0.0/12", "172.32.0.0/11", "172.64.0.0/10", "172.128.0.0/9", + "173.0.0.0/8", "174.0.0.0/7", "176.0.0.0/4", "192.0.0.0/9", "192.128.0.0/11", + "192.160.0.0/13", "192.169.0.0/16", "192.170.0.0/15", "192.172.0.0/14", + "192.176.0.0/12", "192.192.0.0/10", "193.0.0.0/8", "194.0.0.0/7", + "196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4"); + } + + private Stream<String> publicIpV6Routes() { + return Stream.of( + "::/1", "8000::/2", "c000::/3", "e000::/4", "f000::/5", "f800::/6", + "fe00::/8", "2605:ef80:e:af1d::/64"); + } + + @Test + public void testProvidesRoutesToMostDestinations() { + final LinkProperties lp = new LinkProperties(); + + // Default route provides routes to all IPv4 destinations. + lp.addRoute(new RouteInfo(new IpPrefix("0.0.0.0/0"))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + // Empty LP provides routes to no destination + lp.clear(); + assertFalse(Vpn.providesRoutesToMostDestinations(lp)); + + // All IPv4 routes except for local networks. This is the case most relevant + // to this function. It provides routes to almost the entire space. + // (clone the stream so that we can reuse it later) + publicIpV4Routes().forEach(s -> lp.addRoute(new RouteInfo(new IpPrefix(s)))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + // Removing a 16-bit prefix, which is 65536 addresses. This is still enough to + // provide routes to "most" destinations. + lp.removeRoute(new RouteInfo(new IpPrefix("192.169.0.0/16"))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + // Remove the /2 route, which represent a quarter of the available routing space. + // This LP does not provides routes to "most" destinations any more. + lp.removeRoute(new RouteInfo(new IpPrefix("64.0.0.0/2"))); + assertFalse(Vpn.providesRoutesToMostDestinations(lp)); + + lp.clear(); + publicIpV6Routes().forEach(s -> lp.addRoute(new RouteInfo(new IpPrefix(s)))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + lp.removeRoute(new RouteInfo(new IpPrefix("::/1"))); + assertFalse(Vpn.providesRoutesToMostDestinations(lp)); + + // V6 does not provide sufficient coverage but v4 does + publicIpV4Routes().forEach(s -> lp.addRoute(new RouteInfo(new IpPrefix(s)))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + // V4 still does + lp.removeRoute(new RouteInfo(new IpPrefix("192.169.0.0/16"))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + + // V4 does not any more + lp.removeRoute(new RouteInfo(new IpPrefix("64.0.0.0/2"))); + assertFalse(Vpn.providesRoutesToMostDestinations(lp)); + + // V4 does not, but V6 has sufficient coverage again + lp.addRoute(new RouteInfo(new IpPrefix("::/1"))); + assertTrue(Vpn.providesRoutesToMostDestinations(lp)); + } } diff --git a/tests/permission/Android.mk b/tests/permission/Android.mk index 54688c891046..fb84bcf74efa 100644 --- a/tests/permission/Android.mk +++ b/tests/permission/Android.mk @@ -10,6 +10,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test LOCAL_PACKAGE_NAME := FrameworkPermissionTests +LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/testables/tests/Android.mk b/tests/testables/tests/Android.mk index 16fe5351c161..4ec1b0ff1d8b 100644 --- a/tests/testables/tests/Android.mk +++ b/tests/testables/tests/Android.mk @@ -19,6 +19,7 @@ LOCAL_USE_AAPT2 := true LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := TestablesTests +LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_SRC_FILES := $(call all-java-files-under, src) \ $(call all-Iaidl-files-under, src) diff --git a/tests/utils/DummyIME/Android.mk b/tests/utils/DummyIME/Android.mk index c8d9f87f0886..0f6c988b5463 100644 --- a/tests/utils/DummyIME/Android.mk +++ b/tests/utils/DummyIME/Android.mk @@ -22,5 +22,6 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := DummyIME +LOCAL_SDK_VERSION := current include $(BUILD_PACKAGE) diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java index 9bfc0105fcc9..71e6859f2049 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java @@ -263,6 +263,7 @@ public class CredentialTest { * * @throws Exception */ + @Test public void validateCertCredentialWithoutCaCert() throws Exception { Credential cred = createCredentialWithCertificateCredential(); cred.setCaCertificate(null); |