Merge "Update setSimslotMapping TestCase" into stage-aosp-tm-ts-dev
diff --git a/apps/CameraITS/tests/scene2_a/test_auto_flash.py b/apps/CameraITS/tests/scene2_a/test_auto_flash.py
index c00cd5c..9111e80 100644
--- a/apps/CameraITS/tests/scene2_a/test_auto_flash.py
+++ b/apps/CameraITS/tests/scene2_a/test_auto_flash.py
@@ -184,8 +184,7 @@
logging.debug('AE_STATE (cap): %s', ae_state)
flash_state = FLASH_STATES[metadata['android.flash.state']]
logging.debug('FLASH_STATE: %s', flash_state)
- # FLASH_REQUIRED and FLASH_FIRED
- if ae_state == 'FLASH_REQUIRED' and flash_state == 'FLASH_STATE_FIRED':
+ if flash_state == 'FLASH_STATE_FIRED':
logging.debug('Flash fired')
flash_fired = True
flash_exp_x_iso = exp*iso
diff --git a/apps/CameraITS/tests/scene4/test_preview_stabilization_fov.py b/apps/CameraITS/tests/scene4/test_preview_stabilization_fov.py
index 2781f18..4140ea7 100644
--- a/apps/CameraITS/tests/scene4/test_preview_stabilization_fov.py
+++ b/apps/CameraITS/tests/scene4/test_preview_stabilization_fov.py
@@ -149,6 +149,10 @@
'First API level should be {} or higher. Found {}.'.format(
its_session_utils.ANDROID13_API_LEVEL, first_api_level))
+ # Get ffmpeg version being used.
+ ffmpeg_version = video_processing_utils.get_ffmpeg_version()
+ logging.debug('ffmpeg_version: %s', ffmpeg_version)
+
supported_stabilization_modes = props[
'android.control.availableVideoStabilizationModes'
]
diff --git a/apps/CameraITS/tests/scene4/test_video_aspect_ratio_and_crop.py b/apps/CameraITS/tests/scene4/test_video_aspect_ratio_and_crop.py
index 4921ff4..bf37f0e 100644
--- a/apps/CameraITS/tests/scene4/test_video_aspect_ratio_and_crop.py
+++ b/apps/CameraITS/tests/scene4/test_video_aspect_ratio_and_crop.py
@@ -168,6 +168,10 @@
run_crop_test = full_or_better and raw_avlb
+ # Get ffmpeg version being used.
+ ffmpeg_version = video_processing_utils.get_ffmpeg_version()
+ logging.debug('ffmpeg_version: %s', ffmpeg_version)
+
for quality_profile_id_pair in supported_video_qualities:
quality = quality_profile_id_pair.split(':')[0]
profile_id = quality_profile_id_pair.split(':')[-1]
diff --git a/apps/CameraITS/tests/sensor_fusion/test_preview_stabilization.py b/apps/CameraITS/tests/sensor_fusion/test_preview_stabilization.py
index e190951..d90960b 100644
--- a/apps/CameraITS/tests/sensor_fusion/test_preview_stabilization.py
+++ b/apps/CameraITS/tests/sensor_fusion/test_preview_stabilization.py
@@ -128,6 +128,10 @@
'Preview Stabilization not supported',
)
+ # Get ffmpeg version being used.
+ ffmpeg_version = video_processing_utils.get_ffmpeg_version()
+ logging.debug('ffmpeg_version: %s', ffmpeg_version)
+
# Raise error if not FRONT or REAR facing camera
facing = props['android.lens.facing']
if (facing != camera_properties_utils.LENS_FACING_BACK
diff --git a/apps/CameraITS/tests/sensor_fusion/test_video_stabilization.py b/apps/CameraITS/tests/sensor_fusion/test_video_stabilization.py
index 195d567..d09ee5f 100644
--- a/apps/CameraITS/tests/sensor_fusion/test_video_stabilization.py
+++ b/apps/CameraITS/tests/sensor_fusion/test_video_stabilization.py
@@ -147,6 +147,10 @@
vendor_api_level >= its_session_utils.ANDROID13_API_LEVEL and
_VIDEO_STABILIZATION_MODE in supported_stabilization_modes)
+ # Get ffmpeg version being used.
+ ffmpeg_version = video_processing_utils.get_ffmpeg_version()
+ logging.debug('ffmpeg_version: %s', ffmpeg_version)
+
# Raise error if not FRONT or REAR facing camera
facing = props['android.lens.facing']
if (facing != camera_properties_utils.LENS_FACING_FRONT and
diff --git a/apps/CameraITS/utils/video_processing_utils.py b/apps/CameraITS/utils/video_processing_utils.py
index 5eab20c..432e7c3 100644
--- a/apps/CameraITS/utils/video_processing_utils.py
+++ b/apps/CameraITS/utils/video_processing_utils.py
@@ -19,6 +19,7 @@
import logging
import os.path
import subprocess
+import error_util
ITS_SUPPORTED_QUALITIES = (
@@ -40,6 +41,18 @@
)
+def get_ffmpeg_version():
+ """Returns the ffmpeg version being used."""
+
+ ffmpeg_version_cmd = ('ffmpeg -version')
+ p = subprocess.Popen(ffmpeg_version_cmd, shell=True, stdout=subprocess.PIPE)
+ output, _ = p.communicate()
+ if p.poll() != 0:
+ raise error_util.CameraItsError('Error running ffmpeg version cmd.')
+ decoded_output = output.decode('utf-8')
+ return decoded_output.split(' ')[2]
+
+
def extract_key_frames_from_video(log_path, video_file_name):
"""Returns a list of extracted key frames.
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 24afb23..b2513e9 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -5753,6 +5753,8 @@
android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
<meta-data android:name="display_mode"
android:value="multi_display_mode" />
+ <meta-data android:name="ApiTest"
+ android:value="android.content.Intent#CATEGORY_CAR_DOCK" />
</activity>
<activity android:name=".car.CarDockActivity"
@@ -5765,6 +5767,8 @@
</intent-filter>
<meta-data android:name="display_mode"
android:value="multi_display_mode" />
+ <meta-data android:name="ApiTest"
+ android:value="android.content.Intent#CATEGORY_CAR_DOCK" />
</activity>
<!-- See explaination in CarDockTestActivity.java -->
@@ -5794,6 +5798,7 @@
<meta-data android:name="test_category" android:value="@string/test_category_car" />
<meta-data android:name="test_required_features"
android:value="android.hardware.type.automotive"/>
+ <meta-data android:name="CddTest" android:value="8.3/A-1-3|8.3/A-1-4" />
</activity>
<activity android:name=".car.PowerPolicyTestActivity"
@@ -5808,6 +5813,8 @@
android:value="android.hardware.type.automotive"/>
<meta-data android:name="display_mode"
android:value="multi_display_mode" />
+ <meta-data android:name="ApiTest"
+ android:value="android.car.hardware.power.CarPowerManager#getCurrentPowerPolicy" />
</activity>
<activity-alias android:name=".car.CarDockActivity2"
@@ -5837,6 +5844,8 @@
android:value="android.hardware.type.automotive"/>
<meta-data android:name="display_mode"
android:value="multi_display_mode" />
+ <meta-data android:name="ApiTest"
+ android:value="android.car.VehiclePropertyIds#GEAR_SELECTION" />
</activity>
<activity android:name=".car.ParkingBrakeOnTestActivity"
@@ -5852,6 +5861,8 @@
android:value="android.hardware.type.automotive"/>
<meta-data android:name="display_mode"
android:value="multi_display_mode" />
+ <meta-data android:name="ApiTest"
+ android:value="android.car.VehiclePropertyIds#PARKING_BRAKE_ON" />
</activity>
<activity android:name=".car.CarLauncherTestActivity"
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioInputRoutingNotificationsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioInputRoutingNotificationsActivity.java
index 38d99b4..030e44f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioInputRoutingNotificationsActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioInputRoutingNotificationsActivity.java
@@ -32,6 +32,7 @@
import com.android.compatibility.common.util.ResultType;
import com.android.compatibility.common.util.ResultUnit;
+import com.android.cts.verifier.audio.audiolib.AudioDeviceUtils;
import com.android.cts.verifier.CtsVerifierReportLog;
import com.android.cts.verifier.R;
@@ -127,14 +128,8 @@
String msg = mContext.getResources().getString(
R.string.audio_routingnotification_recordRoutingMsg);
AudioDeviceInfo routedDevice = audioRecord.getRoutedDevice();
- CharSequence deviceName = routedDevice != null ? routedDevice.getProductName() : "none";
- mConnectedPeripheralName = deviceName.toString();
-
- int deviceType = routedDevice != null ? routedDevice.getType() : -1;
- textView.setText(msg + " - " +
- deviceName + " [0x" + Integer.toHexString(deviceType) + "]" +
- " - " + mNumRoutingNotifications);
-
+ mConnectedPeripheralName = AudioDeviceUtils.formatDeviceName(routedDevice);
+ textView.setText(msg + ": " + mConnectedPeripheralName);
mRoutingNotificationReceived = true;
calculatePass();
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioOutputRoutingNotificationsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioOutputRoutingNotificationsActivity.java
index 591fe9b..1ece2f1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioOutputRoutingNotificationsActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioOutputRoutingNotificationsActivity.java
@@ -32,6 +32,7 @@
import com.android.compatibility.common.util.ResultType;
import com.android.compatibility.common.util.ResultUnit;
+import com.android.cts.verifier.audio.audiolib.AudioDeviceUtils;
import com.android.cts.verifier.CtsVerifierReportLog;
import com.android.cts.verifier.R;
@@ -131,13 +132,8 @@
String msg = mContext.getResources().getString(
R.string.audio_routingnotification_trackRoutingMsg);
AudioDeviceInfo routedDevice = audioTrack.getRoutedDevice();
- CharSequence deviceName = routedDevice != null ? routedDevice.getProductName() : "none";
- mConnectedPeripheralName = deviceName.toString();
- int deviceType = routedDevice != null ? routedDevice.getType() : -1;
- textView.setText(msg + " - " +
- deviceName + " [0x" + Integer.toHexString(deviceType) + "]" +
- " - " + mNumRoutingNotifications);
-
+ mConnectedPeripheralName = AudioDeviceUtils.formatDeviceName(routedDevice);
+ textView.setText(msg + ": " + mConnectedPeripheralName);
mRoutingNotificationReceived = true;
calculatePass();
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/audiolib/AudioDeviceUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/audiolib/AudioDeviceUtils.java
new file mode 100644
index 0000000..c066942
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/audiolib/AudioDeviceUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.audio.audiolib;
+
+import android.media.AudioDeviceInfo;
+
+import java.util.HashMap;
+
+/**
+ * Utility methods for AudioDevices
+ */
+public class AudioDeviceUtils {
+ /*
+ * Channel Mask Utilities
+ */
+ private static final HashMap<Integer, String> sDeviceTypeStrings =
+ new HashMap<Integer, String>();
+
+ private static void initDeviceTypeStrings() {
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_UNKNOWN, "TYPE_UNKNOWN");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE, "TYPE_BUILTIN_EARPIECE");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, "TYPE_BUILTIN_SPEAKER");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_WIRED_HEADSET, "TYPE_WIRED_HEADSET");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, "TYPE_WIRED_HEADPHONES");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_LINE_ANALOG, "TYPE_LINE_ANALOG");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_LINE_DIGITAL, "TYPE_LINE_DIGITAL");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BLUETOOTH_SCO, "TYPE_BLUETOOTH_SCO");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP, "TYPE_BLUETOOTH_A2DP");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_HDMI, "TYPE_HDMI");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_HDMI_ARC, "TYPE_HDMI_ARC");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_USB_DEVICE, "TYPE_USB_DEVICE");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_USB_ACCESSORY, "TYPE_USB_ACCESSORY");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_DOCK, "TYPE_DOCK");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_FM, "TYPE_FM");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BUILTIN_MIC, "TYPE_BUILTIN_MIC");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_FM_TUNER, "TYPE_FM_TUNER");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_TV_TUNER, "TYPE_TV_TUNER");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_TELEPHONY, "TYPE_TELEPHONY");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_AUX_LINE, "TYPE_AUX_LINE");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_IP, "TYPE_IP");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BUS, "TYPE_BUS");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_USB_HEADSET, "TYPE_USB_HEADSET");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_HEARING_AID, "TYPE_HEARING_AID");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER_SAFE,
+ "TYPE_BUILTIN_SPEAKER_SAFE");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_REMOTE_SUBMIX, "TYPE_REMOTE_SUBMIX");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BLE_HEADSET, "TYPE_BLE_HEADSET");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BLE_SPEAKER, "TYPE_BLE_SPEAKER");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_ECHO_REFERENCE, "TYPE_ECHO_REFERENCE");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_HDMI_EARC, "TYPE_HDMI_EARC");
+ sDeviceTypeStrings.put(AudioDeviceInfo.TYPE_BLE_BROADCAST, "TYPE_BLE_BROADCAST");
+ }
+
+ static {
+ initDeviceTypeStrings();
+ }
+
+ /**
+ * @param deviceType
+ * @return a human-readable device type name.
+ */
+ public static String getDeviceTypeName(int deviceType) {
+ String typeName = sDeviceTypeStrings.get(deviceType);
+ return typeName != null ? typeName : "invalid type";
+ }
+
+ /**
+ * @param deviceInfo
+ * @return A human-readable description of the specified DeviceInfo
+ */
+ public static String formatDeviceName(AudioDeviceInfo deviceInfo) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(deviceInfo.getProductName());
+ sb.append(" - " + getDeviceTypeName(deviceInfo.getType()));
+ return sb.toString();
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index 106bd0b..1ac6b0f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -2133,7 +2133,7 @@
int fileFormat = MediaRecorder.OutputFormat.DEFAULT;
String outputFilePath = getOutputMediaFile(cameraDeviceId, videoSize,
- /* quality= */"preview", fileFormat, /* stabilized= */ true);
+ /* quality= */"preview", fileFormat, stabilize);
assert outputFilePath != null;
mMediaRecorder = new MediaRecorder(this);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
index d23d43b..42ad218 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
@@ -116,7 +116,7 @@
private TestListItem mDisableLocationModeThroughMainSwitchTest;
private TestListItem mDisableLocationModeThroughWorkSwitchTest;
private TestListItem mPrimaryLocationWhenWorkDisabledTest;
- private DialogTestListItem mSelectWorkChallenge;
+ //private DialogTestListItem mSelectWorkChallenge;
private DialogTestListItem mConfirmWorkCredentials;
private DialogTestListItem mPatternWorkChallenge;
private DialogTestListItem mParentProfilePassword;
@@ -472,12 +472,13 @@
R.string.profile_owner_permission_lockdown_test_info,
permissionCheckIntent);
+ /* Disable due to b/241498104
mSelectWorkChallenge = new DialogTestListItem(this,
R.string.provisioning_byod_select_work_challenge,
"BYOD_SelectWorkChallenge",
R.string.provisioning_byod_select_work_challenge_description,
new Intent(ByodHelperActivity.ACTION_TEST_SELECT_WORK_CHALLENGE));
-
+ */
mRecentsTest = TestListItem.newTest(this,
R.string.provisioning_byod_recents,
RecentsRedactionActivity.class.getName(),
@@ -560,7 +561,7 @@
adapter.add(mVpnTest);
adapter.add(mAlwaysOnVpnSettingsTest);
adapter.add(mTurnOffWorkFeaturesTest);
- adapter.add(mSelectWorkChallenge);
+ //adapter.add(mSelectWorkChallenge);
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
adapter.add(mConfirmWorkCredentials);
adapter.add(mPatternWorkChallenge);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/BubblesVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/BubblesVerifierActivity.java
index d22f026..80aab50 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/BubblesVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/BubblesVerifierActivity.java
@@ -93,6 +93,7 @@
private int mCurrentTestIndex = -1; // gets incremented first time
private int mStepFailureCount = 0;
private boolean mShowingSummary = false;
+ private boolean mSupportsBubble = false;
private Handler mHandler = new Handler();
private Runnable mRunnable;
@@ -150,11 +151,18 @@
});
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+
+ try {
+ mSupportsBubble = getResources().getBoolean(getResources().getIdentifier(
+ "config_supportsBubble", "bool", "android"));
+ } catch (Resources.NotFoundException e) {
+ // Assume device does not support bubble, no need to do anything.
+ }
+
if (am.isLowRamDevice()) {
// Bubbles don't occur on low ram, instead they just show as notifs so test that
mTests.add(new LowRamBubbleTest());
- } else if (!Resources.getSystem()
- .getBoolean(com.android.internal.R.bool.config_supportsBubble)) {
+ } else if (!mSupportsBubble) {
// Bubbles don't occur on bubble disabled devices, only test notifications.
mTests.add(new BubbleDisabledTest());
} else {
diff --git a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/bluetooth/Bluetooth.java b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/bluetooth/Bluetooth.java
index 30a642e..4b9e87e 100644
--- a/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/bluetooth/Bluetooth.java
+++ b/common/device-side/bedstead/nene/src/main/java/com/android/bedstead/nene/bluetooth/Bluetooth.java
@@ -17,6 +17,7 @@
package com.android.bedstead.nene.bluetooth;
import static android.os.Build.VERSION_CODES.R;
+import static android.os.Process.BLUETOOTH_UID;
import static com.android.bedstead.nene.permissions.CommonPermissions.BLUETOOTH;
import static com.android.bedstead.nene.permissions.CommonPermissions.BLUETOOTH_CONNECT;
@@ -25,21 +26,24 @@
import static com.android.bedstead.nene.permissions.CommonPermissions.NETWORK_SETTINGS;
import static com.android.bedstead.nene.utils.Versions.T;
-import static com.google.common.truth.Truth.assertThat;
-
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
import com.android.bedstead.nene.TestApis;
+import com.android.bedstead.nene.annotations.Experimental;
+import com.android.bedstead.nene.exceptions.NeneException;
import com.android.bedstead.nene.permissions.PermissionContext;
import com.android.bedstead.nene.utils.Poll;
+import com.android.bedstead.nene.utils.Versions;
import com.android.compatibility.common.util.BlockingBroadcastReceiver;
/** Test APIs related to bluetooth. */
public final class Bluetooth {
-
public static final Bluetooth sInstance = new Bluetooth();
private static final Context sContext = TestApis.context().instrumentedContext();
@@ -47,90 +51,130 @@
sContext.getSystemService(BluetoothManager.class);
private static final BluetoothAdapter sBluetoothAdapter = sBluetoothManager.getAdapter();
- private Bluetooth() {
- }
+ private Bluetooth() {}
/** Enable or disable bluetooth on the device. */
public void setEnabled(boolean enabled) {
- if (isEnabled() == enabled) {
- return;
- }
+ if (isEnabled() == enabled) {
+ return;
+ }
- if (enabled) {
- enable();
- } else {
- disable();
- }
+ if (enabled) {
+ enable();
+ } else {
+ disable();
+ }
}
private void enable() {
- try (PermissionContext p =
- TestApis.permissions()
- .withPermission(BLUETOOTH_CONNECT, INTERACT_ACROSS_USERS_FULL,
- BLUETOOTH_PRIVILEGED)
- .withPermissionOnVersionAtLeast(T, NETWORK_SETTINGS)) {
- BlockingBroadcastReceiver r = BlockingBroadcastReceiver.create(
- sContext,
- BluetoothAdapter.ACTION_STATE_CHANGED,
- this::isStateEnabled).register();
+ try (PermissionContext p = TestApis.permissions()
+ .withPermission(BLUETOOTH_CONNECT,
+ INTERACT_ACROSS_USERS_FULL, BLUETOOTH_PRIVILEGED)
+ .withPermissionOnVersionAtLeast(T, NETWORK_SETTINGS)) {
+ BlockingBroadcastReceiver r =
+ BlockingBroadcastReceiver
+ .create(sContext, BluetoothAdapter.ACTION_STATE_CHANGED,
+ this::isStateEnabled)
+ .register();
- try {
- boolean returnValue = sBluetoothAdapter.enable();
+ try {
+ boolean returnValue = sBluetoothAdapter.enable();
- r.awaitForBroadcast();
- Poll.forValue("Bluetooth Enabled", this::isEnabled)
- .toBeEqualTo(true)
- .errorOnFail("Waited for bluetooth to be enabled."
- + " .enable() returned " + returnValue)
- .await();
- } finally {
- r.unregisterQuietly();
- }
+ r.awaitForBroadcast();
+ Poll.forValue("Bluetooth Enabled", this::isEnabled)
+ .toBeEqualTo(true)
+ .errorOnFail("Waited for bluetooth to be enabled."
+ + " .enable() returned " + returnValue)
+ .await();
+ } finally {
+ r.unregisterQuietly();
}
-
+ }
}
private void disable() {
- try (PermissionContext p =
- TestApis.permissions()
- .withPermission(BLUETOOTH_CONNECT, INTERACT_ACROSS_USERS_FULL,
- BLUETOOTH_PRIVILEGED)
- .withPermissionOnVersionAtLeast(T, NETWORK_SETTINGS)) {
- BlockingBroadcastReceiver r = BlockingBroadcastReceiver.create(
- sContext,
- BluetoothAdapter.ACTION_STATE_CHANGED,
- this::isStateDisabled).register();
+ try (PermissionContext p = TestApis.permissions()
+ .withPermission(BLUETOOTH_CONNECT,
+ INTERACT_ACROSS_USERS_FULL, BLUETOOTH_PRIVILEGED)
+ .withPermissionOnVersionAtLeast(T, NETWORK_SETTINGS)) {
+ BlockingBroadcastReceiver r =
+ BlockingBroadcastReceiver
+ .create(sContext, BluetoothAdapter.ACTION_STATE_CHANGED,
+ this::isStateDisabled)
+ .register();
- try {
- boolean returnValue = sBluetoothAdapter.disable();
+ try {
+ boolean returnValue = sBluetoothAdapter.disable();
- r.awaitForBroadcast();
- Poll.forValue("Bluetooth Enabled", this::isEnabled)
- .toBeEqualTo(false)
- .errorOnFail("Waited for bluetooth to be disabled."
- + " .disable() returned " + returnValue)
- .await();
- } finally {
- r.unregisterQuietly();
- }
+ r.awaitForBroadcast();
+ Poll.forValue("Bluetooth Enabled", this::isEnabled)
+ .toBeEqualTo(false)
+ .errorOnFail("Waited for bluetooth to be disabled."
+ + " .disable() returned " + returnValue)
+ .await();
+ } finally {
+ r.unregisterQuietly();
}
+ }
}
/** {@code true} if bluetooth is enabled. */
public boolean isEnabled() {
- try (PermissionContext p =
- TestApis.permissions().withPermissionOnVersionAtMost(R, BLUETOOTH)) {
- return sBluetoothAdapter.isEnabled();
- }
+ try (PermissionContext p =
+ TestApis.permissions().withPermissionOnVersionAtMost(R, BLUETOOTH)) {
+ return sBluetoothAdapter.isEnabled();
+ }
}
private boolean isStateEnabled(Intent intent) {
- return intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
- == BluetoothAdapter.STATE_ON;
+ return intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_ON;
}
private boolean isStateDisabled(Intent intent) {
- return intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
- == BluetoothAdapter.STATE_OFF;
+ return intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF;
+ }
+
+ /** The bluetooth UID is associated with multiple packages. Get the main one. */
+ @Experimental
+ public String findPackageName() {
+ if (!Versions.meetsMinimumSdkVersionRequirement(T)) {
+ return "com.android.bluetooth";
+ }
+ // this activity will always be in the package where the rest of Bluetooth lives
+ var sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity";
+ var packageManager = sContext.createContextAsUser(UserHandle.SYSTEM, 0).getPackageManager();
+ var allPackages = packageManager.getPackagesForUid(BLUETOOTH_UID);
+ String matchedPackage = null;
+ for (String candidatePackage : allPackages) {
+ PackageInfo packageInfo;
+ try {
+ packageInfo =
+ packageManager.getPackageInfo(
+ candidatePackage,
+ PackageManager.GET_ACTIVITIES
+ | PackageManager.MATCH_ANY_USER
+ | PackageManager.MATCH_UNINSTALLED_PACKAGES
+ | PackageManager.MATCH_DISABLED_COMPONENTS);
+ } catch (PackageManager.NameNotFoundException e) {
+ // rethrow
+ throw new NeneException(e);
+ }
+ if (packageInfo.activities == null) {
+ continue;
+ }
+ for (var activity : packageInfo.activities) {
+ if (sentinelActivity.equals(activity.name)) {
+ if (matchedPackage == null) {
+ matchedPackage = candidatePackage;
+ } else {
+ throw new NeneException("multiple main bluetooth packages found");
+ }
+ }
+ }
+ }
+ if (matchedPackage != null) {
+ return matchedPackage;
+ }
+ throw new NeneException("Could not find main bluetooth package");
}
}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp b/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
index 0fc8b16..e65bc93 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
@@ -43,6 +43,7 @@
"androidx.legacy_legacy-support-v4",
"devicepolicy-deviceside-common",
"DpmWrapper",
+ "NeneInternal",
],
min_sdk_version: "21",
// tag this module as a cts test artifact
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
index f30d29e..95f5693 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
@@ -17,7 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.deviceowner">
- <uses-sdk android:minSdkVersion="20"/>
+ <uses-sdk android:minSdkVersion="29"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BluetoothRestrictionTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BluetoothRestrictionTest.java
index eb5cc56..7606b79 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BluetoothRestrictionTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BluetoothRestrictionTest.java
@@ -16,8 +16,6 @@
package com.android.cts.deviceowner;
-import static android.os.Process.BLUETOOTH_UID;
-
import static com.google.common.truth.Truth.assertWithMessage;
import android.bluetooth.BluetoothAdapter;
@@ -28,6 +26,7 @@
import android.util.DebugUtils;
import android.util.Log;
+import com.android.bedstead.nene.TestApis;
import com.android.internal.util.ArrayUtils;
/**
@@ -134,11 +133,8 @@
return;
}
- String bluetoothPackageName = mContext.getPackageManager()
- .getPackagesForUid(BLUETOOTH_UID)[0];
-
- ComponentName oppLauncherComponent = new ComponentName(
- bluetoothPackageName, OPP_LAUNCHER_CLASS);
+ ComponentName oppLauncherComponent =
+ new ComponentName(TestApis.bluetooth().findPackageName(), OPP_LAUNCHER_CLASS);
// First verify DISALLOW_BLUETOOTH.
testOppDisabledWhenRestrictionSet(UserManager.DISALLOW_BLUETOOTH,
@@ -146,8 +142,8 @@
// Verify DISALLOW_BLUETOOTH_SHARING which leaves bluetooth workable but the sharing
// component should be disabled.
- testOppDisabledWhenRestrictionSet(UserManager.DISALLOW_BLUETOOTH_SHARING,
- oppLauncherComponent);
+ testOppDisabledWhenRestrictionSet(
+ UserManager.DISALLOW_BLUETOOTH_SHARING, oppLauncherComponent);
}
/** Verifies that a given restriction disables the bluetooth sharing component. */
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp b/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
index 376b76b..7a0a26b 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
@@ -36,6 +36,7 @@
"androidx.legacy_legacy-support-v4",
"devicepolicy-deviceside-common",
"permission-test-util-lib",
+ "NeneInternal",
],
min_sdk_version: "27",
// tag this module as a cts test artifact
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
index 0a049c9..267f56e 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
@@ -17,7 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.managedprofile">
- <uses-sdk android:minSdkVersion="27"/>
+ <uses-sdk android:minSdkVersion="29"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BluetoothSharingRestrictionTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BluetoothSharingRestrictionTest.java
index 18f0d7c..ea41868 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BluetoothSharingRestrictionTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BluetoothSharingRestrictionTest.java
@@ -15,8 +15,6 @@
*/
package com.android.cts.managedprofile;
-import static android.os.Process.BLUETOOTH_UID;
-
import android.app.UiAutomation;
import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
@@ -32,6 +30,7 @@
import androidx.test.InstrumentationRegistry;
+import com.android.bedstead.nene.TestApis;
import com.android.internal.util.ArrayUtils;
import junit.framework.TestCase;
@@ -113,8 +112,7 @@
: new int[] {PackageManager.COMPONENT_ENABLED_STATE_DISABLED};
sUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_PERMISSION);
- String bluetoothPackageName = context.getPackageManager()
- .getPackagesForUid(BLUETOOTH_UID)[0];
+ String bluetoothPackageName = TestApis.bluetooth().findPackageName();
sUiAutomation.dropShellPermissionIdentity();
ComponentName oppLauncherComponent = new ComponentName(
diff --git a/tests/app/shared/src/android/app/cts/NotificationTemplateTestBase.kt b/tests/app/shared/src/android/app/cts/NotificationTemplateTestBase.kt
index 6b84cd3..47da9fa 100644
--- a/tests/app/shared/src/android/app/cts/NotificationTemplateTestBase.kt
+++ b/tests/app/shared/src/android/app/cts/NotificationTemplateTestBase.kt
@@ -146,4 +146,7 @@
@BoolRes
protected fun getAndroidRBool(boolName: String): Int = getAndroidRes("bool", boolName)
+
+ @DimenRes
+ protected fun getAndroidRDimen(dimenName: String) : Int = getAndroidRes("dimen", dimenName)
}
\ No newline at end of file
diff --git a/tests/app/src/android/app/cts/NotificationTemplateTest.kt b/tests/app/src/android/app/cts/NotificationTemplateTest.kt
index 5f3f7e8..bef1319 100644
--- a/tests/app/src/android/app/cts/NotificationTemplateTest.kt
+++ b/tests/app/src/android/app/cts/NotificationTemplateTest.kt
@@ -21,6 +21,7 @@
import android.app.Person
import android.app.cts.CtsAppTestUtils.platformNull
import android.content.Intent
+import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
@@ -299,8 +300,8 @@
assertThat(iconView.width.toFloat())
.isWithin(1f)
.of((iconView.height * 4 / 3).toFloat())
- assertThat(iconView.drawable.intrinsicWidth).isEqualTo(400)
- assertThat(iconView.drawable.intrinsicHeight).isEqualTo(300)
+ assertThat(iconView.drawable.intrinsicWidth).isEqualTo(rightIconSize())
+ assertThat(iconView.drawable.intrinsicHeight).isEqualTo(rightIconSize() * 3 / 4)
}
}
@@ -399,8 +400,9 @@
assertThat(iconView.width.toFloat())
.isWithin(1f)
.of((iconView.height * 4 / 3).toFloat())
- assertThat(iconView.drawable.intrinsicWidth).isEqualTo(400)
- assertThat(iconView.drawable.intrinsicHeight).isEqualTo(300)
+
+ assertThat(iconView.drawable.intrinsicWidth).isEqualTo(rightIconSize())
+ assertThat(iconView.drawable.intrinsicHeight).isEqualTo(rightIconSize() * 3 / 4)
}
}
@@ -782,6 +784,11 @@
PendingIntent.getBroadcast(mContext, 0, Intent("test"), PendingIntent.FLAG_IMMUTABLE)
}
+ private fun rightIconSize(): Int {
+ return mContext.resources.getDimensionPixelSize(
+ getAndroidRDimen("notification_right_icon_size"))
+ }
+
companion object {
val TAG = NotificationTemplateTest::class.java.simpleName
const val NOTIFICATION_CHANNEL_ID = "NotificationTemplateTest"
diff --git a/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
index 5eb72f4..8c8e732 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/servicebehavior/DisableAutofillTest.java
@@ -83,7 +83,7 @@
* Launches and finishes {@link SimpleSaveActivity}, returning how long it took.
*/
private long launchSimpleSaveActivity(PostLaunchAction action) throws Exception {
- Log.v(TAG, "launchPreSimpleSaveActivity(): " + action);
+ Log.v(TAG, "launchSimpleSaveActivity(): " + action);
sReplier.assertNoUnhandledFillRequests();
if (action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL) {
@@ -175,7 +175,7 @@
// Asserts isEnabled() status.
assertAutofillEnabled(activity, action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL);
} finally {
- activity.finish();
+ mUiBot.waitForWindowChange(() -> activity.finish());
}
return SystemClock.elapsedRealtime() - before;
}
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index 1a86422..84d22f3 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -492,7 +492,7 @@
<activity android:name="android.server.wm.CompatChangeTests$NonResizeableLargeAspectRatioActivity"
android:resizeableActivity="false"
android:screenOrientation="portrait"
- android:minAspectRatio="3"
+ android:minAspectRatio="4"
android:exported="true"/>
<activity android:name="android.server.wm.CompatChangeTests$SupportsSizeChangesPortraitActivity"
diff --git a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
index 94c1f1a..bd26452 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
+++ b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
@@ -760,7 +760,7 @@
if (objectText == null) {
continue;
}
- if (objectText.equalsIgnoreCase("CREATE")) {
+ if (objectText.equalsIgnoreCase("CREATE") || objectText.equalsIgnoreCase("ALLOW")) {
object.click();
buttonClicked = true;
break;
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
index 097defa..97ec441 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
@@ -94,7 +94,7 @@
// The min aspect ratio of NON_RESIZEABLE_LARGE_ASPECT_RATIO_ACTIVITY (as defined in the
// manifest). This needs to be higher than the aspect ratio of any device, which according to
// CDD is at most 21:9.
- private static final float ACTIVITY_LARGE_MIN_ASPECT_RATIO = 3f;
+ private static final float ACTIVITY_LARGE_MIN_ASPECT_RATIO = 4f;
private static final float FLOAT_EQUALITY_DELTA = 0.01f;
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/StylusHandwritingTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/StylusHandwritingTest.java
index 8cc0b8e..c098ad0 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/StylusHandwritingTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/StylusHandwritingTest.java
@@ -54,6 +54,7 @@
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.compatibility.common.util.AdoptShellPermissionsRule;
+import com.android.compatibility.common.util.ApiTest;
import com.android.cts.mockime.ImeEventStream;
import com.android.cts.mockime.ImeSettings;
import com.android.cts.mockime.MockImeSession;
@@ -147,6 +148,10 @@
}
@Test
+ @ApiTest(apis = {"android.view.inputmethod.InputMethodManager#startStylusHandwriting",
+ "android.inputmethodservice.InputMethodService#onPrepareStylusHandwriting",
+ "android.inputmethodservice.InputMethodService#onStartStylusHandwriting",
+ "android.inputmethodservice.InputMethodService#onFinishStylusHandwriting"})
public void testHandwritingStartAndFinish() throws Exception {
final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
try (MockImeSession imeSession = MockImeSession.create(
@@ -157,13 +162,13 @@
final String marker = getTestMarker();
final EditText editText = launchTestActivity(marker);
+ expectEvent(stream, editorMatcher("onStartInput", marker), TIMEOUT);
// Touch down with a stylus
final int x = 10;
final int y = 10;
TestUtils.injectStylusDownEvent(editText, x, y);
- expectEvent(stream, editorMatcher("onStartInput", marker), TIMEOUT);
notExpectEvent(
stream,
editorMatcher("onStartInputView", marker),
@@ -209,6 +214,9 @@
* @throws Exception
*/
@Test
+ @ApiTest(apis = {"android.view.inputmethod.InputMethodManager#startStylusHandwriting",
+ "android.inputmethodservice.InputMethodService#onStylusMotionEvent",
+ "android.inputmethodservice.InputMethodService#onStartStylusHandwriting"})
public void testHandwritingStylusEvents_onStylusHandwritingMotionEvent() throws Exception {
testHandwritingStylusEvents(false /* verifyOnInkView */);
}
@@ -219,6 +227,9 @@
* @throws Exception
*/
@Test
+ @ApiTest(apis = {"android.view.inputmethod.InputMethodManager#startStylusHandwriting",
+ "android.inputmethodservice.InputMethodService#onStylusMotionEvent",
+ "android.inputmethodservice.InputMethodService#onStartStylusHandwriting"})
public void testHandwritingStylusEvents_dispatchToInkView() throws Exception {
testHandwritingStylusEvents(false /* verifyOnInkView */);
}
@@ -234,6 +245,7 @@
final String marker = getTestMarker();
final EditText editText = launchTestActivity(marker);
+ expectEvent(stream, editorMatcher("onStartInput", marker), TIMEOUT);
final List<MotionEvent> injectedEvents = new ArrayList<>();
// Touch down with a stylus
@@ -241,7 +253,6 @@
final int startY = 10;
injectedEvents.add(TestUtils.injectStylusDownEvent(editText, startX, startY));
- expectEvent(stream, editorMatcher("onStartInput", marker), TIMEOUT);
notExpectEvent(
stream,
editorMatcher("onStartInputView", marker),
diff --git a/tests/location/location_none/src/android/location/cts/none/LocationDisabledAppOpsTest.java b/tests/location/location_none/src/android/location/cts/none/LocationDisabledAppOpsTest.java
index a70065c..c406052 100644
--- a/tests/location/location_none/src/android/location/cts/none/LocationDisabledAppOpsTest.java
+++ b/tests/location/location_none/src/android/location/cts/none/LocationDisabledAppOpsTest.java
@@ -34,6 +34,8 @@
import androidx.test.InstrumentationRegistry;
+import com.android.compatibility.common.util.ApiTest;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -54,6 +56,11 @@
}
@Test
+ @ApiTest(apis = {
+ "android.location.LocationManager#setLocationEnabledForUser",
+ "android.app.AppOpsManager#noteOpNoThrow",
+ "android.app.AppOpsManager#checkOpNoThrow",
+ })
public void testLocationAppOpIsIgnoredForAppsWhenLocationIsDisabled() {
PackageTagsList ignoreList = mLm.getIgnoreSettingsAllowlist();
@@ -85,7 +92,8 @@
mode[0] = mAom.noteOpNoThrow(
OPSTR_FINE_LOCATION, ai.uid, ai.packageName);
});
- if (mode[0] == MODE_ALLOWED && !ignoreList.containsAll(pi.packageName)) {
+ if (mode[0] == MODE_ALLOWED && !ignoreList.containsAll(pi.packageName)
+ && !mLm.isProviderPackage(null, pi.packageName, null)) {
bypassedNoteOps.add(pi.packageName);
}
@@ -95,7 +103,8 @@
mode[0] = mAom
.checkOpNoThrow(OPSTR_FINE_LOCATION, ai.uid, ai.packageName);
});
- if (mode[0] == MODE_ALLOWED && !ignoreList.includes(pi.packageName)) {
+ if (mode[0] == MODE_ALLOWED && !ignoreList.includes(pi.packageName)
+ && !mLm.isProviderPackage(null, pi.packageName, null)) {
bypassedCheckOps.add(pi.packageName);
}
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
index f03fa90..efa8441 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
@@ -135,9 +135,9 @@
{MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_360x640_768kbps_30fps_avc.mp4",
"bbb_520x390_1mbps_30fps_avc.mp4", CODEC_ALL},
{MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_160x1024_1500kbps_30fps_avc.mp4",
- "bbb_520x390_1mbps_30fps_avc.mp4", CODEC_ALL},
+ "bbb_520x390_1mbps_30fps_avc.mp4", CODEC_OPTIONAL},
{MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_1280x120_1500kbps_30fps_avc.mp4",
- "bbb_340x280_768kbps_30fps_avc.mp4", CODEC_ALL},
+ "bbb_340x280_768kbps_30fps_avc.mp4", CODEC_OPTIONAL},
{MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_520x390_1mbps_30fps_hevc.mp4",
"bbb_340x280_768kbps_30fps_hevc.mp4", CODEC_ALL},
{MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_128x96_64kbps_12fps_mpeg4.mp4",
diff --git a/tests/media/src/android/mediav2/cts/CodecInfoTest.java b/tests/media/src/android/mediav2/cts/CodecInfoTest.java
index 143b795..c3a1b09 100644
--- a/tests/media/src/android/mediav2/cts/CodecInfoTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecInfoTest.java
@@ -103,6 +103,7 @@
@ApiTest(apis = "MediaCodecInfo.CodecCapabilities#profileLevels")
public void testHDRDisplayCapabilities() {
Assume.assumeTrue("Test needs Android 13", IS_AT_LEAST_T);
+ Assume.assumeTrue("Test needs VNDK Android 13", VNDK_IS_AT_LEAST_T);
Assume.assumeTrue("Test is applicable for video codecs", mMediaType.startsWith("video/"));
// TODO (b/228237404) Remove the following once there is a reliable way to query HDR
// display capabilities at native level, till then limit the test to vendor codecs
diff --git a/tests/tests/hardware/src/android/hardware/cts/DataSpaceTest.java b/tests/tests/hardware/src/android/hardware/cts/DataSpaceTest.java
index ebbfd30..ceb9835 100644
--- a/tests/tests/hardware/src/android/hardware/cts/DataSpaceTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/DataSpaceTest.java
@@ -37,11 +37,14 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
+import com.android.compatibility.common.util.ApiTest;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+@ApiTest(apis = {"android.hardware.DataSpace#NamedDataSpace"})
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DataSpaceTest {
@@ -196,9 +199,10 @@
}
}
+ @ApiTest(apis = {"android.hardware.DataSpace#DATASPACE_JFIF"})
@UiThreadTest
@Test
- public void getDataSpaceWithFormatYUV420_888() {
+ public void getDataSpaceWithFormatYV12() {
mTex = new int[1];
glGenTextures(1, mTex, 0);
@@ -208,7 +212,7 @@
mSurface = new Surface(mSurfaceTexture);
mWriter = new ImageWriter.Builder(mSurface)
- .setImageFormat(ImageFormat.YUV_420_888)
+ .setImageFormat(ImageFormat.YV12)
.build();
Image inputImage = null;
@@ -218,7 +222,7 @@
mSurfaceTexture.updateTexImage();
- // test default dataspace value of ImageFormat.YUV_420_888 format.
+ // test default dataspace value of ImageFormat.YV12 format.
assertEquals(DataSpace.DATASPACE_JFIF, mSurfaceTexture.getDataSpace());
} finally {
if (inputImage != null) {
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
index 7943538..56dd1b0 100644
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
@@ -2113,7 +2113,7 @@
Signature.getInstance("NONEwithECDSA").initVerify(publicKey);
}
- private static final int MIN_SUPPORTED_KEY_COUNT = 1500;
+ private static final int MIN_SUPPORTED_KEY_COUNT = 1200;
private static final Duration LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION = Duration.ofMinutes(4);
private static final Duration LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_WATCH
= Duration.ofMinutes(6);
diff --git a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
index b97c903..d26c45f 100644
--- a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
+++ b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
@@ -16,6 +16,7 @@
package android.media.decoder.cts;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assume.assumeTrue;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
@@ -66,6 +67,7 @@
import com.android.compatibility.common.util.MediaUtils;
import org.junit.After;
+import org.junit.Assume;
import org.junit.Before;
import org.junit.Rule;
@@ -214,6 +216,8 @@
return false;
}
configureVideoFormat(mediaFormat, videoFormat);
+ Assume.assumeTrue("Decoder " + codecName + " doesn't support format " + mediaFormat,
+ MediaUtils.supports(codecName, mediaFormat));
setRenderToSurface(surface != null);
return createDecoder(mediaFormat) && configureDecoder(surface, mediaFormat);
}
diff --git a/tests/tests/media/decoder/src/android/media/decoder/cts/DecoderTestAacFormat.java b/tests/tests/media/decoder/src/android/media/decoder/cts/DecoderTestAacFormat.java
index 0857809..af4e75a 100644
--- a/tests/tests/media/decoder/src/android/media/decoder/cts/DecoderTestAacFormat.java
+++ b/tests/tests/media/decoder/src/android/media/decoder/cts/DecoderTestAacFormat.java
@@ -37,6 +37,7 @@
import androidx.test.InstrumentationRegistry;
import com.android.compatibility.common.util.ApiLevelUtil;
+import com.android.compatibility.common.util.CddTest;
import com.android.compatibility.common.util.MediaUtils;
import org.junit.Before;
@@ -56,7 +57,7 @@
ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R);
private static final boolean sIsAtLeastT =
ApiLevelUtil.isAtLeast(Build.VERSION_CODES.TIRAMISU);
-
+ private static final String MIMETYPE_AAC = MediaFormat.MIMETYPE_AUDIO_AAC;
@Before
public void setUp() throws Exception {
final Instrumentation inst = InstrumentationRegistry.getInstrumentation();
@@ -67,6 +68,7 @@
* Verify downmixing to stereo at decoding of MPEG-4 HE-AAC 5.0 and 5.1 channel streams
*/
@Test
+ @CddTest(requirements = {"5.1.2/C-2-1", "5.1.2/C-7-1", "5.1.2/C-7-2"})
public void testHeAacM4aMultichannelDownmix() throws Exception {
Log.i(TAG, "START testDecodeHeAacMcM4a");
@@ -101,7 +103,7 @@
assertEquals("Number of channels differs for codec:" + codecName
+ " when downmixing with KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT",
2, aacDownmixParams.getNumChannels());
- if (sIsAtLeastT) {
+ if (sIsAtLeastT && DecoderTest.isDefaultCodec(codecName, MIMETYPE_AAC)) {
// KEY_CHANNEL_MASK expected to work starting with T
assertEquals("Wrong channel mask with KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT",
AudioFormat.CHANNEL_OUT_STEREO,
@@ -168,7 +170,7 @@
assertEquals("wrong number of tracks", 1, extractor.getTrackCount());
MediaFormat format = extractor.getTrackFormat(0);
String mime = format.getString(MediaFormat.KEY_MIME);
- assertTrue("not an audio file", mime.startsWith("audio/"));
+ assertTrue("not an aac audio file", mime.equals(MIMETYPE_AAC));
MediaCodec decoder;
if (decoderName == null) {
@@ -276,7 +278,7 @@
} catch (NullPointerException e) {
fail("KEY_SAMPLE_RATE not found on output format");
}
- if (sIsAtLeastT) {
+ if (sIsAtLeastT && DecoderTest.isDefaultCodec(decoderName, MIMETYPE_AAC)) {
try {
audioParams.setChannelMask(
outputFormat.getInteger(MediaFormat.KEY_CHANNEL_MASK));
diff --git a/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt b/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
index cdbd58c..b16ad15 100644
--- a/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
+++ b/tests/tests/os/src/android/os/cts/AppHibernationUtils.kt
@@ -61,6 +61,11 @@
private const val BROADCAST_TIMEOUT_MS = 60000L
+const val HIBERNATION_BOOT_RECEIVER_CLASS_NAME =
+ "com.android.permissioncontroller.hibernation.HibernationOnBootReceiver"
+const val ACTION_SET_UP_HIBERNATION =
+ "com.android.permissioncontroller.action.SET_UP_HIBERNATION"
+
const val SYSUI_PKG_NAME = "com.android.systemui"
const val NOTIF_LIST_ID = "com.android.systemui:id/notification_stack_scroller"
const val CLEAR_ALL_BUTTON_ID = "dismiss_text"
@@ -82,35 +87,37 @@
fun runBootCompleteReceiver(context: Context, testTag: String) {
val pkgManager = context.packageManager
val permissionControllerPkg = pkgManager.permissionControllerPackageName
+ var permissionControllerSetupIntent = Intent(ACTION_SET_UP_HIBERNATION).apply {
+ setPackage(permissionControllerPkg)
+ setFlags(Intent.FLAG_RECEIVER_FOREGROUND)
+ }
val receivers = pkgManager.queryBroadcastReceivers(
- Intent(Intent.ACTION_BOOT_COMPLETED), /* flags= */ 0)
- for (ri in receivers) {
- val pkg = ri.activityInfo.packageName
- if (pkg == permissionControllerPkg) {
- val permissionControllerSetupIntent = Intent()
- .setClassName(pkg, ri.activityInfo.name)
- .setFlags(Intent.FLAG_RECEIVER_FOREGROUND)
- .setPackage(permissionControllerPkg)
- val countdownLatch = CountDownLatch(1)
- Log.d(testTag, "Sending boot complete broadcast directly to ${ri.activityInfo.name} " +
- "in package $permissionControllerPkg")
- context.sendOrderedBroadcast(
- permissionControllerSetupIntent,
- /* receiverPermission= */ null,
- object : BroadcastReceiver() {
- override fun onReceive(context: Context?, intent: Intent?) {
- countdownLatch.countDown()
- Log.d(testTag, "Broadcast received by $permissionControllerPkg")
- }
- },
- Handler.createAsync(Looper.getMainLooper()),
- Activity.RESULT_OK,
- /* initialData= */ null,
- /* initialExtras= */ null)
- assertTrue("Timed out while waiting for boot receiver broadcast to be received",
- countdownLatch.await(BROADCAST_TIMEOUT_MS, TimeUnit.MILLISECONDS))
+ permissionControllerSetupIntent, /* flags= */ 0)
+ if (receivers.size == 0) {
+ // May be on an older, pre-built PermissionController. In this case, try sending directly.
+ permissionControllerSetupIntent = Intent().apply {
+ setPackage(permissionControllerPkg)
+ setClassName(permissionControllerPkg, HIBERNATION_BOOT_RECEIVER_CLASS_NAME)
+ setFlags(Intent.FLAG_RECEIVER_FOREGROUND)
}
}
+ val countdownLatch = CountDownLatch(1)
+ Log.d(testTag, "Sending boot complete broadcast directly to $permissionControllerPkg")
+ context.sendOrderedBroadcast(
+ permissionControllerSetupIntent,
+ /* receiverPermission= */ null,
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ countdownLatch.countDown()
+ Log.d(testTag, "Broadcast received by $permissionControllerPkg")
+ }
+ },
+ Handler.createAsync(Looper.getMainLooper()),
+ Activity.RESULT_OK,
+ /* initialData= */ null,
+ /* initialExtras= */ null)
+ assertTrue("Timed out while waiting for boot receiver broadcast to be received",
+ countdownLatch.await(BROADCAST_TIMEOUT_MS, TimeUnit.MILLISECONDS))
}
fun runAppHibernationJob(context: Context, tag: String) {
diff --git a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
index e6eab02..9667a55 100644
--- a/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
+++ b/tests/tests/os/src/android/os/cts/AutoRevokeTest.kt
@@ -517,9 +517,9 @@
val parent = waitFindObject(
By.clickable(true)
.hasDescendant(By.textStartsWith("Remove permissions"))
- .hasDescendant(By.clazz(Switch::class.java.name))
+ .hasDescendant(By.checkable(true))
)
- return parent.findObject(By.clazz(Switch::class.java.name))
+ return parent.findObject(By.checkable(true))
}
private fun waitForIdle() {
diff --git a/tests/tests/permission/src/android/permission/cts/LocationAccessCheckTest.java b/tests/tests/permission/src/android/permission/cts/LocationAccessCheckTest.java
index ab7a15d..16cd366 100644
--- a/tests/tests/permission/src/android/permission/cts/LocationAccessCheckTest.java
+++ b/tests/tests/permission/src/android/permission/cts/LocationAccessCheckTest.java
@@ -23,7 +23,6 @@
import static android.app.Notification.EXTRA_TITLE;
import static android.content.Context.BIND_AUTO_CREATE;
import static android.content.Context.BIND_NOT_FOREGROUND;
-import static android.content.Intent.ACTION_BOOT_COMPLETED;
import static android.content.Intent.FLAG_RECEIVER_FOREGROUND;
import static android.location.Criteria.ACCURACY_FINE;
import static android.os.Process.myUserHandle;
@@ -41,7 +40,6 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
@@ -116,6 +114,8 @@
"/data/local/tmp/cts/permissions/CtsAppThatAccessesLocationOnCommand.apk";
private static final String TEST_APP_LOCATION_FG_ACCESS_APK =
"/data/local/tmp/cts/permissions/AppThatDoesNotHaveBgLocationAccess.apk";
+ private static final String ACTION_SET_UP_LOCATION_ACCESS_CHECK =
+ "com.android.permissioncontroller.action.SET_UP_LOCATION_ACCESS_CHECK";
private static final int LOCATION_ACCESS_CHECK_JOB_ID = 0;
/** Whether to show location access check notifications. */
@@ -137,6 +137,10 @@
private static final String PERMISSION_CONTROLLER_PKG = sContext.getPackageManager()
.getPermissionControllerPackageName();
+ private static final String LocationAccessCheckOnBootReceiver =
+ "com.android.permissioncontroller.permission.service"
+ + ".LocationAccessCheck$SetupPeriodicBackgroundLocationAccessCheck";
+
/**
* The result of {@link #assumeCanGetFineLocation()}, so we don't have to run it over and over
@@ -297,6 +301,11 @@
* Force a run of the location check.
*/
private static void runLocationCheck() throws Throwable {
+ // If the job isn't setup, do it before running a location check
+ if (!isLocationAccessJobSetup(myUserHandle().getIdentifier())) {
+ setupLocationAccessCheckJob();
+ }
+
// Sleep a little bit to make sure we don't have overlap in timing
Thread.sleep(1000);
@@ -589,38 +598,47 @@
}
}, UNEXPECTED_TIMEOUT_MILLIS);
- // Setup up permission controller again (simulate a reboot)
- Intent permissionControllerSetupIntent = null;
- for (ResolveInfo ri : sContext.getPackageManager().queryBroadcastReceivers(
- new Intent(ACTION_BOOT_COMPLETED), 0)) {
- String pkg = ri.activityInfo.packageName;
-
- if (pkg.equals(PERMISSION_CONTROLLER_PKG)) {
- permissionControllerSetupIntent = new Intent()
- .setClassName(pkg, ri.activityInfo.name)
- .setFlags(FLAG_RECEIVER_FOREGROUND)
- .setPackage(PERMISSION_CONTROLLER_PKG);
-
- sContext.sendBroadcast(permissionControllerSetupIntent);
- }
- }
+ setupLocationAccessCheckJob();
// Wait until jobs are set up
eventually(() -> {
- JobSchedulerServiceDumpProto dump = getJobSchedulerDump();
-
- for (RegisteredJob job : dump.registeredJobs) {
- if (job.dump.sourceUserId == currentUserId
- && job.dump.sourcePackageName.equals(PERMISSION_CONTROLLER_PKG)
- && job.dump.jobInfo.service.className.contains("LocationAccessCheck")) {
- return;
- }
- }
-
- fail("Permission controller jobs not found");
+ assertTrue("LocationAccessCheck job not found",
+ isLocationAccessJobSetup(currentUserId));
}, UNEXPECTED_TIMEOUT_MILLIS);
}
+ private static boolean isLocationAccessJobSetup(int currentUserId) throws Exception {
+ JobSchedulerServiceDumpProto dump = getJobSchedulerDump();
+ for (RegisteredJob job : dump.registeredJobs) {
+ if (job.dump.sourceUserId == currentUserId
+ && job.dump.sourcePackageName.equals(PERMISSION_CONTROLLER_PKG)
+ && job.dump.jobInfo.service.className.contains("LocationAccessCheck")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static void setupLocationAccessCheckJob() {
+ // Setup location access check
+ Intent permissionControllerSetupIntent = new Intent(
+ ACTION_SET_UP_LOCATION_ACCESS_CHECK).setPackage(
+ PERMISSION_CONTROLLER_PKG).setFlags(FLAG_RECEIVER_FOREGROUND);
+
+ // Query for the setup broadcast receiver
+ List<ResolveInfo> resolveInfos = sContext.getPackageManager().queryBroadcastReceivers(
+ permissionControllerSetupIntent, 0);
+
+ if (resolveInfos.size() > 0) {
+ sContext.sendBroadcast(permissionControllerSetupIntent);
+ } else {
+ sContext.sendBroadcast(new Intent()
+ .setClassName(PERMISSION_CONTROLLER_PKG, LocationAccessCheckOnBootReceiver)
+ .setFlags(FLAG_RECEIVER_FOREGROUND)
+ .setPackage(PERMISSION_CONTROLLER_PKG));
+ }
+ }
+
/**
* Unregister {@link NotificationListener}.
*/
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 162f66a..1c9dc63 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -6462,6 +6462,13 @@
<permission android:name="android.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an app to set gesture exclusion without restrictions on the vertical extent of the
+ exclusions (see {@link android.view.View#setSystemGestureExclusionRects}).
+ @hide
+ -->
+ <permission android:name="android.permission.SET_UNRESTRICTED_GESTURE_EXCLUSION"
+ android:protectionLevel="signature|privileged|recents" />
+
<!-- Allows an UID to be visible to the application based on an interaction between the
two apps. This permission is not intended to be held by apps.
@hide @TestApi -->
diff --git a/tests/tests/security/Android.bp b/tests/tests/security/Android.bp
index 00a1e37..0cf3dd5 100644
--- a/tests/tests/security/Android.bp
+++ b/tests/tests/security/Android.bp
@@ -35,6 +35,7 @@
"platform-test-annotations",
"sts-device-util",
"hamcrest-library",
+ "NeneInternal",
],
libs: [
"android.test.runner",
diff --git a/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java b/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java
index ab05f91..0374220 100644
--- a/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java
+++ b/tests/tests/security/src/android/security/cts/BluetoothIntentsTest.java
@@ -15,14 +15,13 @@
*/
package android.security.cts;
-import static android.os.Process.BLUETOOTH_UID;
-
import android.content.ComponentName;
import android.content.Intent;
import android.platform.test.annotations.AsbSecurityTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.bedstead.nene.TestApis;
import com.android.sts.common.util.StsExtraBusinessLogicTestCase;
import org.junit.Test;
@@ -48,27 +47,27 @@
genericIntentTest("DECLINE");
}
- private static final String prefix = "android.btopp.intent.action.";
- private void genericIntentTest(String action) throws SecurityException {
- try {
- Intent should_be_protected_broadcast = new Intent();
+ private static final String PREFIX = "android.btopp.intent.action.";
+ private static final String RECEIVER = "com.android.bluetooth.opp.BluetoothOppReceiver";
- String bluetoothPackageName = getInstrumentation().getContext().getPackageManager()
- .getPackagesForUid(BLUETOOTH_UID)[0];
-
- ComponentName oppLauncherComponent = new ComponentName(bluetoothPackageName,
- "com.android.bluetooth.opp.BluetoothOppReceiver");
-
- should_be_protected_broadcast.setComponent(oppLauncherComponent);
- should_be_protected_broadcast.setAction(prefix + action);
+ private void genericIntentTest(String action) throws SecurityException {
+ try {
+ Intent should_be_protected_broadcast = new Intent();
+ ComponentName oppLauncherComponent =
+ new ComponentName(TestApis.bluetooth().findPackageName(), RECEIVER);
+ should_be_protected_broadcast.setComponent(oppLauncherComponent);
+ should_be_protected_broadcast.setAction(PREFIX + action);
getInstrumentation().getContext().sendBroadcast(should_be_protected_broadcast);
}
catch (SecurityException e) {
return;
}
- throw new SecurityException("An " + prefix + action +
- " intent should not be broadcastable except by the system (declare " +
- " as protected-broadcast in manifest)");
- }
+ throw new SecurityException(
+ "An "
+ + PREFIX
+ + action
+ + " intent should not be broadcastable except by the system (declare "
+ + " as protected-broadcast in manifest)");
+ }
}
diff --git a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java
index b96293f..568277f 100644
--- a/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java
+++ b/tests/tests/textclassifier/src/android/view/textclassifier/cts/TextViewIntegrationTest.java
@@ -36,6 +36,7 @@
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.net.Uri;
+import android.os.RemoteException;
import android.provider.Settings;
import android.text.Spannable;
import android.text.SpannableString;
@@ -87,28 +88,16 @@
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
@Before
- public void setup() throws Exception {
+ public void setup() throws RemoteException {
Assume.assumeTrue(
ApplicationProvider.getApplicationContext().getPackageManager()
.hasSystemFeature(FEATURE_TOUCHSCREEN));
- workAroundNotificationShadeWindowIssue();
mSimpleTextClassifier = new SimpleTextClassifier();
sDevice.wakeUp();
dismissKeyguard();
closeSystemDialog();
}
- // Somehow there is a stale "NotificationShade" window from SysUI stealing the inputs.
- // The window is in the "exiting" state and seems never finish exiting.
- // The workaround here is to (hopefully) reset its state by expanding the notification panel
- // and collapsing it again.
- private void workAroundNotificationShadeWindowIssue() throws InterruptedException {
- ShellUtils.runShellCommand("cmd statusbar expand-notifications");
- Thread.sleep(1000);
- ShellUtils.runShellCommand("cmd statusbar collapse");
- Thread.sleep(1000);
- }
-
private void dismissKeyguard() {
ShellUtils.runShellCommand("wm dismiss-keyguard");
}
diff --git a/tests/tests/view/AndroidManifest.xml b/tests/tests/view/AndroidManifest.xml
index 514c6fa..ba1205e 100644
--- a/tests/tests/view/AndroidManifest.xml
+++ b/tests/tests/view/AndroidManifest.xml
@@ -416,6 +416,7 @@
</activity>
<activity android:name="android.view.cts.InputEventInterceptTestActivity"
+ android:theme="@style/no_starting_window"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
@@ -423,6 +424,7 @@
</activity>
<activity android:name="android.view.cts.input.InputDeviceKeyLayoutMapTestActivity"
+ android:configChanges="keyboardHidden|navigation"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
diff --git a/tests/tests/view/res/values/themes.xml b/tests/tests/view/res/values/themes.xml
index e44b58a..6579108 100644
--- a/tests/tests/view/res/values/themes.xml
+++ b/tests/tests/view/res/values/themes.xml
@@ -20,4 +20,8 @@
<item name="android:textAppearanceLarge">@android:style/TextAppearance.Material.Large</item>
</style>
+ <style name="no_starting_window" parent="@android:style/Theme.DeviceDefault">
+ <item name="android:windowDisablePreview">true</item>
+ </style>
+
</resources>
\ No newline at end of file
diff --git a/tests/tests/widget/res/layout/numberpicker_layout.xml b/tests/tests/widget/res/layout/numberpicker_layout.xml
index 7c6dfb4..dd28324 100644
--- a/tests/tests/widget/res/layout/numberpicker_layout.xml
+++ b/tests/tests/widget/res/layout/numberpicker_layout.xml
@@ -19,7 +19,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center"
android:orientation="vertical">
<NumberPicker
diff --git a/tests/tests/widget/src/android/widget/cts/NumberPickerTest.java b/tests/tests/widget/src/android/widget/cts/NumberPickerTest.java
index eecc071..6f08587 100644
--- a/tests/tests/widget/src/android/widget/cts/NumberPickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/NumberPickerTest.java
@@ -376,7 +376,7 @@
numberPickerMiddleX,
numberPickerStartY,
0,
- screenHeight - numberPickerStartY); // drag down to the bottom of the screen.
+ mNumberPicker.getHeight()); // drag down to the bottom of the screen.
Assert.assertTrue("Expected to get to IDLE state within 5 seconds",
latch.await(5, TimeUnit.SECONDS));
@@ -444,7 +444,7 @@
numberPickerMiddleX,
numberPickerEndY,
0,
- -(numberPickerEndY)); // drag up to the top of the screen.
+ -(mNumberPicker.getHeight())); // drag up to the top of the screen.
Assert.assertTrue("Expected to get to IDLE state within 5 seconds",
latch.await(5, TimeUnit.SECONDS));
} catch (Throwable t) {
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 3b004dd..e3ff5f8 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
@@ -97,6 +97,7 @@
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.compatibility.common.util.ApiLevelUtil;
+import com.android.compatibility.common.util.ApiTest;
import com.android.compatibility.common.util.FeatureUtil;
import com.android.compatibility.common.util.PollingCheck;
import com.android.compatibility.common.util.PropertyUtil;
@@ -5468,6 +5469,7 @@
/**
* Tests {@link WifiConfiguration#setBssidAllowlist(List)}.
*/
+ @ApiTest(apis = "android.net.wifi.WifiConfiguration#setBssidAllowlist")
public void testBssidAllowlist() throws Exception {
if (!WifiFeature.isWifiSupported(getContext())) {
// skip the test if WiFi is not supported
@@ -5518,7 +5520,6 @@
waitForConnection();
wifiInfo = mWifiManager.getConnectionInfo();
assertEquals(networkId, wifiInfo.getNetworkId());
- assertEquals(connectedBssid, wifiInfo.getBSSID());
} finally {
// Reset BSSID allow list to accept all APs
for (WifiConfiguration network : savedNetworks) {
diff --git a/tests/uwb/src/android/uwb/cts/UwbManagerTest.java b/tests/uwb/src/android/uwb/cts/UwbManagerTest.java
index 8e3c098..097f799 100644
--- a/tests/uwb/src/android/uwb/cts/UwbManagerTest.java
+++ b/tests/uwb/src/android/uwb/cts/UwbManagerTest.java
@@ -51,6 +51,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
+import com.android.compatibility.common.util.CddTest;
import com.android.compatibility.common.util.ShellIdentityUtils;
import com.google.uwb.support.fira.FiraOpenSessionParams;
@@ -120,6 +121,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetSpecificationInfo() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -134,6 +136,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetSpecificationInfoWithChipId() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -149,6 +152,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetChipInfos() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -164,6 +168,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetSpecificationInfoWithInvalidChipId() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -177,6 +182,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetSpecificationInfoWithoutUwbPrivileged() {
try {
mUwbManager.getSpecificationInfo();
@@ -189,6 +195,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetSpecificationInfoWithChipIdWithoutUwbPrivileged() {
try {
mUwbManager.getSpecificationInfo(mDefaultChipId);
@@ -202,6 +209,7 @@
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testElapsedRealtimeResolutionNanos() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -214,6 +222,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testElapsedRealtimeResolutionNanosWithChipId() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -227,6 +236,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testElapsedRealtimeResolutionNanosWithInvalidChipId() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -240,6 +250,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testElapsedRealtimeResolutionNanosWithoutUwbPrivileged() {
try {
mUwbManager.elapsedRealtimeResolutionNanos();
@@ -252,6 +263,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testElapsedRealtimeResolutionNanosWithChipIdWithoutUwbPrivileged() {
try {
mUwbManager.elapsedRealtimeResolutionNanos(mDefaultChipId);
@@ -264,6 +276,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testAddServiceProfileWithoutUwbPrivileged() {
try {
mUwbManager.addServiceProfile(new PersistableBundle());
@@ -276,6 +289,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testRemoveServiceProfileWithoutUwbPrivileged() {
try {
mUwbManager.removeServiceProfile(new PersistableBundle());
@@ -289,6 +303,7 @@
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetAllServiceProfilesWithoutUwbPrivileged() {
try {
mUwbManager.getAllServiceProfiles();
@@ -301,6 +316,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetAdfProvisioningAuthoritiesWithoutUwbPrivileged() {
try {
mUwbManager.getAdfProvisioningAuthorities(new PersistableBundle());
@@ -313,6 +329,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetAdfCertificateInfoWithoutUwbPrivileged() {
try {
mUwbManager.getAdfCertificateInfo(new PersistableBundle());
@@ -325,6 +342,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testGetChipInfosWithoutUwbPrivileged() {
try {
mUwbManager.getChipInfos();
@@ -337,6 +355,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testSendVendorUciWithoutUwbPrivileged() {
try {
mUwbManager.sendVendorUciMessage(10, 0, new byte[0]);
@@ -372,6 +391,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testProvisionProfileAdfByScriptWithoutUwbPrivileged() {
CountDownLatch countDownLatch = new CountDownLatch(1);
AdfProvisionStateCallback adfProvisionStateCallback =
@@ -390,6 +410,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testRemoveProfileAdfWithoutUwbPrivileged() {
try {
mUwbManager.removeProfileAdf(new PersistableBundle());
@@ -434,6 +455,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testRegisterVendorUciCallbackWithoutUwbPrivileged() {
UwbManager.UwbVendorUciCallback cb =
new UwbVendorUciCallback(new CountDownLatch(1), new CountDownLatch(1));
@@ -449,6 +471,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testUnregisterVendorUciCallbackWithoutUwbPrivileged() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
UwbManager.UwbVendorUciCallback cb =
@@ -474,6 +497,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testInvalidCallbackUnregisterVendorUciCallback() {
UwbManager.UwbVendorUciCallback cb =
new UwbVendorUciCallback(new CountDownLatch(1), new CountDownLatch(1));
@@ -564,6 +588,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithInvalidChipId() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CountDownLatch countDownLatch = new CountDownLatch(1);
@@ -583,6 +608,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithChipIdWithBadParams() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CancellationSignal cancellationSignal = null;
@@ -610,6 +636,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithInvalidChipIdWithBadParams() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CancellationSignal cancellationSignal = null;
@@ -640,6 +667,7 @@
* Simulates the app holding UWB_RANGING permission, but not UWB_PRIVILEGED.
*/
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithoutUwbPrivileged() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -659,6 +687,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithChipIdWithoutUwbPrivileged() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -682,6 +711,7 @@
* Simulates the app holding UWB_PRIVILEGED permission, but not UWB_RANGING.
*/
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithoutUwbRanging() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -701,6 +731,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testOpenRangingSessionWithChipIdWithoutUwbRanging() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -752,6 +783,7 @@
* the proxied app not holding UWB_RANGING permission.
*/
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2,C-1-5"})
public void testOpenRangingSessionWithoutUwbRangingInNextAttributeSource() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -776,6 +808,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2,C-1-5"})
public void testOpenRangingSessionWithChipIdWithoutUwbRangingInNextAttributeSource() {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -801,6 +834,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2,C-1-5"})
public void testFiraRangingSession() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CancellationSignal cancellationSignal = null;
@@ -894,6 +928,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2,C-1-4"})
public void testUwbStateToggle() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try {
@@ -910,6 +945,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testSendVendorUciMessage() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CountDownLatch rspCountDownLatch = new CountDownLatch(1);
@@ -943,6 +979,7 @@
}
@Test
+ @CddTest(requirements = {"7.3.13/C-1-1,C-1-2"})
public void testSendVendorUciMessageWithFragmentedPackets() throws Exception {
UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
CountDownLatch rspCountDownLatch = new CountDownLatch(1);
diff --git a/tools/cts-tradefed/res/config/cts-known-failures.xml b/tools/cts-tradefed/res/config/cts-known-failures.xml
index d785d96..8eac1ed 100644
--- a/tools/cts-tradefed/res/config/cts-known-failures.xml
+++ b/tools/cts-tradefed/res/config/cts-known-failures.xml
@@ -286,4 +286,7 @@
<option name="compatibility:exclude-filter" value="CtsGraphicsTestCases android.graphics.cts.ImageDecoderTest#testDecode10BitHeifWithLowRam" />
<option name="compatibility:exclude-filter" value="CtsGraphicsTestCases[instant] android.graphics.cts.ImageDecoderTest#testDecode10BitHeifWithLowRam" />
+ <!-- b/223402586 -->
+ <option name="compatibility:exclude-filter" value="CtsAppCompatHostTestCases com.android.cts.appcompat.CompatChangesValidConfigTest#testOnlyAllowedlistedChangesAreOverridable" />
+
</configuration>