diff options
15 files changed, 171 insertions, 42 deletions
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/BaseDefaultPermissionGrantPolicyTest.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/BaseDefaultPermissionGrantPolicyTest.java index 41a38d4f18d..d7a056b9058 100644 --- a/common/device-side/util-axt/src/com/android/compatibility/common/util/BaseDefaultPermissionGrantPolicyTest.java +++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/BaseDefaultPermissionGrantPolicyTest.java @@ -553,6 +553,13 @@ public abstract class BaseDefaultPermissionGrantPolicyTest extends BusinessLogic public static void appendPackagePregrantedPerms(PackageInfo packageInfo, String reason, boolean fixed, Set<String> pregrantedPerms, SparseArray<UidState> outUidStates) { + appendPackagePregrantedPerms(packageInfo, reason, fixed, false, pregrantedPerms, + outUidStates); + } + + public static void appendPackagePregrantedPerms(PackageInfo packageInfo, String reason, + boolean fixed, boolean fromRole, Set<String> pregrantedPerms, + SparseArray<UidState> outUidStates) { final int uid = packageInfo.applicationInfo.uid; UidState uidState = outUidStates.get(uid); if (uidState == null) { @@ -561,6 +568,12 @@ public abstract class BaseDefaultPermissionGrantPolicyTest extends BusinessLogic } for (String requestedPermission : packageInfo.requestedPermissions) { if (pregrantedPerms.contains(requestedPermission)) { + // Role permissions are not fixed. If we're already getting a fixed pregrant, don't + // override with a non-fixed role pregrant + if (fromRole && uidState.grantedPermissions.getOrDefault(requestedPermission, + false)) { + continue; + } uidState.addGrantedPermission(packageInfo.packageName, reason, requestedPermission, fixed); } diff --git a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java index fd0b4450868..eb7528c1729 100644 --- a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java +++ b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java @@ -230,8 +230,15 @@ public class StrictJavaPackagesTest extends BaseHostJUnit4Test { "Landroid/os/BlockUntrustedTouchesMode;", "Landroid/os/IInputConstants;", "Landroid/os/InputEventInjectionResult;", - "Landroid/os/InputEventInjectionSync;" - + "Landroid/os/InputEventInjectionSync;", + // TODO(b/242741880): Remove duplication between sdksandbox-service and + // sdk-sandbox-framework + "Landroid/app/sdksandbox/ILoadSdkCallback;", + "Landroid/app/sdksandbox/IRequestSurfacePackageCallback;", + "Landroid/app/sdksandbox/ISdkSandboxManager;", + "Landroid/app/sdksandbox/ISdkSandboxLifecycleCallback;", + "Landroid/app/sdksandbox/ISendDataCallback;", + "Landroid/app/sdksandbox/ISharedPreferencesSyncCallback;" ); private static final String FEATURE_WEARABLE = "android.hardware.type.watch"; @@ -725,9 +732,12 @@ public class StrictJavaPackagesTest extends BaseHostJUnit4Test { private static final ImmutableSet<String> ADSERVICES_SANDBOX_APK_IN_APEX_BURNDOWN_LIST = ImmutableSet.of( // /apex/com.android.adservices/javalib/service-sdksandbox.jar + "Landroid/app/sdksandbox/ISharedPreferencesSyncCallback;", + "Lcom/android/sdksandbox/IDataReceivedCallback;", + "Lcom/android/sdksandbox/ILoadSdkInSandboxCallback;", + "Lcom/android/sdksandbox/IRequestSurfacePackageFromSdkCallback;", "Lcom/android/sdksandbox/ISdkSandboxManagerToSdkSandboxCallback;", - "Lcom/android/sdksandbox/ISdkSandboxService;", - "Lcom/android/sdksandbox/ISdkSandboxToSdkSandboxManagerCallback;" + "Lcom/android/sdksandbox/ISdkSandboxService;" ); private static final ImmutableMap<String, ImmutableSet<String>> FULL_APK_IN_APEX_BURNDOWN = @@ -1102,7 +1112,8 @@ public class StrictJavaPackagesTest extends BaseHostJUnit4Test { * included in BOOTCLASSPATH, SYSTEMSERVERCLASSPATH and shared library jars */ @Test - public void testNoProtobufClassesWithoutJarjar() { + public void testNoProtobufClassesWithoutJarjar() throws Exception { + assumeTrue(mDeviceSdkLevel.isDeviceAtLeastU()); assertWithMessage("Classes from protobuf libraries must not be included in bootclasspath " + "and systemserverclasspath without being jarjared.") .that(Stream.of(sBootclasspathJars.stream(), diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/appops/AppOpsTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/appops/AppOpsTests.java index c7feda651c3..f07f9d34e64 100644 --- a/hostsidetests/statsdatom/src/android/cts/statsdatom/appops/AppOpsTests.java +++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/appops/AppOpsTests.java @@ -61,12 +61,13 @@ public class AppOpsTests extends DeviceTestCase implements IBuildReceiver { protected void setUp() throws Exception { super.setUp(); - mTransformedFromOp.clear(); - // The hotword op is allowed to all UIDs on TV and Auto devices. - if (!(DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE) - || DeviceUtils.hasFeature(getDevice(), FEATURE_LEANBACK_ONLY))) { - mTransformedFromOp.put(APP_OP_RECORD_AUDIO, APP_OP_RECORD_AUDIO_HOTWORD); - } + // Temporarily commented out until the Trusted Hotword requirement is enforced again. + // mTransformedFromOp.clear(); + // // The hotword op is allowed to all UIDs on TV and Auto devices. + // if (!(DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE) + // || DeviceUtils.hasFeature(getDevice(), FEATURE_LEANBACK_ONLY))) { + // mTransformedFromOp.put(APP_OP_RECORD_AUDIO, APP_OP_RECORD_AUDIO_HOTWORD); + // } assertThat(mCtsBuild).isNotNull(); ConfigUtils.removeConfig(getDevice()); diff --git a/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java index f6b7830cf69..21bdc839bf1 100644 --- a/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java +++ b/tests/camera/src/android/hardware/camera2/cts/CameraManagerTest.java @@ -27,7 +27,6 @@ import android.content.pm.PackageManager; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; -import android.hardware.camera2.CameraDevice.StateCallback; import android.hardware.camera2.CameraManager; import android.hardware.camera2.cts.Camera2ParameterizedTestCase; import android.hardware.camera2.cts.CameraTestUtils.HandlerExecutor; @@ -163,6 +162,15 @@ public class CameraManagerTest extends Camera2ParameterizedTestCase { ids.length == 0 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)); + if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { + // Camera placement on automotive device is different than usual front/back + // on mobile phones and use automotive.lens.facing instead. lens.facing is only used for + // external camera.testCameraManagerAutomotiveCameras ensures that lens.facing is only + // used for EXTERNAL camera. Hence, skipping this test for automotive implementations + Log.i(TAG, "Skip rest of the test on automotive device implementations"); + return; + } + /** * Test: that if the device has front or rear facing cameras, then there * must be matched system features. @@ -989,15 +997,23 @@ public class CameraManagerTest extends Camera2ParameterizedTestCase { * android.automotive.lens.facing values */ Map<Pair<Integer, Integer>, ArrayList<String>> cameraGroup = new HashMap<>(); + boolean externalCameraConnected = false; for (String cameraId : cameraIds) { CameraCharacteristics props = mCameraManager.getCameraCharacteristics(cameraId); assertNotNull( String.format("Can't get camera characteristics from: ID %s", cameraId), props); Integer lensFacing = props.get(CameraCharacteristics.LENS_FACING); - if (lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL) { - // Automotive device implementations may have external cameras but they are exempted - // from this test case. + + if (lensFacing != null) { + // Automotive device implementations can use android.lens.facing + // only for external cameras + assertTrue("android.lens.facing should only be used for external cameras", + lensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL); + // Test that there is matching feature flag + assertTrue("System doesn't have external camera feature", + mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL)); + externalCameraConnected = true; continue; } @@ -1028,6 +1044,13 @@ public class CameraManagerTest extends Camera2ParameterizedTestCase { } } + // Test an external camera is connected if FEATURE_CAMERA_EXTERNAL is advertised + if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL)) { + assertTrue("External camera is not connected on device with FEATURE_CAMERA_EXTERNAL", + externalCameraConnected); + } + + for (Map.Entry<Pair<Integer, Integer>, ArrayList<String>> entry : cameraGroup.entrySet()) { ArrayList<String> cameraIdsToVerify = entry.getValue(); if (cameraIdsToVerify.size() > 1) { diff --git a/tests/media/src/android/mediav2/cts/CodecTestBase.java b/tests/media/src/android/mediav2/cts/CodecTestBase.java index 6065c5c8be7..d58f9bf3e85 100644 --- a/tests/media/src/android/mediav2/cts/CodecTestBase.java +++ b/tests/media/src/android/mediav2/cts/CodecTestBase.java @@ -590,17 +590,12 @@ class OutputManager { abstract class CodecTestBase { public static final boolean IS_Q = ApiLevelUtil.getApiLevel() == Build.VERSION_CODES.Q; public static final boolean IS_AT_LEAST_R = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R); - // Checking for CODENAME helps in cases when build version on the development branch isn't - // updated yet but CODENAME is updated. public static final boolean IS_AT_LEAST_T = - ApiLevelUtil.isAtLeast(Build.VERSION_CODES.TIRAMISU) || - ApiLevelUtil.codenameEquals("Tiramisu"); - // TODO (b/223868241) Update the following to check for Build.VERSION_CODES.TIRAMISU once - // TIRAMISU is set correctly + ApiLevelUtil.isAtLeast(Build.VERSION_CODES.TIRAMISU); public static final boolean FIRST_SDK_IS_AT_LEAST_T = - ApiLevelUtil.isFirstApiAfter(Build.VERSION_CODES.S_V2); + ApiLevelUtil.isFirstApiAtLeast(Build.VERSION_CODES.TIRAMISU); public static final boolean VNDK_IS_AT_LEAST_T = - SystemProperties.getInt("ro.vndk.version", 0) > Build.VERSION_CODES.S_V2; + SystemProperties.getInt("ro.vndk.version", 0) >= Build.VERSION_CODES.TIRAMISU; public static final boolean IS_HDR_EDITING_SUPPORTED = isHDREditingSupported(); private static final String LOG_TAG = CodecTestBase.class.getSimpleName(); enum SupportClass { diff --git a/tests/tests/media/misc/Android.bp b/tests/tests/media/misc/Android.bp index feaabe47a4c..74237920845 100644 --- a/tests/tests/media/misc/Android.bp +++ b/tests/tests/media/misc/Android.bp @@ -106,6 +106,7 @@ android_test { "cts", "general-tests", "mts-media", + "sts", ], host_required: ["cts-dynamic-config"], min_sdk_version: "29", diff --git a/tests/tests/media/misc/AndroidTest.xml b/tests/tests/media/misc/AndroidTest.xml index 4a2ffaf9d33..1facb8d3933 100644 --- a/tests/tests/media/misc/AndroidTest.xml +++ b/tests/tests/media/misc/AndroidTest.xml @@ -40,7 +40,7 @@ </target_preparer> <target_preparer class="com.android.compatibility.common.tradefed.targetprep.MediaPreparer"> <option name="push-all" value="true" /> - <option name="media-folder-name" value="CtsMediaMiscTestCases-1.0" /> + <option name="media-folder-name" value="CtsMediaMiscTestCases-2.0" /> <option name="dynamic-config-module" value="CtsMediaMiscTestCases" /> </target_preparer> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> diff --git a/tests/tests/media/misc/DynamicConfig.xml b/tests/tests/media/misc/DynamicConfig.xml index 09e5fbaf95f..51e05bbba75 100644 --- a/tests/tests/media/misc/DynamicConfig.xml +++ b/tests/tests/media/misc/DynamicConfig.xml @@ -15,6 +15,6 @@ <dynamicConfig> <entry key="media_files_url"> - <value>https://storage.googleapis.com/android_media/cts/tests/tests/media/misc/CtsMediaMiscTestCases-1.0.zip</value> + <value>https://storage.googleapis.com/android_media/cts/tests/tests/media/misc/CtsMediaMiscTestCases-2.0.zip</value> </entry> </dynamicConfig> diff --git a/tests/tests/media/misc/copy_media.sh b/tests/tests/media/misc/copy_media.sh index 96f5a499d3b..27ba1e73422 100755 --- a/tests/tests/media/misc/copy_media.sh +++ b/tests/tests/media/misc/copy_media.sh @@ -17,4 +17,4 @@ [ -z "$MEDIA_ROOT_DIR" ] && MEDIA_ROOT_DIR=$(dirname $0)/.. source $MEDIA_ROOT_DIR/common/copy_media_utils.sh get_adb_options "$@" -copy_media "misc" "CtsMediaMiscTestCases-1.0" +copy_media "misc" "CtsMediaMiscTestCases-2.0" diff --git a/tests/tests/media/misc/src/android/media/misc/cts/MediaSessionTest.java b/tests/tests/media/misc/src/android/media/misc/cts/MediaSessionTest.java index 6edadaaa332..cf4f6d09a68 100644 --- a/tests/tests/media/misc/src/android/media/misc/cts/MediaSessionTest.java +++ b/tests/tests/media/misc/src/android/media/misc/cts/MediaSessionTest.java @@ -16,6 +16,7 @@ package android.media.misc.cts; import static android.media.AudioAttributes.USAGE_GAME; +import static android.media.cts.Utils.compareRemoteUserInfo; import static android.media.misc.cts.MediaSessionTestService.KEY_EXPECTED_QUEUE_SIZE; import static android.media.misc.cts.MediaSessionTestService.KEY_EXPECTED_TOTAL_NUMBER_OF_ITEMS; import static android.media.misc.cts.MediaSessionTestService.KEY_SESSION_TOKEN; @@ -24,11 +25,11 @@ import static android.media.misc.cts.MediaSessionTestService.STEP_CLEAN_UP; import static android.media.misc.cts.MediaSessionTestService.STEP_SET_UP; import static android.media.misc.cts.MediaSessionTestService.TEST_SERIES_OF_SET_QUEUE; import static android.media.misc.cts.MediaSessionTestService.TEST_SET_QUEUE; -import static android.media.cts.Utils.compareRemoteUserInfo; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.media.AudioAttributes; import android.media.AudioManager; @@ -51,10 +52,13 @@ import android.os.Looper; import android.os.Parcel; import android.os.Process; import android.platform.test.annotations.AppModeFull; +import android.platform.test.annotations.AsbSecurityTest; import android.test.AndroidTestCase; import android.text.TextUtils; import android.view.KeyEvent; +import com.android.compatibility.common.util.ApiTest; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -80,6 +84,11 @@ public class MediaSessionTest extends AndroidTestCase { private static final long TEST_ACTION = 55L; private static final int TEST_TOO_MANY_SESSION_COUNT = 1000; + private static final String TEST_SESSION_TAG_FOREIGN_PACKAGE = + "test-session-tag-foreign-package"; + private static final String TEST_FOREIGN_PACKAGE_NAME = "fakepackage"; + private static final String TEST_FOREIGN_PACKAGE_CLASS = "com.fakepackage.media.FakeReceiver"; + private AudioManager mAudioManager; private Handler mHandler = new Handler(Looper.getMainLooper()); private Object mWaitLock = new Object(); @@ -307,6 +316,47 @@ public class MediaSessionTest extends AndroidTestCase { } } + @ApiTest(apis = {"android.media.session.MediaSession#setMediaButtonBroadcastReceiver"}) + @AsbSecurityTest(cveBugId = 238177121) + public void testSetMediaButtonBroadcastReceiver_withForeignPackageName_fails() + throws Exception { + Utils.assertMediaPlaybackStarted(getContext()); + + // Create Media Session + MyContextWrapper contextWrapper = new MyContextWrapper(getContext()); + MediaSession mediaSession = + new MediaSession(contextWrapper, TEST_SESSION_TAG_FOREIGN_PACKAGE); + + // Bypass client-side check + contextWrapper.mOverridePackageName = TEST_FOREIGN_PACKAGE_NAME; + + try { + mediaSession.setMediaButtonBroadcastReceiver( + new ComponentName(TEST_FOREIGN_PACKAGE_NAME, TEST_FOREIGN_PACKAGE_CLASS)); + fail("Component name with different package name was registered."); + } catch (IllegalArgumentException ex) { + // Expected. + } finally { + mediaSession.release(); + } + } + + static class MyContextWrapper extends ContextWrapper { + String mOverridePackageName; + + MyContextWrapper(Context base) { + super(base); + } + + @Override + public String getPackageName() { + if (mOverridePackageName != null) { + return mOverridePackageName; + } + return super.getPackageName(); + } + } + /** * Test whether media button receiver can be a explicit broadcast receiver via * MediaSession.setMediaButtonReceiver(PendingIntent). diff --git a/tests/tests/media/misc/src/android/media/misc/cts/WorkDir.java b/tests/tests/media/misc/src/android/media/misc/cts/WorkDir.java index 0c392295e04..dbb60353267 100644 --- a/tests/tests/media/misc/src/android/media/misc/cts/WorkDir.java +++ b/tests/tests/media/misc/src/android/media/misc/cts/WorkDir.java @@ -20,6 +20,6 @@ import android.media.cts.WorkDirBase; class WorkDir extends WorkDirBase { public static final String getMediaDirString() { - return getMediaDirString("CtsMediaMiscTestCases-1.0"); + return getMediaDirString("CtsMediaMiscTestCases-2.0"); } } diff --git a/tests/tests/permission/src/android/permission/cts/BaseNotificationListenerCheckTest.java b/tests/tests/permission/src/android/permission/cts/BaseNotificationListenerCheckTest.java index 9daeff2af4a..f88b7ecbbaa 100644 --- a/tests/tests/permission/src/android/permission/cts/BaseNotificationListenerCheckTest.java +++ b/tests/tests/permission/src/android/permission/cts/BaseNotificationListenerCheckTest.java @@ -104,7 +104,7 @@ public class BaseNotificationListenerCheckTest { private static final String PROPERTY_NOTIFICATION_LISTENER_CHECK_INTERVAL_MILLIS = "notification_listener_check_interval_millis"; - private static final Long OVERRIDE_NOTIFICATION_LISTENER_CHECK_INTERVAL_MILLIS = + protected static final Long OVERRIDE_NOTIFICATION_LISTENER_CHECK_INTERVAL_MILLIS = SECONDS.toMillis(1); private static final String PROPERTY_JOB_SCHEDULER_MAX_JOB_PER_RATE_LIMIT_WINDOW = diff --git a/tests/tests/permission/src/android/permission/cts/NotificationListenerCheckTest.java b/tests/tests/permission/src/android/permission/cts/NotificationListenerCheckTest.java index 3ee161f67e0..88006b999a7 100644 --- a/tests/tests/permission/src/android/permission/cts/NotificationListenerCheckTest.java +++ b/tests/tests/permission/src/android/permission/cts/NotificationListenerCheckTest.java @@ -151,6 +151,25 @@ public class NotificationListenerCheckTest extends BaseNotificationListenerCheck } @Test + public void notificationIsShownAgainAfterDisableAndReenableAppNotificationListener() + throws Throwable { + runNotificationListenerCheck(); + + eventually(() -> assertNotNull(getNotification(true)), UNEXPECTED_TIMEOUT_MILLIS); + + // Disallow NLS, and run NLS check job. This should clear NLS off notified list + disallowTestAppNotificationListenerService(); + runNotificationListenerCheck(); + + // Re-allow NLS, and run NLS check job. This work now that it's cleared NLS off notified + // list + allowTestAppNotificationListenerService(); + runNotificationListenerCheck(); + + eventually(() -> assertNotNull(getNotification(true)), UNEXPECTED_TIMEOUT_MILLIS); + } + + @Test public void removeNotificationOnUninstall() throws Throwable { runNotificationListenerCheck(); diff --git a/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt b/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt index 872a243ce2e..d5bd49bdf37 100644 --- a/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt +++ b/tests/tests/permission4/src/android/permission4/cts/CameraMicIndicatorsPermissionTest.kt @@ -297,7 +297,7 @@ class CameraMicIndicatorsPermissionTest { // indicator uiDevice.openQuickSettings() assertPrivacyChipAndIndicatorsPresent( - useMic || useHotword, + useMic, useCamera, chainUsage, safetyCenterEnabled @@ -392,11 +392,13 @@ class CameraMicIndicatorsPermissionTest { chainUsage: Boolean, safetyCenterEnabled: Boolean = false ) { - // Ensure the privacy chip is present - eventually { - val privacyChip = uiDevice.findObject(UiSelector().resourceId(PRIVACY_CHIP_ID)) - assertTrue("view with id $PRIVACY_CHIP_ID not found", privacyChip.exists()) - privacyChip.click() + // Ensure the privacy chip is present (or not) + val chipFound = isChipPresent() + if (useMic || useCamera) { + assertTrue("Did not find chip", chipFound) + } else { // hotword + assertFalse("Found chip, but did not expect to", chipFound) + return } eventually { @@ -470,6 +472,21 @@ class CameraMicIndicatorsPermissionTest { } } + private fun isChipPresent(): Boolean { + var chipFound = false + try { + eventually { + val privacyChip = uiDevice.findObject(By.res(PRIVACY_CHIP_ID)) + assertNotNull("view with id $PRIVACY_CHIP_ID not found", privacyChip) + privacyChip.click() + chipFound = true + } + } catch (e: Exception) { + // Handle more gracefully after + } + return chipFound + } + private fun pressBack() { uiDevice.pressBack() waitForIdle() diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java index 464a24b6b41..55eb2556d32 100644 --- a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java +++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java @@ -2912,13 +2912,6 @@ public class WifiManagerTest extends WifiJUnit3TestBase { verifySetGetSoftApConfig(softApConfigBuilder.build()); } - // Test 11 AX control config. - if (callback.getCurrentSoftApCapability() - .areFeaturesSupported(SoftApCapability.SOFTAP_FEATURE_IEEE80211_AX)) { - softApConfigBuilder.setIeee80211axEnabled(true); - verifySetGetSoftApConfig(softApConfigBuilder.build()); - } - // Test 11 BE control config if (ApiLevelUtil.isAtLeast(Build.VERSION_CODES.TIRAMISU)) { if (callback.getCurrentSoftApCapability() @@ -2929,6 +2922,12 @@ public class WifiManagerTest extends WifiJUnit3TestBase { } if (ApiLevelUtil.isAtLeast(Build.VERSION_CODES.S)) { + // Test 11 AX control config. + if (callback.getCurrentSoftApCapability() + .areFeaturesSupported(SoftApCapability.SOFTAP_FEATURE_IEEE80211_AX)) { + softApConfigBuilder.setIeee80211axEnabled(true); + verifySetGetSoftApConfig(softApConfigBuilder.build()); + } softApConfigBuilder.setBridgedModeOpportunisticShutdownEnabled(false); verifySetGetSoftApConfig(softApConfigBuilder.build()); } |