diff options
-rw-r--r-- | Android.bp | 24 | ||||
-rw-r--r-- | api/test-current.txt | 10 | ||||
-rw-r--r-- | core/java/android/bluetooth/BluetoothGatt.java | 18 | ||||
-rw-r--r-- | data/etc/privapp-permissions-platform.xml | 2 | ||||
-rw-r--r-- | services/core/java/com/android/server/connectivity/Tethering.java | 56 | ||||
-rw-r--r-- | services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java | 62 | ||||
-rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 55 | ||||
-rw-r--r-- | telephony/java/android/telephony/mbms/DownloadRequest.java | 2 | ||||
-rw-r--r-- | telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl | 5 | ||||
-rw-r--r-- | telephony/java/com/android/internal/telephony/ITelephony.aidl | 13 | ||||
-rw-r--r-- | test-mock/Android.bp | 46 | ||||
-rw-r--r-- | test-mock/Android.mk | 73 | ||||
-rw-r--r-- | test-runner/Android.bp | 4 | ||||
-rw-r--r-- | tests/net/java/com/android/server/connectivity/TetheringTest.java | 8 |
14 files changed, 254 insertions, 124 deletions
diff --git a/Android.bp b/Android.bp index 98e52a9e9f38..254c5fc225fc 100644 --- a/Android.bp +++ b/Android.bp @@ -991,3 +991,27 @@ java_library_static { ":hwbinder-stubs-docs", ], } + +filegroup { + name: "apache-http-stubs-sources", + srcs: [ + "core/java/org/apache/http/conn/ConnectTimeoutException.java", + "core/java/org/apache/http/conn/scheme/HostNameResolver.java", + "core/java/org/apache/http/conn/scheme/LayeredSocketFactory.java", + "core/java/org/apache/http/conn/scheme/SocketFactory.java", + "core/java/org/apache/http/conn/ssl/AbstractVerifier.java", + "core/java/org/apache/http/conn/ssl/AllowAllHostnameVerifier.java", + "core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java", + "core/java/org/apache/http/conn/ssl/BrowserCompatHostnameVerifier.java", + "core/java/org/apache/http/conn/ssl/SSLSocketFactory.java", + "core/java/org/apache/http/conn/ssl/StrictHostnameVerifier.java", + "core/java/org/apache/http/conn/ssl/X509HostnameVerifier.java", + "core/java/org/apache/http/params/CoreConnectionPNames.java", + "core/java/org/apache/http/params/HttpConnectionParams.java", + "core/java/org/apache/http/params/HttpParams.java", + "core/java/android/net/http/HttpResponseCache.java", + "core/java/android/net/http/SslCertificate.java", + "core/java/android/net/http/SslError.java", + "core/java/com/android/internal/util/HexDump.java", + ], +} diff --git a/api/test-current.txt b/api/test-current.txt index ce6810f8efd8..709b37eedda8 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -440,10 +440,20 @@ package android.telephony { method public void setCdmaSystemAndNetworkId(int, int); } + public class TelephonyManager { + method public int getCarrierIdListVersion(); + method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String); + field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff + } + } package android.telephony.mbms { + public static class DownloadRequest.Builder { + method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String); + } + public final class FileInfo implements android.os.Parcelable { ctor public FileInfo(android.net.Uri, java.lang.String); } diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 3df433643b00..71edc8a32c90 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -1514,22 +1514,24 @@ public final class BluetoothGatt implements BluetoothProfile { * @return true, if the request is send to the Bluetooth stack. * @hide */ - public boolean requestLeConnectionUpdate(int minConnectionInterval, - int maxConnectionInterval, - int slaveLatency, int supervisionTimeout) { + public boolean requestLeConnectionUpdate(int minConnectionInterval, int maxConnectionInterval, + int slaveLatency, int supervisionTimeout, + int minConnectionEventLen, int maxConnectionEventLen) { if (DBG) { Log.d(TAG, "requestLeConnectionUpdate() - min=(" + minConnectionInterval - + ")" + (1.25 * minConnectionInterval) - + "msec, max=(" + maxConnectionInterval + ")" + + ")" + (1.25 * minConnectionInterval) + + "msec, max=(" + maxConnectionInterval + ")" + (1.25 * maxConnectionInterval) + "msec, latency=" + slaveLatency - + ", timeout=" + supervisionTimeout + "msec"); + + ", timeout=" + supervisionTimeout + "msec" + ", min_ce=" + + minConnectionEventLen + ", max_ce=" + maxConnectionEventLen); } if (mService == null || mClientIf == 0) return false; try { mService.leConnectionUpdate(mClientIf, mDevice.getAddress(), - minConnectionInterval, maxConnectionInterval, - slaveLatency, supervisionTimeout); + minConnectionInterval, maxConnectionInterval, + slaveLatency, supervisionTimeout, + minConnectionEventLen, maxConnectionEventLen); } catch (RemoteException e) { Log.e(TAG, "", e); return false; diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 0af187c3fe45..f2fe654bedb6 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -56,6 +56,8 @@ applications that come with the platform </privapp-permissions> <privapp-permissions package="com.android.emergency"> + <!-- Required to place emergency calls from emergency info screen. --> + <permission name="android.permission.CALL_PRIVILEGED"/> <permission name="android.permission.MANAGE_USERS"/> </privapp-permissions> diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index e520d0cba06e..62fe218da262 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -249,6 +249,7 @@ public class Tethering extends BaseNetworkObserver { "CarrierConfigChangeListener", mContext, smHandler, filter, (Intent ignored) -> { mLog.log("OBSERVED carrier config change"); + updateConfiguration(); reevaluateSimCardProvisioning(); }); // TODO: Remove SimChangeListener altogether. For now, we retain it @@ -261,28 +262,35 @@ public class Tethering extends BaseNetworkObserver { }); mStateReceiver = new StateReceiver(); - filter = new IntentFilter(); + + // Load tethering configuration. + updateConfiguration(); + + startStateMachineUpdaters(); + } + + private void startStateMachineUpdaters() { + mCarrierConfigChange.startListening(); + + final Handler handler = mTetherMasterSM.getHandler(); + IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_STATE); filter.addAction(CONNECTIVITY_ACTION); filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - mContext.registerReceiver(mStateReceiver, filter, null, smHandler); + mContext.registerReceiver(mStateReceiver, filter, null, handler); filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_SHARED); filter.addAction(Intent.ACTION_MEDIA_UNSHARED); filter.addDataScheme("file"); - mContext.registerReceiver(mStateReceiver, filter, null, smHandler); + mContext.registerReceiver(mStateReceiver, filter, null, handler); - 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)); + final UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class); + // This check is useful only for some unit tests; example: ConnectivityServiceTest. + if (umi != null) { + umi.addUserRestrictionsListener(new TetheringUserRestrictionListener(this)); } - - // load device config info - updateConfiguration(); } private WifiManager getWifiManager() { @@ -384,17 +392,15 @@ public class Tethering extends BaseNetworkObserver { */ @VisibleForTesting protected boolean isTetherProvisioningRequired() { - String[] provisionApp = mContext.getResources().getStringArray( - com.android.internal.R.array.config_mobile_hotspot_provision_app); + final TetheringConfiguration cfg = mConfig; if (mSystemProperties.getBoolean(DISABLE_PROVISIONING_SYSPROP_KEY, false) - || provisionApp == null) { + || cfg.provisioningApp.length == 0) { return false; } - if (carrierConfigAffirmsEntitlementCheckNotRequired()) { return false; } - return (provisionApp.length == 2); + return (cfg.provisioningApp.length == 2); } // The logic here is aimed solely at confirming that a CarrierConfig exists @@ -417,20 +423,6 @@ public class Tethering extends BaseNetworkObserver { return !isEntitlementCheckRequired; } - // Used by the SIM card change observation code. - // TODO: De-duplicate above code. - private boolean hasMobileHotspotProvisionApp() { - try { - if (!mContext.getResources().getString(com.android.internal.R.string. - config_mobile_hotspot_provision_app_no_ui).isEmpty()) { - Log.d(TAG, "re-evaluate provisioning"); - return true; - } - } catch (Resources.NotFoundException e) {} - Log.d(TAG, "no prov-check needed for new SIM"); - return false; - } - /** * Enables or disables tethering for the given type. This should only be called once * provisioning has succeeded or is not necessary. It will also schedule provisioning rechecks @@ -1186,7 +1178,7 @@ public class Tethering extends BaseNetworkObserver { } private void reevaluateSimCardProvisioning() { - if (!hasMobileHotspotProvisionApp()) return; + if (!mConfig.hasMobileHotspotProvisionApp()) return; if (carrierConfigAffirmsEntitlementCheckNotRequired()) return; ArrayList<Integer> tethered = new ArrayList<>(); @@ -1545,7 +1537,6 @@ public class Tethering extends BaseNetworkObserver { return; } - mCarrierConfigChange.startListening(); mSimChange.startListening(); mUpstreamNetworkMonitor.start(); @@ -1563,7 +1554,6 @@ public class Tethering extends BaseNetworkObserver { mOffload.stop(); mUpstreamNetworkMonitor.stop(); mSimChange.stopListening(); - mCarrierConfigChange.stopListening(); notifyDownstreamsOfNewUpstreamIface(null); handleNewUpstreamNetworkState(null); } diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java index 09bce7f4feb6..454c579ed0a7 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java @@ -21,14 +21,23 @@ import static android.net.ConnectivityManager.TYPE_ETHERNET; import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_MOBILE_DUN; import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; +import static com.android.internal.R.array.config_mobile_hotspot_provision_app; +import static com.android.internal.R.array.config_tether_bluetooth_regexs; +import static com.android.internal.R.array.config_tether_dhcp_range; +import static com.android.internal.R.array.config_tether_usb_regexs; +import static com.android.internal.R.array.config_tether_upstream_types; +import static com.android.internal.R.array.config_tether_wifi_regexs; +import static com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui; import android.content.Context; import android.content.res.Resources; import android.net.ConnectivityManager; -import android.telephony.TelephonyManager; import android.net.util.SharedLog; +import android.telephony.TelephonyManager; +import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.R; import java.io.PrintWriter; import java.util.ArrayList; @@ -51,6 +60,8 @@ import java.util.StringJoiner; public class TetheringConfiguration { private static final String TAG = TetheringConfiguration.class.getSimpleName(); + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + @VisibleForTesting public static final int DUN_NOT_REQUIRED = 0; public static final int DUN_REQUIRED = 1; @@ -79,18 +90,18 @@ public class TetheringConfiguration { public final String[] dhcpRanges; public final String[] defaultIPv4DNS; + public final String[] provisioningApp; + public final String provisioningAppNoUi; + public TetheringConfiguration(Context ctx, SharedLog log) { final SharedLog configLog = log.forSubComponent("config"); - tetherableUsbRegexs = ctx.getResources().getStringArray( - com.android.internal.R.array.config_tether_usb_regexs); + tetherableUsbRegexs = getResourceStringArray(ctx, config_tether_usb_regexs); // TODO: Evaluate deleting this altogether now that Wi-Fi always passes // us an interface name. Careful consideration needs to be given to // implications for Settings and for provisioning checks. - tetherableWifiRegexs = ctx.getResources().getStringArray( - com.android.internal.R.array.config_tether_wifi_regexs); - tetherableBluetoothRegexs = ctx.getResources().getStringArray( - com.android.internal.R.array.config_tether_bluetooth_regexs); + tetherableWifiRegexs = getResourceStringArray(ctx, config_tether_wifi_regexs); + tetherableBluetoothRegexs = getResourceStringArray(ctx, config_tether_bluetooth_regexs); dunCheck = checkDunRequired(ctx); configLog.log("DUN check returned: " + dunCheckString(dunCheck)); @@ -101,6 +112,9 @@ public class TetheringConfiguration { dhcpRanges = getDhcpRanges(ctx); defaultIPv4DNS = copy(DEFAULT_IPV4_DNS); + provisioningApp = getResourceStringArray(ctx, config_mobile_hotspot_provision_app); + provisioningAppNoUi = getProvisioningAppNoUi(ctx); + configLog.log(toString()); } @@ -116,6 +130,10 @@ public class TetheringConfiguration { return matchesDownstreamRegexs(iface, tetherableBluetoothRegexs); } + public boolean hasMobileHotspotProvisionApp() { + return !TextUtils.isEmpty(provisioningAppNoUi); + } + public void dump(PrintWriter pw) { dumpStringArray(pw, "tetherableUsbRegexs", tetherableUsbRegexs); dumpStringArray(pw, "tetherableWifiRegexs", tetherableWifiRegexs); @@ -129,6 +147,10 @@ public class TetheringConfiguration { dumpStringArray(pw, "dhcpRanges", dhcpRanges); dumpStringArray(pw, "defaultIPv4DNS", defaultIPv4DNS); + + dumpStringArray(pw, "provisioningApp", provisioningApp); + pw.print("provisioningAppNoUi: "); + pw.println(provisioningAppNoUi); } public String toString() { @@ -140,6 +162,8 @@ public class TetheringConfiguration { sj.add(String.format("isDunRequired:%s", isDunRequired)); sj.add(String.format("preferredUpstreamIfaceTypes:%s", makeString(preferredUpstreamNames(preferredUpstreamIfaceTypes)))); + sj.add(String.format("provisioningApp:%s", makeString(provisioningApp))); + sj.add(String.format("provisioningAppNoUi:%s", provisioningAppNoUi)); return String.format("TetheringConfiguration{%s}", sj.toString()); } @@ -159,6 +183,7 @@ public class TetheringConfiguration { } private static String makeString(String[] strings) { + if (strings == null) return "null"; final StringJoiner sj = new StringJoiner(",", "[", "]"); for (String s : strings) sj.add(s); return sj.toString(); @@ -195,8 +220,7 @@ public class TetheringConfiguration { } private static Collection<Integer> getUpstreamIfaceTypes(Context ctx, int dunCheck) { - final int ifaceTypes[] = ctx.getResources().getIntArray( - com.android.internal.R.array.config_tether_upstream_types); + final int ifaceTypes[] = ctx.getResources().getIntArray(config_tether_upstream_types); final ArrayList<Integer> upstreamIfaceTypes = new ArrayList<>(ifaceTypes.length); for (int i : ifaceTypes) { switch (i) { @@ -247,14 +271,30 @@ public class TetheringConfiguration { } private static String[] getDhcpRanges(Context ctx) { - final String[] fromResource = ctx.getResources().getStringArray( - com.android.internal.R.array.config_tether_dhcp_range); + final String[] fromResource = getResourceStringArray(ctx, config_tether_dhcp_range); if ((fromResource.length > 0) && (fromResource.length % 2 == 0)) { return fromResource; } return copy(DHCP_DEFAULT_RANGE); } + private static String getProvisioningAppNoUi(Context ctx) { + try { + return ctx.getResources().getString(config_mobile_hotspot_provision_app_no_ui); + } catch (Resources.NotFoundException e) { + return ""; + } + } + + private static String[] getResourceStringArray(Context ctx, int resId) { + try { + final String[] strArray = ctx.getResources().getStringArray(resId); + return (strArray != null) ? strArray : EMPTY_STRING_ARRAY; + } catch (Resources.NotFoundException e404) { + return EMPTY_STRING_ARRAY; + } + } + private static String[] copy(String[] strarray) { return Arrays.copyOf(strarray, strarray.length); } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index c2cbd0612b08..f55061a241f5 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -27,6 +27,7 @@ import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.WorkerThread; import android.app.ActivityThread; import android.app.PendingIntent; @@ -1035,6 +1036,13 @@ public class TelephonyManager { public static final int UNKNOWN_CARRIER_ID = -1; /** + * An unknown carrier id list version. + * @hide + */ + @TestApi + public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; + + /** * Broadcast Action: The subscription carrier identity has changed. * This intent could be sent on the following events: * <ul> @@ -2925,7 +2933,7 @@ public class TelephonyManager { IPhoneSubInfo info = getSubscriberInfo(); if (info == null) return null; - return info.getGroupIdLevel1(mContext.getOpPackageName()); + return info.getGroupIdLevel1ForSubscriber(getSubId(), mContext.getOpPackageName()); } catch (RemoteException ex) { return null; } catch (NullPointerException ex) { @@ -7756,4 +7764,49 @@ public class TelephonyManager { } } } + + /** + * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2, + * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config + * (also any country or carrier overlays) to be loaded when using a test SIM with a call box. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} + * + * @hide + */ + @TestApi + public void setCarrierTestOverride(String mccmnc, String imsi, String iccid, String gid1, + String gid2, String plmn, String spn) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.setCarrierTestOverride( + getSubId(), mccmnc, imsi, iccid, gid1, gid2, plmn, spn); + } + } catch (RemoteException ex) { + // This could happen if binder process crashes. + } + } + + /** + * A test API to return installed carrier id list version + * + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * + * @hide + */ + @TestApi + public int getCarrierIdListVersion() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getCarrierIdListVersion(getSubId()); + } + } catch (RemoteException ex) { + // This could happen if binder process crashes. + } + return UNKNOWN_CARRIER_ID_LIST_VERSION; + } } diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index 602c796aa188..9e3302bd07e0 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -18,6 +18,7 @@ package android.telephony.mbms; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.Intent; import android.net.Uri; import android.os.Parcel; @@ -184,6 +185,7 @@ public final class DownloadRequest implements Parcelable { * @hide */ @SystemApi + @TestApi public Builder setServiceId(String serviceId) { fileServiceId = serviceId; return this; diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl index 0ed0820c888f..93964f3d30a6 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl @@ -68,11 +68,6 @@ interface IPhoneSubInfo { String getSubscriberIdForSubscriber(int subId, String callingPackage); /** - * Retrieves the Group Identifier Level1 for GSM phones. - */ - String getGroupIdLevel1(String callingPackage); - - /** * Retrieves the Group Identifier Level1 for GSM phones of a subId. */ String getGroupIdLevel1ForSubscriber(int subId, String callingPackage); diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 1ace032b5dcf..9b71b8a1b9a5 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1481,4 +1481,17 @@ interface ITelephony { * screen is off) we want to turn on those indications even when the screen is off. */ void setRadioIndicationUpdateMode(int subId, int filters, int mode); + + /** + * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2, + * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config + * (also any country or carrier overlays) to be loaded when using a test SIM with a call box. + */ + void setCarrierTestOverride(int subId, String mccmnc, String imsi, String iccid, String gid1, + String gid2, String plmn, String spn); + + /** + * A test API to return installed carrier id list version. + */ + int getCarrierIdListVersion(int subId); } diff --git a/test-mock/Android.bp b/test-mock/Android.bp index 54e07a1673e7..8fb6fda41f59 100644 --- a/test-mock/Android.bp +++ b/test-mock/Android.bp @@ -40,3 +40,49 @@ java_library_static { // Pin java_version until jarjar is certified to support later versions. http://b/72703434 java_version: "1.8", } + +doc_defaults { + name:"android.test.mock.docs-defaults", + srcs: ["src/android/test/mock/**/*.java"], + + // Includes the main framework source to ensure that doclava has access to the + // visibility information for the base classes of the mock classes. Without it + // otherwise hidden methods could be visible. + srcs_lib: "framework", + srcs_lib_whitelist_dirs: ["core/java"], + srcs_lib_whitelist_pkgs: ["android"], + libs: [ + "core-oj", + "core-libart", + "framework", + "conscrypt", + "okhttp", + "bouncycastle", + "ext", + ], + local_sourcepaths: ["src/android/test/mock"], + custom_template: "droiddoc-templates-sdk", + installable: false, +} + +android_test_mock_docs_args = + "-hide 110 -hide 111 -hide 113 -hide 121 -hide 125 -hide 126 -hide 127 -hide 128 " + + "-stubpackages android.test.mock " + + "-nodocs " + +droiddoc { + name: "android.test.mock.docs", + defaults: ["android.test.mock.docs-defaults"], + + api_tag_name: "ANDROID_TEST_MOCK", + api_filename: "api/android-test-mock-current.txt", + removed_api_filename: "api/android-test-mock-removed.txt", + + args: android_test_mock_docs_args, +} + +java_library_static { + name: "android.test.mock.stubs", + srcs: [":android.test.mock.docs"], + sdk_version: "current", +} diff --git a/test-mock/Android.mk b/test-mock/Android.mk index 15fa12d1298e..08443c973ed3 100644 --- a/test-mock/Android.mk +++ b/test-mock/Android.mk @@ -16,85 +16,30 @@ LOCAL_PATH:= $(call my-dir) -# Includes the main framework source to ensure that doclava has access to the -# visibility information for the base classes of the mock classes. Without it -# otherwise hidden methods could be visible. -android_test_mock_source_files := \ - $(call all-java-files-under, src/android/test/mock) \ - $(call all-java-files-under, ../core/java/android) - -# Generate the stub source files for android.test.mock.stubs -# ========================================================== -include $(CLEAR_VARS) -LOCAL_SRC_FILES := $(android_test_mock_source_files) - -LOCAL_JAVA_LIBRARIES := core-oj core-libart framework conscrypt okhttp bouncycastle -LOCAL_MODULE_CLASS := JAVA_LIBRARIES -LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock - -ANDROID_TEST_MOCK_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/api.txt -ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/removed.txt - -ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt -ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt - -LOCAL_DROIDDOC_OPTIONS:= \ - -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \ - -stubpackages android.test.mock \ - -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/src \ - -nodocs \ - -api $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) \ - -removedApi $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) \ - -LOCAL_UNINSTALLABLE_MODULE := true -LOCAL_MODULE := android-test-mock-api-stubs-gen - -include $(BUILD_DROIDDOC) - -# Remember the target that will trigger the code generation. -android_test_mock_gen_stamp := $(full_target) - -# Add some additional dependencies -$(ANDROID_TEST_MOCK_OUTPUT_API_FILE): $(full_target) -$(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE): $(full_target) - -# Build the android.test.mock.stubs library -# ========================================= -include $(CLEAR_VARS) - -LOCAL_MODULE := android.test.mock.stubs - -LOCAL_SOURCE_FILES_ALL_GENERATED := true - -# Make sure to run droiddoc first to generate the stub source files. -LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_gen_stamp) -android_test_mock_gen_stamp := - -LOCAL_SDK_VERSION := current - -include $(BUILD_STATIC_JAVA_LIBRARY) - # Archive a copy of the classes.jar in SDK build. +full_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,android.test.mock.stubs,,COMMON)/classes.jar $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs.jar) # Check that the android.test.mock.stubs library has not changed # ============================================================== +ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt +ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt # Check that the API we're building hasn't changed from the not-yet-released # SDK version. $(eval $(call check-api, \ check-android-test-mock-api-current, \ $(ANDROID_TEST_MOCK_API_FILE), \ - $(ANDROID_TEST_MOCK_OUTPUT_API_FILE), \ + $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE), \ $(ANDROID_TEST_MOCK_REMOVED_API_FILE), \ - $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE), \ + $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_REMOVED_API_FILE), \ -error 2 -error 3 -error 4 -error 5 -error 6 \ -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \ -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \ -error 25 -error 26 -error 27, \ cat $(LOCAL_PATH)/api/apicheck_msg_android_test_mock.txt, \ check-android-test-mock-api, \ - $(call doc-timestamp-for,android-test-mock-api-stubs-gen) \ + $(OUT_DOCS)/android.test.mock.docs-stubs.srcjar \ )) .PHONY: check-android-test-mock-api @@ -103,8 +48,8 @@ checkapi: check-android-test-mock-api .PHONY: update-android-test-mock-api update-api: update-android-test-mock-api -update-android-test-mock-api: $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) | $(ACP) +update-android-test-mock-api: $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE) | $(ACP) @echo Copying current.txt - $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) $(ANDROID_TEST_MOCK_API_FILE) + $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE) $(ANDROID_TEST_MOCK_API_FILE) @echo Copying removed.txt - $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_REMOVED_API_FILE) + $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_REMOVED_API_FILE) diff --git a/test-runner/Android.bp b/test-runner/Android.bp index a2edb047d9de..9e95369ceca4 100644 --- a/test-runner/Android.bp +++ b/test-runner/Android.bp @@ -31,7 +31,7 @@ java_library { libs: [ "framework", "android.test.base", - "android.test.mock", + "android.test.mock.stubs", ], } @@ -48,7 +48,7 @@ java_library { libs: [ "framework", "android.test.base", - "android.test.mock", + "android.test.mock.stubs", "junit", ], } diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index 8fb87f1277a3..d241b32841cc 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -355,6 +355,7 @@ public class TetheringTest { @Test public void canRequireProvisioning() { setupForRequiredProvisioning(); + sendConfigurationChanged(); assertTrue(mTethering.isTetherProvisioningRequired()); } @@ -363,6 +364,7 @@ public class TetheringTest { setupForRequiredProvisioning(); when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)) .thenReturn(null); + sendConfigurationChanged(); // Couldn't get the CarrierConfigManager, but still had a declared provisioning app. // We therefore still require provisioning. assertTrue(mTethering.isTetherProvisioningRequired()); @@ -372,6 +374,7 @@ public class TetheringTest { public void toleratesCarrierConfigMissing() { setupForRequiredProvisioning(); when(mCarrierConfigManager.getConfig()).thenReturn(null); + sendConfigurationChanged(); // We still have a provisioning app configured, so still require provisioning. assertTrue(mTethering.isTetherProvisioningRequired()); } @@ -411,6 +414,11 @@ public class TetheringTest { mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); } + private void sendConfigurationChanged() { + final Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED); + mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + } + private void verifyInterfaceServingModeStarted() throws Exception { verify(mNMService, times(1)).getInterfaceConfig(TEST_WLAN_IFNAME); verify(mNMService, times(1)) |